/ Hex Artifact Content
Login

Artifact d178bd7c8117f5f47694da9a0d5f336e85528180:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 0a 2a 2a    ROLLBACK.**.**
02d0: 20 24 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20   $Id: build.c,v 
02e0: 31 2e 34 31 37 20 32 30 30 37 2f 30 33 2f 32 37  1.417 2007/03/27
02f0: 20 31 33 3a 33 36 3a 33 37 20 64 72 68 20 45 78   13:36:37 drh Ex
0300: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0310: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
0320: 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e  nclude <ctype.h>
0330: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
0340: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
0350: 68 65 6e 20 61 20 6e 65 77 20 53 51 4c 20 73 74  hen a new SQL st
0360: 61 74 65 6d 65 6e 74 20 69 73 20 62 65 67 69 6e  atement is begin
0370: 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 70 61  ning to.** be pa
0380: 72 73 65 64 2e 20 20 49 6e 69 74 69 61 6c 69 7a  rsed.  Initializ
0390: 65 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  e the pParse str
03a0: 75 63 74 75 72 65 20 61 73 20 6e 65 65 64 65 64  ucture as needed
03b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
03c0: 33 42 65 67 69 6e 50 61 72 73 65 28 50 61 72 73  3BeginParse(Pars
03d0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65  e *pParse, int e
03e0: 78 70 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 70  xplainFlag){.  p
03f0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 3d  Parse->explain =
0400: 20 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a 20 20   explainFlag;.  
0410: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30  pParse->nVar = 0
0420: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
0430: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0440: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20  CACHE./*.** The 
0450: 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63 74  TableLock struct
0460: 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ure is only used
0470: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 54   by the sqlite3T
0480: 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a 2a  ableLock() and.*
0490: 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73  * codeTableLocks
04a0: 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f  () functions..*/
04b0: 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f 63  .struct TableLoc
04c0: 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  k {.  int iDb;  
04d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
04e0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
04f0: 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  ining the table 
0500: 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a  to be locked */.
0510: 20 20 69 6e 74 20 69 54 61 62 3b 20 20 20 20 20    int iTab;     
0520: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f         /* The ro
0530: 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 74  ot page of the t
0540: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0550: 64 20 2a 2f 0a 20 20 75 38 20 69 73 57 72 69 74  d */.  u8 isWrit
0560: 65 4c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20 54  eLock;      /* T
0570: 72 75 65 20 66 6f 72 20 77 72 69 74 65 20 6c 6f  rue for write lo
0580: 63 6b 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 61  ck.  False for a
0590: 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20   read lock */.  
05a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
05b0: 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e;   /* Name of 
05c0: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 7d 3b 0a  the table */.};.
05d0: 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68  ./*.** Record th
05e0: 65 20 66 61 63 74 20 74 68 61 74 20 77 65 20 77  e fact that we w
05f0: 61 6e 74 20 74 6f 20 6c 6f 63 6b 20 61 20 74 61  ant to lock a ta
0600: 62 6c 65 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e  ble at run-time.
0610: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62    .**.** The tab
0620: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
0630: 68 61 73 20 72 6f 6f 74 20 70 61 67 65 20 69 54  has root page iT
0640: 61 62 20 61 6e 64 20 69 73 20 66 6f 75 6e 64 20  ab and is found 
0650: 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  in database iDb.
0660: 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 61 20  .** A read or a 
0670: 77 72 69 74 65 20 6c 6f 63 6b 20 63 61 6e 20 62  write lock can b
0680: 65 20 74 61 6b 65 6e 20 64 65 70 65 6e 64 69 6e  e taken dependin
0690: 67 20 6f 6e 20 69 73 57 72 69 74 65 6c 6f 63 6b  g on isWritelock
06a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
06b0: 74 69 6e 65 20 6a 75 73 74 20 72 65 63 6f 72 64  tine just record
06c0: 73 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  s the fact that 
06d0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 65 73 69  the lock is desi
06e0: 72 65 64 2e 20 20 54 68 65 0a 2a 2a 20 63 6f 64  red.  The.** cod
06f0: 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6c 6f  e to make the lo
0700: 63 6b 20 6f 63 63 75 72 20 69 73 20 67 65 6e 65  ck occur is gene
0710: 72 61 74 65 64 20 62 79 20 61 20 6c 61 74 65 72  rated by a later
0720: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 63 6f 64 65   call to.** code
0730: 54 61 62 6c 65 4c 6f 63 6b 73 28 29 20 77 68 69  TableLocks() whi
0740: 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  ch occurs during
0750: 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f   sqlite3FinishCo
0760: 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  ding()..*/.void 
0770: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0780: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
0790: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
07a0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
07b0: 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20 20  nt iDb,         
07c0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
07d0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
07e0: 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  ining the table 
07f0: 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74  to lock */.  int
0800: 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20   iTab,          
0810: 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6e 75 6d  /* Root page num
0820: 62 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ber of the table
0830: 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
0840: 0a 20 20 75 38 20 69 73 57 72 69 74 65 4c 6f 63  .  u8 isWriteLoc
0850: 6b 2c 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f  k,    /* True fo
0860: 72 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 2a  r a write lock *
0870: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
0880: 7a 4e 61 6d 65 20 20 2f 2a 20 4e 61 6d 65 20 6f  zName  /* Name o
0890: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
08a0: 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 29 7b 0a 20  e locked */.){. 
08b0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42   int i;.  int nB
08c0: 79 74 65 73 3b 0a 20 20 54 61 62 6c 65 4c 6f 63  ytes;.  TableLoc
08d0: 6b 20 2a 70 3b 0a 0a 20 20 69 66 28 20 30 3d 3d  k *p;..  if( 0==
08e0: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
08f0: 61 52 65 61 64 4f 6e 6c 79 28 29 2d 3e 75 73 65  aReadOnly()->use
0900: 53 68 61 72 65 64 44 61 74 61 20 7c 7c 20 69 44  SharedData || iD
0910: 62 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  b<0 ){.    retur
0920: 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d  n;.  }..  for(i=
0930: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 61  0; i<pParse->nTa
0940: 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20  bleLock; i++){. 
0950: 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e     p = &pParse->
0960: 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20  aTableLock[i];. 
0970: 20 20 20 69 66 28 20 70 2d 3e 69 44 62 3d 3d 69     if( p->iDb==i
0980: 44 62 20 26 26 20 70 2d 3e 69 54 61 62 3d 3d 69  Db && p->iTab==i
0990: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Tab ){.      p->
09a0: 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 28 70  isWriteLock = (p
09b0: 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 7c 7c  ->isWriteLock ||
09c0: 20 69 73 57 72 69 74 65 4c 6f 63 6b 29 3b 0a 20   isWriteLock);. 
09d0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
09e0: 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42 79 74 65 73   }.  }..  nBytes
09f0: 20 3d 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 4c   = sizeof(TableL
0a00: 6f 63 6b 29 20 2a 20 28 70 50 61 72 73 65 2d 3e  ock) * (pParse->
0a10: 6e 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20  nTableLock+1);. 
0a20: 20 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c   pParse->aTableL
0a30: 6f 63 6b 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  ock = sqliteReal
0a40: 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73 65  locOrFree(pParse
0a50: 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42  ->aTableLock, nB
0a60: 79 74 65 73 29 3b 0a 20 20 69 66 28 20 70 50 61  ytes);.  if( pPa
0a70: 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20  rse->aTableLock 
0a80: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72  ){.    p = &pPar
0a90: 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 70  se->aTableLock[p
0aa0: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
0ab0: 6b 2b 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62  k++];.    p->iDb
0ac0: 20 3d 20 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69   = iDb;.    p->i
0ad0: 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  Tab = iTab;.    
0ae0: 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d  p->isWriteLock =
0af0: 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20   isWriteLock;.  
0b00: 20 20 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61    p->zName = zNa
0b10: 6d 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  me;.  }.}../*.**
0b20: 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 61 62 6c   Code an OP_Tabl
0b30: 65 4c 6f 63 6b 20 69 6e 73 74 72 75 63 74 69 6f  eLock instructio
0b40: 6e 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  n for each table
0b50: 20 6c 6f 63 6b 65 64 20 62 79 20 74 68 65 0a 2a   locked by the.*
0b60: 2a 20 73 74 61 74 65 6d 65 6e 74 20 28 63 6f 6e  * statement (con
0b70: 66 69 67 75 72 65 64 20 62 79 20 63 61 6c 6c 73  figured by calls
0b80: 20 74 6f 20 73 71 6c 69 74 65 33 54 61 62 6c 65   to sqlite3Table
0b90: 4c 6f 63 6b 28 29 29 2e 0a 2a 2f 0a 73 74 61 74  Lock())..*/.stat
0ba0: 69 63 20 76 6f 69 64 20 63 6f 64 65 54 61 62 6c  ic void codeTabl
0bb0: 65 4c 6f 63 6b 73 28 50 61 72 73 65 20 2a 70 50  eLocks(Parse *pP
0bc0: 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  arse){.  int i;.
0bd0: 20 20 56 64 62 65 20 2a 70 56 64 62 65 3b 20 0a    Vdbe *pVdbe; .
0be0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
0bf0: 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f  3ThreadDataReadO
0c00: 6e 6c 79 28 29 2d 3e 75 73 65 53 68 61 72 65 64  nly()->useShared
0c10: 44 61 74 61 20 7c 7c 20 70 50 61 72 73 65 2d 3e  Data || pParse->
0c20: 6e 54 61 62 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b  nTableLock==0 );
0c30: 0a 0a 20 20 69 66 28 20 30 3d 3d 28 70 56 64 62  ..  if( 0==(pVdb
0c40: 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  e = sqlite3GetVd
0c50: 62 65 28 70 50 61 72 73 65 29 29 20 29 7b 0a 20  be(pParse)) ){. 
0c60: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
0c70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
0c80: 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b  rse->nTableLock;
0c90: 20 69 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65   i++){.    Table
0ca0: 4c 6f 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73  Lock *p = &pPars
0cb0: 65 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d  e->aTableLock[i]
0cc0: 3b 0a 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70  ;.    int p1 = p
0cd0: 2d 3e 69 44 62 3b 0a 20 20 20 20 69 66 28 20 70  ->iDb;.    if( p
0ce0: 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 29 7b  ->isWriteLock ){
0cf0: 0a 20 20 20 20 20 20 70 31 20 3d 20 2d 31 2a 28  .      p1 = -1*(
0d00: 70 31 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  p1+1);.    }.   
0d10: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
0d20: 70 56 64 62 65 2c 20 4f 50 5f 54 61 62 6c 65 4c  pVdbe, OP_TableL
0d30: 6f 63 6b 2c 20 70 31 2c 20 70 2d 3e 69 54 61 62  ock, p1, p->iTab
0d40: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  , p->zName, P3_S
0d50: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0d60: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0d70: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0d80: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
0d90: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
0da0: 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69 6e  lled after a sin
0db0: 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  gle SQL statemen
0dc0: 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61  t has been.** pa
0dd0: 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45 20  rsed and a VDBE 
0de0: 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63 75  program to execu
0df0: 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e  te that statemen
0e00: 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72  t has been.** pr
0e10: 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72 6f  epared.  This ro
0e20: 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20 66  utine puts the f
0e30: 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65 73  inishing touches
0e40: 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 20   on the.** VDBE 
0e50: 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73 65  program and rese
0e60: 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73 74  ts the pParse st
0e70: 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20  ructure for the 
0e80: 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a  next.** parse..*
0e90: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
0ea0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
0eb0: 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62 65  red, it might be
0ec0: 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a   the case that.*
0ed0: 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20 77  * no VDBE code w
0ee0: 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f  as generated..*/
0ef0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69 6e  .void sqlite3Fin
0f00: 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65 20  ishCoding(Parse 
0f10: 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
0f20: 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  te3 *db;.  Vdbe 
0f30: 2a 76 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  *v;..  if( sqlit
0f40: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
0f50: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
0f60: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20   pParse->nested 
0f70: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
0f80: 21 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29  !pParse->pVdbe )
0f90: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  {.    if( pParse
0fa0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
0fb0: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  && pParse->nErr 
0fc0: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
0fd0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52  >rc = SQLITE_ERR
0fe0: 4f 52 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  OR;.      return
0ff0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1000: 2a 20 42 65 67 69 6e 20 62 79 20 67 65 6e 65 72  * Begin by gener
1010: 61 74 69 6e 67 20 73 6f 6d 65 20 74 65 72 6d 69  ating some termi
1020: 6e 61 74 69 6f 6e 20 63 6f 64 65 20 61 74 20 74  nation code at t
1030: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20  he end of the.  
1040: 2a 2a 20 76 64 62 65 20 70 72 6f 67 72 61 6d 0a  ** vdbe program.
1050: 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72    */.  db = pPar
1060: 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 73 71  se->db;.  v = sq
1070: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1080: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
1090: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 48 61 6c 74  AddOp(v, OP_Halt
10b0: 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  , 0, 0);..    /*
10c0: 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b   The cookie mask
10d0: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69   contains one bi
10e0: 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62  t for each datab
10f0: 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20  ase file open.. 
1100: 20 20 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20     ** (Bit 0 is 
1110: 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20  for main, bit 1 
1120: 69 73 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64  is for temp, and
1130: 20 73 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74   so forth.)  Bit
1140: 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74  s are.    ** set
1150: 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61   for each databa
1160: 73 65 20 74 68 61 74 20 69 73 20 75 73 65 64 2e  se that is used.
1170: 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20    Generate code 
1180: 74 6f 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a  to start a.    *
1190: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  * transaction on
11a0: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
11b0: 61 73 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66  ase and to verif
11c0: 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  y the schema coo
11d0: 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61  kie.    ** on ea
11e0: 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65  ch used database
11f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1200: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
1210: 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 75  oto>0 ){.      u
1220: 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69  32 mask;.      i
1230: 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 73 71  nt iDb;.      sq
1240: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
1250: 65 28 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  e(v, pParse->coo
1260: 6b 69 65 47 6f 74 6f 2d 31 29 3b 0a 20 20 20 20  kieGoto-1);.    
1270: 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73    for(iDb=0, mas
1280: 6b 3d 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62  k=1; iDb<db->nDb
1290: 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b  ; mask<<=1, iDb+
12a0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
12b0: 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e  (mask & pParse->
12c0: 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29  cookieMask)==0 )
12d0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
12e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12f0: 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61  dOp(v, OP_Transa
1300: 63 74 69 6f 6e 2c 20 69 44 62 2c 20 28 6d 61 73  ction, iDb, (mas
1310: 6b 20 26 20 70 50 61 72 73 65 2d 3e 77 72 69 74  k & pParse->writ
1320: 65 4d 61 73 6b 29 21 3d 30 29 3b 0a 20 20 20 20  eMask)!=0);.    
1330: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1340: 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69 66  ddOp(v, OP_Verif
1350: 79 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 70 50  yCookie, iDb, pP
1360: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75  arse->cookieValu
1370: 65 5b 69 44 62 5d 29 3b 0a 20 20 20 20 20 20 7d  e[iDb]);.      }
1380: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1390: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
13a0: 45 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  E.      if( pPar
13b0: 73 65 2d 3e 70 56 69 72 74 75 61 6c 4c 6f 63 6b  se->pVirtualLock
13c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
13d0: 20 2a 76 74 61 62 20 3d 20 28 63 68 61 72 20 2a   *vtab = (char *
13e0: 29 70 50 61 72 73 65 2d 3e 70 56 69 72 74 75 61  )pParse->pVirtua
13f0: 6c 4c 6f 63 6b 2d 3e 70 56 74 61 62 3b 0a 20 20  lLock->pVtab;.  
1400: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1410: 65 4f 70 33 28 76 2c 20 4f 50 5f 56 42 65 67 69  eOp3(v, OP_VBegi
1420: 6e 2c 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50  n, 0, 0, vtab, P
1430: 33 5f 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d  3_VTAB);.      }
1440: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f  .#endif..      /
1450: 2a 20 4f 6e 63 65 20 61 6c 6c 20 74 68 65 20 63  * Once all the c
1460: 6f 6f 6b 69 65 73 20 68 61 76 65 20 62 65 65 6e  ookies have been
1470: 20 76 65 72 69 66 69 65 64 20 61 6e 64 20 74 72   verified and tr
1480: 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 65  ansactions opene
1490: 64 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74  d, .      ** obt
14a0: 61 69 6e 20 74 68 65 20 72 65 71 75 69 72 65 64  ain the required
14b0: 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68   table-locks. Th
14c0: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e  is is a no-op un
14d0: 6c 65 73 73 20 74 68 65 20 0a 20 20 20 20 20 20  less the .      
14e0: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
14f0: 66 65 61 74 75 72 65 20 69 73 20 65 6e 61 62 6c  feature is enabl
1500: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
1510: 20 20 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b     codeTableLock
1520: 73 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  s(pParse);.     
1530: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1540: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
1550: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
1560: 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  oto);.    }..#if
1570: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1580: 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 41 64  _TRACE.    /* Ad
1590: 64 20 61 20 4e 6f 2d 6f 70 20 74 68 61 74 20 63  d a No-op that c
15a0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6d 70  ontains the comp
15b0: 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
15c0: 20 63 6f 6d 70 69 6c 65 64 20 53 51 4c 0a 20 20   compiled SQL.  
15d0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 61    ** statement a
15e0: 73 20 69 74 73 20 50 33 20 61 72 67 75 6d 65 6e  s its P3 argumen
15f0: 74 2e 20 20 54 68 69 73 20 64 6f 65 73 20 6e 6f  t.  This does no
1600: 74 20 63 68 61 6e 67 65 20 74 68 65 20 66 75 6e  t change the fun
1610: 63 74 69 6f 6e 61 6c 69 74 79 0a 20 20 20 20 2a  ctionality.    *
1620: 2a 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d  * of the program
1630: 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
1640: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
1650: 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74   implement sqlit
1660: 65 33 5f 74 72 61 63 65 28 29 2e 0a 20 20 20 20  e3_trace()..    
1670: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
1680: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 6f 70  beOp3(v, OP_Noop
1690: 2c 20 30 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e  , 0, 0, pParse->
16a0: 7a 53 71 6c 2c 20 70 50 61 72 73 65 2d 3e 7a 54  zSql, pParse->zT
16b0: 61 69 6c 2d 70 50 61 72 73 65 2d 3e 7a 53 71 6c  ail-pParse->zSql
16c0: 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
16d0: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a  ITE_OMIT_TRACE *
16e0: 2f 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65 74  /.  }...  /* Get
16f0: 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61   the VDBE progra
1700: 6d 20 72 65 61 64 79 20 66 6f 72 20 65 78 65 63  m ready for exec
1710: 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66 28  ution.  */.  if(
1720: 20 76 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45   v && pParse->nE
1730: 72 72 3d 3d 30 20 26 26 20 21 73 71 6c 69 74 65  rr==0 && !sqlite
1740: 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
1750: 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 74 72 61  ){.    FILE *tra
1760: 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  ce = (db->flags 
1770: 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61  & SQLITE_VdbeTra
1780: 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74 20  ce)!=0 ? stdout 
1790: 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  : 0;.    sqlite3
17a0: 56 64 62 65 54 72 61 63 65 28 76 2c 20 74 72 61  VdbeTrace(v, tra
17b0: 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ce);.    sqlite3
17c0: 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 76 2c  VdbeMakeReady(v,
17d0: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 70   pParse->nVar, p
17e0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 33 2c 0a 20  Parse->nMem+3,. 
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1800: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
1810: 6e 54 61 62 2b 33 2c 20 70 50 61 72 73 65 2d 3e  nTab+3, pParse->
1820: 65 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 70 50  explain);.    pP
1830: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
1840: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72  E_DONE;.    pPar
1850: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
1860: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
1870: 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c   pParse->rc==SQL
1880: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
1890: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
18a0: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  E_ERROR;.  }.  p
18b0: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b  Parse->nTab = 0;
18c0: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
18d0: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
18e0: 53 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Set = 0;.  pPars
18f0: 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70  e->nVar = 0;.  p
1900: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73  Parse->cookieMas
1910: 6b 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  k = 0;.  pParse-
1920: 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b  >cookieGoto = 0;
1930: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68  .}../*.** Run th
1940: 65 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64  e parser and cod
1950: 65 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75  e generator recu
1960: 72 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72  rsively in order
1970: 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20   to generate.** 
1980: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c  code for the SQL
1990: 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e   statement given
19a0: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
19b0: 20 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74   the pParse cont
19c0: 65 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  ext.** currently
19d0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
19e0: 69 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70  ion.  When the p
19f0: 61 72 73 65 72 20 69 73 20 72 75 6e 20 72 65 63  arser is run rec
1a00: 75 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73  ursively.** this
1a10: 20 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20   way, the final 
1a20: 4f 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61  OP_Halt is not a
1a30: 70 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65  ppended and othe
1a40: 72 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  r initialization
1a50: 0a 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61  .** and finaliza
1a60: 74 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f  tion steps are o
1a70: 6d 69 74 74 65 64 20 62 65 63 61 75 73 65 20 74  mitted because t
1a80: 68 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e  hose are handlin
1a90: 67 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65  g by the.** oute
1aa0: 72 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a  rmost parser..**
1ab0: 0a 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69  .** Not everythi
1ac0: 6e 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20  ng is nestable. 
1ad0: 20 54 68 69 73 20 66 61 63 69 6c 69 74 79 20 69   This facility i
1ae0: 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65  s designed to pe
1af0: 72 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20  rmit.** INSERT, 
1b00: 55 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45  UPDATE, and DELE
1b10: 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67  TE operations ag
1b20: 61 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53  ainst SQLITE_MAS
1b30: 54 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72  TER.  Use.** car
1b40: 65 20 69 66 20 79 6f 75 20 64 65 63 69 64 65 20  e if you decide 
1b50: 74 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  to try to use th
1b60: 69 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73  is routine for s
1b70: 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73  ome other purpos
1b80: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
1b90: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 50  te3NestedParse(P
1ba0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
1bb0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
1bc0: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
1bd0: 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a  st ap;.  char *z
1be0: 53 71 6c 3b 0a 23 20 64 65 66 69 6e 65 20 53 41  Sql;.# define SA
1bf0: 56 45 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28 50  VE_SZ  (sizeof(P
1c00: 61 72 73 65 29 20 2d 20 6f 66 66 73 65 74 6f 66  arse) - offsetof
1c10: 28 50 61 72 73 65 2c 6e 56 61 72 29 29 0a 20 20  (Parse,nVar)).  
1c20: 63 68 61 72 20 73 61 76 65 42 75 66 5b 53 41 56  char saveBuf[SAV
1c30: 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50  E_SZ];..  if( pP
1c40: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
1c50: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
1c60: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30  Parse->nested<10
1c70: 20 29 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20   );  /* Nesting 
1c80: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f  should only be o
1c90: 66 20 6c 69 6d 69 74 65 64 20 64 65 70 74 68 20  f limited depth 
1ca0: 2a 2f 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  */.  va_start(ap
1cb0: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53  , zFormat);.  zS
1cc0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  ql = sqlite3VMPr
1cd0: 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70  intf(zFormat, ap
1ce0: 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
1cf0: 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
1d00: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20  {.    return;   
1d10: 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74  /* A malloc must
1d20: 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a   have failed */.
1d30: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65    }.  pParse->ne
1d40: 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79  sted++;.  memcpy
1d50: 28 73 61 76 65 42 75 66 2c 20 26 70 50 61 72 73  (saveBuf, &pPars
1d60: 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45 5f 53 5a  e->nVar, SAVE_SZ
1d70: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61  );.  memset(&pPa
1d80: 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c 20 53 41  rse->nVar, 0, SA
1d90: 56 45 5f 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65  VE_SZ);.  sqlite
1da0: 33 52 75 6e 50 61 72 73 65 72 28 70 50 61 72 73  3RunParser(pPars
1db0: 65 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 73  e, zSql, 0);.  s
1dc0: 71 6c 69 74 65 46 72 65 65 28 7a 53 71 6c 29 3b  qliteFree(zSql);
1dd0: 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61 72 73  .  memcpy(&pPars
1de0: 65 2d 3e 6e 56 61 72 2c 20 73 61 76 65 42 75 66  e->nVar, saveBuf
1df0: 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50  , SAVE_SZ);.  pP
1e00: 61 72 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a  arse->nested--;.
1e10: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
1e20: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
1e30: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
1e40: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
1e50: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
1e60: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
1e70: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
1e80: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
1e90: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
1ea0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
1eb0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
1ec0: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
1ed0: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
1ee0: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
1ef0: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
1f00: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
1f10: 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62  ched for the tab
1f20: 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69  le and the.** fi
1f30: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62  rst matching tab
1f40: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  le is returned. 
1f50: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f   (No checking fo
1f60: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
1f70: 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f  e.** names is do
1f80: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
1f90: 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66   order is TEMP f
1fa0: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
1fb0: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78   then any.** aux
1fc0: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
1fd0: 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65   added using the
1fe0: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
1ff0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
2000: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
2010: 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  le()..*/.Table *
2020: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
2030: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
2040: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
2050: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
2060: 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  tabase){.  Table
2070: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
2080: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d  ;.  assert( zNam
2090: 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  e!=0 );.  for(i=
20a0: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
20b0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
20c0: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
20d0: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20  ? i^1 : i;   /* 
20e0: 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f  Search TEMP befo
20f0: 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69  re MAIN */.    i
2100: 66 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20  f( zDatabase!=0 
2110: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2120: 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d  p(zDatabase, db-
2130: 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29  >aDb[j].zName) )
2140: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
2150: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
2160: 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70  nd(&db->aDb[j].p
2170: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
2180: 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a   zName, strlen(z
2190: 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 69 66  Name)+1);.    if
21a0: 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ( p ) break;.  }
21b0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
21c0: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
21d0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
21e0: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
21f0: 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72  bes a particular
2200: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62   database.** tab
2210: 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  le given the nam
2220: 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20  e of that table 
2230: 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29  and (optionally)
2240: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
2250: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
2260: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c  taining the tabl
2270: 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  e.  Return NULL 
2280: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41  if not found.  A
2290: 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20  lso leave an.** 
22a0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
22b0: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
22c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
22d0: 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
22e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20  his routine and 
22f0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
2300: 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a  () is that this.
2310: 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61 76 65  ** routine leave
2320: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
2330: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
2340: 72 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20 73  rrMsg where.** s
2350: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2360: 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54  ) does not..*/.T
2370: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63  able *sqlite3Loc
2380: 61 74 65 54 61 62 6c 65 28 50 61 72 73 65 20 2a  ateTable(Parse *
2390: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
23a0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74  ar *zName, const
23b0: 20 63 68 61 72 20 2a 7a 44 62 61 73 65 29 7b 0a   char *zDbase){.
23c0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f    Table *p;..  /
23d0: 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
23e0: 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
23f0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2400: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
2410: 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
2420: 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
2430: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
2440: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
2450: 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
2460: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
2470: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2480: 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   }..  p = sqlite
2490: 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
24a0: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44  e->db, zName, zD
24b0: 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  base);.  if( p==
24c0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 62  0 ){.    if( zDb
24d0: 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ase ){.      sql
24e0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
24f0: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
2500: 62 6c 65 3a 20 25 73 2e 25 73 22 2c 20 7a 44 62  ble: %s.%s", zDb
2510: 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ase, zName);.   
2520: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
2530: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2540: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
2550: 61 62 6c 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65  able: %s", zName
2560: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
2570: 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
2580: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
2590: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn p;.}../*.** L
25a0: 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ocate the in-mem
25b0: 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68  ory structure th
25c0: 61 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a  at describes .**
25d0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e   a particular in
25e0: 64 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61  dex given the na
25f0: 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78  me of that index
2600: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65  .** and the name
2610: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2620: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
2630: 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74  he index..** Ret
2640: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
2650: 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  found..**.** If 
2660: 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20  zDatabase is 0, 
2670: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72  all databases ar
2680: 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
2690: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  he.** table and 
26a0: 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69  the first matchi
26b0: 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65 74 75  ng index is retu
26c0: 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b  rned.  (No check
26d0: 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69  ing.** for dupli
26e0: 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73  cate index names
26f0: 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20   is done.)  The 
2700: 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a  search order is.
2710: 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74  ** TEMP first, t
2720: 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61  hen MAIN, then a
2730: 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ny auxiliary dat
2740: 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20  abases added.** 
2750: 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48  using the ATTACH
2760: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64   command..*/.Ind
2770: 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49  ex *sqlite3FindI
2780: 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62  ndex(sqlite3 *db
2790: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
27a0: 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
27b0: 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a  *zDb){.  Index *
27c0: 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  p = 0;.  int i;.
27d0: 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d    for(i=OMIT_TEM
27e0: 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  PDB; i<db->nDb; 
27f0: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20  i++){.    int j 
2800: 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20  = (i<2) ? i^1 : 
2810: 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45  i;  /* Search TE
2820: 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a  MP before MAIN *
2830: 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53  /.    Schema *pS
2840: 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
2850: 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  j].pSchema;.    
2860: 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74  if( zDb && sqlit
2870: 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64  e3StrICmp(zDb, d
2880: 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29  b->aDb[j].zName)
2890: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
28a0: 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d 61   assert( pSchema
28b0: 20 7c 7c 20 28 6a 3d 3d 31 20 26 26 20 21 64 62   || (j==1 && !db
28c0: 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 20 29 3b  ->aDb[1].pBt) );
28d0: 0a 20 20 20 20 69 66 28 20 70 53 63 68 65 6d 61  .    if( pSchema
28e0: 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 73 71   ){.      p = sq
28f0: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70  lite3HashFind(&p
2900: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c  Schema->idxHash,
2910: 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a   zName, strlen(z
2920: 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 7d 0a  Name)+1);.    }.
2930: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
2940: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
2950: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c  p;.}../*.** Recl
2960: 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75  aim the memory u
2970: 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a  sed by an index.
2980: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2990: 72 65 65 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  reeIndex(Index *
29a0: 70 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  p){.  sqliteFree
29b0: 28 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20  (p->zColAff);.  
29c0: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d  sqliteFree(p);.}
29d0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
29e0: 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66  he given index f
29f0: 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68 61  rom the index ha
2a00: 73 68 20 74 61 62 6c 65 2c 20 61 6e 64 20 66 72  sh table, and fr
2a10: 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f 72 79  ee.** its memory
2a20: 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a   structures..**.
2a30: 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  ** The index is 
2a40: 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
2a50: 20 64 61 74 61 62 61 73 65 20 68 61 73 68 20 74   database hash t
2a60: 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20 69 74 20  ables but.** it 
2a70: 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20  is not unlinked 
2a80: 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 74  from the Table t
2a90: 68 61 74 20 69 74 20 69 6e 64 65 78 65 73 2e 0a  hat it indexes..
2aa0: 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f  ** Unlinking fro
2ab0: 6d 20 74 68 65 20 54 61 62 6c 65 20 6d 75 73 74  m the Table must
2ac0: 20 62 65 20 64 6f 6e 65 20 62 79 20 74 68 65 20   be done by the 
2ad0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
2ae0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2af0: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e 64   sqliteDeleteInd
2b00: 65 78 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ex(Index *p){.  
2b10: 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 20 20 63  Index *pOld;.  c
2b20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
2b30: 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20   = p->zName;..  
2b40: 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61  pOld = sqlite3Ha
2b50: 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63  shInsert(&p->pSc
2b60: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a  hema->idxHash, z
2b70: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 20 7a 4e  Name, strlen( zN
2b80: 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 61 73  ame)+1, 0);.  as
2b90: 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c  sert( pOld==0 ||
2ba0: 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 72   pOld==p );.  fr
2bb0: 65 65 49 6e 64 65 78 28 70 29 3b 0a 7d 0a 0a 2f  eeIndex(p);.}../
2bc0: 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64  *.** For the ind
2bd0: 65 78 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61  ex called zIdxNa
2be0: 6d 65 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e  me which is foun
2bf0: 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
2c00: 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65  e iDb,.** unlike
2c10: 20 74 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d   that index from
2c20: 20 69 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20   its Table then 
2c30: 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78  remove the index
2c40: 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64   from.** the ind
2c50: 65 78 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e  ex hash table an
2c60: 64 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72  d free all memor
2c70: 79 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73  y structures ass
2c80: 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
2c90: 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f  the index..*/.vo
2ca0: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
2cb0: 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73  AndDeleteIndex(s
2cc0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
2cd0: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
2ce0: 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e  *zIdxName){.  In
2cf0: 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 69  dex *pIndex;.  i
2d00: 6e 74 20 6c 65 6e 3b 0a 20 20 48 61 73 68 20 2a  nt len;.  Hash *
2d10: 70 48 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62  pHash = &db->aDb
2d20: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69  [iDb].pSchema->i
2d30: 64 78 48 61 73 68 3b 0a 0a 20 20 6c 65 6e 20 3d  dxHash;..  len =
2d40: 20 73 74 72 6c 65 6e 28 7a 49 64 78 4e 61 6d 65   strlen(zIdxName
2d50: 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  );.  pIndex = sq
2d60: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
2d70: 70 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c  pHash, zIdxName,
2d80: 20 6c 65 6e 2b 31 2c 20 30 29 3b 0a 20 20 69 66   len+1, 0);.  if
2d90: 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ( pIndex ){.    
2da0: 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  if( pIndex->pTab
2db0: 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64  le->pIndex==pInd
2dc0: 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64  ex ){.      pInd
2dd0: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
2de0: 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  ex = pIndex->pNe
2df0: 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
2e00: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20       Index *p;. 
2e10: 20 20 20 20 20 66 6f 72 28 70 3d 70 49 6e 64 65       for(p=pInde
2e20: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
2e30: 78 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74  x; p && p->pNext
2e40: 21 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70  !=pIndex; p=p->p
2e50: 4e 65 78 74 29 7b 7d 0a 20 20 20 20 20 20 69 66  Next){}.      if
2e60: 28 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d  ( p && p->pNext=
2e70: 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20  =pIndex ){.     
2e80: 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49     p->pNext = pI
2e90: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
2ea0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
2eb0: 72 65 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29  reeIndex(pIndex)
2ec0: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67  ;.  }.  db->flag
2ed0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
2ee0: 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a  rnChanges;.}../*
2ef0: 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63  .** Erase all sc
2f00: 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  hema information
2f10: 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d   from the in-mem
2f20: 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20  ory hash tables 
2f30: 6f 66 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 64  of.** a single d
2f40: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72  atabase.  This r
2f50: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2f60: 20 74 6f 20 72 65 63 6c 61 69 6d 20 6d 65 6d 6f   to reclaim memo
2f70: 72 79 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68 65  ry.** before the
2f80: 20 64 61 74 61 62 61 73 65 20 63 6c 6f 73 65 73   database closes
2f90: 2e 20 20 49 74 20 69 73 20 61 6c 73 6f 20 63 61  .  It is also ca
2fa0: 6c 6c 65 64 20 64 75 72 69 6e 67 20 61 20 72 6f  lled during a ro
2fb0: 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 74 68 65  llback.** if the
2fc0: 72 65 20 77 65 72 65 20 73 63 68 65 6d 61 20 63  re were schema c
2fd0: 68 61 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68  hanges during th
2fe0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72  e transaction or
2ff0: 20 69 66 20 61 0a 2a 2a 20 73 63 68 65 6d 61 2d   if a.** schema-
3000: 63 6f 6f 6b 69 65 20 6d 69 73 6d 61 74 63 68 20  cookie mismatch 
3010: 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  occurs..**.** If
3020: 20 69 44 62 3c 3d 30 20 74 68 65 6e 20 72 65 73   iDb<=0 then res
3030: 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  et the internal 
3040: 73 63 68 65 6d 61 20 74 61 62 6c 65 73 20 66 6f  schema tables fo
3050: 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a  r all database.*
3060: 2a 20 66 69 6c 65 73 2e 20 20 49 66 20 69 44 62  * files.  If iDb
3070: 3e 3d 32 20 74 68 65 6e 20 72 65 73 65 74 20 74  >=2 then reset t
3080: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
3090: 6d 61 20 66 6f 72 20 6f 6e 6c 79 20 74 68 65 0a  ma for only the.
30a0: 2a 2a 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 69  ** single file i
30b0: 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69  ndicated..*/.voi
30c0: 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e  d sqlite3ResetIn
30d0: 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c  ternalSchema(sql
30e0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
30f0: 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  b){.  int i, j;.
3100: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
3110: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
3120: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b   );.  for(i=iDb;
3130: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
3140: 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20  {.    Db *pDb = 
3150: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
3160: 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
3170: 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  a ){.      sqlit
3180: 65 33 53 63 68 65 6d 61 46 72 65 65 28 70 44 62  e3SchemaFree(pDb
3190: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
31a0: 7d 0a 20 20 20 20 69 66 28 20 69 44 62 3e 30 20  }.    if( iDb>0 
31b0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20  ) return;.  }.  
31c0: 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20 29  assert( iDb==0 )
31d0: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
31e0: 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43   ~SQLITE_InternC
31f0: 68 61 6e 67 65 73 3b 0a 0a 20 20 2f 2a 20 49 66  hanges;..  /* If
3200: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
3210: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
3220: 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 73  tabase files has
3230: 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20   been closed,.  
3240: 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74  ** then remove t
3250: 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 61 75 78  hem from the aux
3260: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
3270: 6c 69 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74  list.  We take t
3280: 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e  he.  ** opportun
3290: 69 74 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68  ity to do this h
32a0: 65 72 65 20 73 69 6e 63 65 20 77 65 20 68 61 76  ere since we hav
32b0: 65 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61  e just deleted a
32c0: 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73  ll of the.  ** s
32d0: 63 68 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65  chema hash table
32e0: 73 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20  s and therefore 
32f0: 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d  do not have to m
3300: 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a  ake any changes.
3310: 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74    ** to any of t
3320: 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a  hose tables..  *
3330: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  /.  for(i=0; i<d
3340: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
3350: 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62    struct Db *pDb
3360: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
3370: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
3380: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
3390: 20 70 44 62 2d 3e 70 41 75 78 20 26 26 20 70 44   pDb->pAux && pD
33a0: 62 2d 3e 78 46 72 65 65 41 75 78 20 29 20 70 44  b->xFreeAux ) pD
33b0: 62 2d 3e 78 46 72 65 65 41 75 78 28 70 44 62 2d  b->xFreeAux(pDb-
33c0: 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 70 44  >pAux);.      pD
33d0: 62 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20  b->pAux = 0;.   
33e0: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a   }.  }.  for(i=j
33f0: 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =2; i<db->nDb; i
3400: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
3410: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
3420: 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
3430: 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20  Db->pBt==0 ){.  
3440: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
3450: 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db->zName);.    
3460: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30    pDb->zName = 0
3470: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
3480: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3490: 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  j<i ){.      db-
34a0: 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44  >aDb[j] = db->aD
34b0: 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b[i];.    }.    
34c0: 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  j++;.  }.  memse
34d0: 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30  t(&db->aDb[j], 0
34e0: 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69  , (db->nDb-j)*si
34f0: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29  zeof(db->aDb[j])
3500: 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a  );.  db->nDb = j
3510: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c  ;.  if( db->nDb<
3520: 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64  =2 && db->aDb!=d
3530: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a  b->aDbStatic ){.
3540: 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61      memcpy(db->a
3550: 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44  DbStatic, db->aD
3560: 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b, 2*sizeof(db->
3570: 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71  aDb[0]));.    sq
3580: 6c 69 74 65 46 72 65 65 28 64 62 2d 3e 61 44 62  liteFree(db->aDb
3590: 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d  );.    db->aDb =
35a0: 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a   db->aDbStatic;.
35b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
35c0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
35d0: 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 20 72  led whenever a r
35e0: 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20  ollback occurs. 
35f0: 20 49 66 20 74 68 65 72 65 20 77 65 72 65 0a 2a   If there were.*
3600: 2a 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  * schema changes
3610: 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e   during the tran
3620: 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 77 65  saction, then we
3630: 20 68 61 76 65 20 74 6f 20 72 65 73 65 74 20 74   have to reset t
3640: 68 65 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68  he.** internal h
3650: 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 72  ash tables and r
3660: 65 6c 6f 61 64 20 74 68 65 6d 20 66 72 6f 6d 20  eload them from 
3670: 64 69 73 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  disk..*/.void sq
3680: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 49 6e 74  lite3RollbackInt
3690: 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c  ernalChanges(sql
36a0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28  ite3 *db){.  if(
36b0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
36c0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
36d0: 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  s ){.    sqlite3
36e0: 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
36f0: 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a  ema(db, 0);.  }.
3700: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
3710: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
3720: 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63  when a commit oc
3730: 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  curs..*/.void sq
3740: 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72  lite3CommitInter
3750: 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74  nalChanges(sqlit
3760: 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66  e3 *db){.  db->f
3770: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
3780: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d  InternChanges;.}
3790: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
37a0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
37b0: 72 6f 6d 20 61 20 74 61 62 6c 65 20 6f 72 20 76  rom a table or v
37c0: 69 65 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  iew..*/.static v
37d0: 6f 69 64 20 73 71 6c 69 74 65 52 65 73 65 74 43  oid sqliteResetC
37e0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65  olumnNames(Table
37f0: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74   *pTable){.  int
3800: 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43   i;.  Column *pC
3810: 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  ol;.  assert( pT
3820: 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28  able!=0 );.  if(
3830: 20 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d   (pCol = pTable-
3840: 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20  >aCol)!=0 ){.   
3850: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
3860: 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  le->nCol; i++, p
3870: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  Col++){.      sq
3880: 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a  liteFree(pCol->z
3890: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Name);.      sql
38a0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
38b0: 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20  Col->pDflt);.   
38c0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43     sqliteFree(pC
38d0: 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20  ol->zType);.    
38e0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f    sqliteFree(pCo
38f0: 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d  l->zColl);.    }
3900: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
3910: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20  pTable->aCol);. 
3920: 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f   }.  pTable->aCo
3930: 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d  l = 0;.  pTable-
3940: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  >nCol = 0;.}../*
3950: 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d  .** Remove the m
3960: 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63  emory data struc
3970: 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64  tures associated
3980: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a   with the given.
3990: 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68  ** Table.  No ch
39a0: 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74  anges are made t
39b0: 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72  o disk by this r
39c0: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
39d0: 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20  is routine just 
39e0: 64 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61  deletes the data
39f0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20   structure.  It 
3a00: 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a  does not unlink.
3a10: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74  ** the table dat
3a20: 61 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d  a structure from
3a30: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e   the hash table.
3a40: 20 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65    Nor does it re
3a50: 6d 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20  move.** foreign 
3a60: 6b 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71  keys from the sq
3a70: 6c 69 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20  lite.aFKey hash 
3a80: 74 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64  table.  But it d
3a90: 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d  oes destroy.** m
3aa0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
3ab0: 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20   of the indices 
3ac0: 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  and foreign keys
3ad0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3ae0: 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a   .** the table..
3af0: 2a 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20 61 73  **.** Indices as
3b00: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
3b10: 65 20 74 61 62 6c 65 20 61 72 65 20 75 6e 6c 69  e table are unli
3b20: 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 22 64  nked from the "d
3b30: 62 22 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63  b".** data struc
3b40: 74 75 72 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c  ture if db!=NULL
3b50: 2e 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20  .  If db==NULL, 
3b60: 69 6e 64 69 63 65 73 20 61 74 74 61 63 68 65 64  indices attached
3b70: 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   to.** the table
3b80: 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20 62 75   are deleted, bu
3b90: 74 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  t it is assumed 
3ba0: 74 68 65 79 20 68 61 76 65 20 61 6c 72 65 61 64  they have alread
3bb0: 79 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b  y been.** unlink
3bc0: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
3bd0: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 73  te3DeleteTable(s
3be0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c  qlite3 *db, Tabl
3bf0: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e  e *pTable){.  In
3c00: 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e  dex *pIndex, *pN
3c10: 65 78 74 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b  ext;.  FKey *pFK
3c20: 65 79 2c 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a  ey, *pNextFKey;.
3c30: 0a 20 20 64 62 20 3d 20 30 3b 0a 0a 20 20 69 66  .  db = 0;..  if
3c40: 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65  ( pTable==0 ) re
3c50: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e  turn;..  /* Do n
3c60: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 74 61  ot delete the ta
3c70: 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65  ble until the re
3c80: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65  ference count re
3c90: 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20  aches zero. */. 
3ca0: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 2d 2d 3b   pTable->nRef--;
3cb0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e  .  if( pTable->n
3cc0: 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  Ref>0 ){.    ret
3cd0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
3ce0: 74 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3d  t( pTable->nRef=
3cf0: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  =0 );..  /* Dele
3d00: 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61  te all indices a
3d10: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
3d20: 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20  his table.  */. 
3d30: 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54   for(pIndex = pT
3d40: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49  able->pIndex; pI
3d50: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65  ndex; pIndex=pNe
3d60: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
3d70: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
3d80: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
3d90: 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  ex->pSchema==pTa
3da0: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  ble->pSchema );.
3db0: 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65      sqliteDelete
3dc0: 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20  Index(pIndex);. 
3dd0: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
3de0: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
3df0: 4b 45 59 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  KEY.  /* Delete 
3e00: 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  all foreign keys
3e10: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3e20: 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20 54 68   this table.  Th
3e30: 65 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75  e keys.  ** shou
3e40: 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
3e50: 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72  been unlinked fr
3e60: 6f 6d 20 74 68 65 20 64 62 2d 3e 61 46 4b 65 79  om the db->aFKey
3e70: 20 68 61 73 68 20 74 61 62 6c 65 20 0a 20 20 2a   hash table .  *
3e80: 2f 0a 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 54  /.  for(pFKey=pT
3e90: 61 62 6c 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b  able->pFKey; pFK
3ea0: 65 79 3b 20 70 46 4b 65 79 3d 70 4e 65 78 74 46  ey; pFKey=pNextF
3eb0: 4b 65 79 29 7b 0a 20 20 20 20 70 4e 65 78 74 46  Key){.    pNextF
3ec0: 4b 65 79 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65  Key = pFKey->pNe
3ed0: 78 74 46 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65  xtFrom;.    asse
3ee0: 72 74 28 20 73 71 6c 69 74 65 33 48 61 73 68 46  rt( sqlite3HashF
3ef0: 69 6e 64 28 26 70 54 61 62 6c 65 2d 3e 70 53 63  ind(&pTable->pSc
3f00: 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 0a 20 20 20  hema->aFKey,.   
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f20: 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a          pFKey->z
3f30: 54 6f 2c 20 73 74 72 6c 65 6e 28 70 46 4b 65 79  To, strlen(pFKey
3f40: 2d 3e 7a 54 6f 29 2b 31 29 21 3d 70 46 4b 65 79  ->zTo)+1)!=pFKey
3f50: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   );.    sqliteFr
3f60: 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 7d 0a 23  ee(pFKey);.  }.#
3f70: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 65 6c 65  endif..  /* Dele
3f80: 74 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  te the Table str
3f90: 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20  ucture itself.. 
3fa0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 52 65 73 65   */.  sqliteRese
3fb0: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61  tColumnNames(pTa
3fc0: 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ble);.  sqliteFr
3fd0: 65 65 28 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ee(pTable->zName
3fe0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
3ff0: 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29  pTable->zColAff)
4000: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
4010: 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e  tDelete(pTable->
4020: 70 53 65 6c 65 63 74 29 3b 0a 23 69 66 6e 64 65  pSelect);.#ifnde
4030: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
4040: 45 43 4b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  ECK.  sqlite3Exp
4050: 72 44 65 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e  rDelete(pTable->
4060: 70 43 68 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a  pCheck);.#endif.
4070: 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65    sqlite3VtabCle
4080: 61 72 28 70 54 61 62 6c 65 29 3b 0a 20 20 73 71  ar(pTable);.  sq
4090: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 29  liteFree(pTable)
40a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  ;.}../*.** Unlin
40b0: 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c  k the given tabl
40c0: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
40d0: 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64  tables and the d
40e0: 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62  elete the.** tab
40f0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74  le structure wit
4100: 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65  h all its indice
4110: 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65  s and foreign ke
4120: 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ys..*/.void sqli
4130: 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
4140: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
4150: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f  *db, int iDb, co
4160: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61  nst char *zTabNa
4170: 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  me){.  Table *p;
4180: 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70  .  FKey *pF1, *p
4190: 46 32 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a  F2;.  Db *pDb;..
41a0: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
41b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
41c0: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
41d0: 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
41e0: 7a 54 61 62 4e 61 6d 65 20 26 26 20 7a 54 61 62  zTabName && zTab
41f0: 4e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 70 44 62  Name[0] );.  pDb
4200: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
4210: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48  ;.  p = sqlite3H
4220: 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e  ashInsert(&pDb->
4230: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
4240: 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 73 74 72 6c  , zTabName, strl
4250: 65 6e 28 7a 54 61 62 4e 61 6d 65 29 2b 31 2c 30  en(zTabName)+1,0
4260: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 23 69  );.  if( p ){.#i
4270: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4280: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
4290: 20 20 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b    for(pF1=p->pFK
42a0: 65 79 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31  ey; pF1; pF1=pF1
42b0: 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20  ->pNextFrom){.  
42c0: 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74      int nTo = st
42d0: 72 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b  rlen(pF1->zTo) +
42e0: 20 31 3b 0a 20 20 20 20 20 20 70 46 32 20 3d 20   1;.      pF2 = 
42f0: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
4300: 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 61  &pDb->pSchema->a
4310: 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20  FKey, pF1->zTo, 
4320: 6e 54 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nTo);.      if( 
4330: 70 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20  pF2==pF1 ){.    
4340: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
4350: 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68  nsert(&pDb->pSch
4360: 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d  ema->aFKey, pF1-
4370: 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e  >zTo, nTo, pF1->
4380: 70 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20 20 20  pNextTo);.      
4390: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77  }else{.        w
43a0: 68 69 6c 65 28 20 70 46 32 20 26 26 20 70 46 32  hile( pF2 && pF2
43b0: 2d 3e 70 4e 65 78 74 54 6f 21 3d 70 46 31 20 29  ->pNextTo!=pF1 )
43c0: 7b 20 70 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74  { pF2=pF2->pNext
43d0: 54 6f 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  To; }.        if
43e0: 28 20 70 46 32 20 29 7b 0a 20 20 20 20 20 20 20  ( pF2 ){.       
43f0: 20 20 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20     pF2->pNextTo 
4400: 3d 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a  = pF1->pNextTo;.
4410: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4420: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
4430: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
4440: 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20  Table(db, p);.  
4450: 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  }.  db->flags |=
4460: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
4470: 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  anges;.}../*.** 
4480: 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72  Given a token, r
4490: 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74  eturn a string t
44a0: 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  hat consists of 
44b0: 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 61 74  the text of that
44c0: 0a 2a 2a 20 74 6f 6b 65 6e 20 77 69 74 68 20 61  .** token with a
44d0: 6e 79 20 71 75 6f 74 61 74 69 6f 6e 73 20 72 65  ny quotations re
44e0: 6d 6f 76 65 64 2e 20 20 53 70 61 63 65 20 74 6f  moved.  Space to
44f0: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
4500: 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20  ed string.** is 
4510: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
4520: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
4530: 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
4540: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  y the calling.**
4550: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
4560: 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74 65   Tokens are ofte
4570: 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65 72 73 20  n just pointers 
4580: 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
4590: 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64 20 73  l SQL text and s
45a0: 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30  o.** are not \00
45b0: 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64  0 terminated and
45c0: 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69 73 74   are not persist
45d0: 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ent.  The return
45e0: 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20  ed string.** is 
45f0: 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20  \000 terminated 
4600: 61 6e 64 20 69 73 20 70 65 72 73 69 73 74 65 6e  and is persisten
4610: 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  t..*/.char *sqli
4620: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
4630: 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a  (Token *pName){.
4640: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
4650: 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
4660: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
4670: 53 74 72 4e 44 75 70 28 28 63 68 61 72 2a 29 70  StrNDup((char*)p
4680: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
4690: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  n);.    sqlite3D
46a0: 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20  equote(zName);. 
46b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d   }else{.    zNam
46c0: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
46d0: 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  urn zName;.}../*
46e0: 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c  .** Open the sql
46f0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
4700: 20 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62   stored in datab
4710: 61 73 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66  ase number iDb f
4720: 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54  or.** writing. T
4730: 68 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e  he table is open
4740: 65 64 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20  ed using cursor 
4750: 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
4760: 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
4770: 65 28 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20  e(Parse *p, int 
4780: 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  iDb){.  Vdbe *v 
4790: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
47a0: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61  (p);.  sqlite3Ta
47b0: 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20  bleLock(p, iDb, 
47c0: 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20  MASTER_ROOT, 1, 
47d0: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
47e0: 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ));.  sqlite3Vdb
47f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
4800: 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20  eger, iDb, 0);. 
4810: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4820: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  p(v, OP_OpenWrit
4830: 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  e, 0, MASTER_ROO
4840: 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  T);.  sqlite3Vdb
4850: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
4860: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 35  NumColumns, 0, 5
4870: 29 3b 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73  ); /* sqlite_mas
4880: 74 65 72 20 68 61 73 20 35 20 63 6f 6c 75 6d 6e  ter has 5 column
4890: 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  s */.}../*.** Th
48a0: 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63  e token *pName c
48b0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65  ontains the name
48c0: 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28   of a database (
48d0: 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72  either "main" or
48e0: 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68  .** "temp" or th
48f0: 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74  e name of an att
4900: 61 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 20  ached db). This 
4910: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
4920: 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20  the.** index of 
4930: 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61  the named databa
4940: 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c  se in db->aDb[],
4950: 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61   or -1 if the na
4960: 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20  med db .** does 
4970: 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e  not exist..*/.in
4980: 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28  t sqlite3FindDb(
4990: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b  sqlite3 *db, Tok
49a0: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e  en *pName){.  in
49b0: 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 2f 2a 20  t i = -1;    /* 
49c0: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
49d0: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
49e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
49f0: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
4a00: 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 44 62 20  he name */.  Db 
4a10: 2a 70 44 62 3b 20 20 20 20 20 20 20 2f 2a 20 41  *pDb;       /* A
4a20: 20 64 61 74 61 62 61 73 65 20 77 68 6f 73 65 20   database whose 
4a30: 6e 61 6d 65 20 73 70 61 63 65 20 69 73 20 62 65  name space is be
4a40: 69 6e 67 20 73 65 61 72 63 68 65 64 20 2a 2f 0a  ing searched */.
4a50: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
4a60: 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72 65 20   /* Name we are 
4a70: 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f  searching for */
4a80: 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ..  zName = sqli
4a90: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
4aa0: 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  (pName);.  if( z
4ab0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 6e 20 3d 20  Name ){.    n = 
4ac0: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20  strlen(zName);. 
4ad0: 20 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44     for(i=(db->nD
4ae0: 62 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61  b-1), pDb=&db->a
4af0: 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Db[i]; i>=0; i--
4b00: 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20  , pDb--){.      
4b10: 69 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44  if( (!OMIT_TEMPD
4b20: 42 20 7c 7c 20 69 21 3d 31 20 29 20 26 26 20 6e  B || i!=1 ) && n
4b30: 3d 3d 73 74 72 6c 65 6e 28 70 44 62 2d 3e 7a 4e  ==strlen(pDb->zN
4b40: 61 6d 65 29 20 26 26 20 0a 20 20 20 20 20 20 20  ame) && .       
4b50: 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72     0==sqlite3Str
4b60: 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c  ICmp(pDb->zName,
4b70: 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20   zName) ){.     
4b80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4b90: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
4ba0: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
4bb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
4bc0: 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f  ../* The table o
4bd0: 72 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65  r view or trigge
4be0: 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65 64  r name is passed
4bf0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
4c00: 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70   via tokens.** p
4c10: 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32  Name1 and pName2
4c20: 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e  . If the table n
4c30: 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75  ame was fully qu
4c40: 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61  alified, for exa
4c50: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41  mple:.**.** CREA
4c60: 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79  TE TABLE xxx.yyy
4c70: 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54   (...);.** .** T
4c80: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
4c90: 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70  t to "xxx" and p
4ca0: 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20  Name2 "yyy". On 
4cb0: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69  the other hand i
4cc0: 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e  f.** the table n
4cd0: 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79  ame is not fully
4ce0: 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e   qualified, i.e.
4cf0: 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54  :.**.** CREATE T
4d00: 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a  ABLE yyy(...);.*
4d10: 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31  *.** Then pName1
4d20: 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22   is set to "yyy"
4d30: 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22   and pName2 is "
4d40: 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  "..**.** This ro
4d50: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 2a  utine sets the *
4d60: 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72  ppUnqual pointer
4d70: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
4d80: 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f   token (pName1 o
4d90: 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61  r.** pName2) tha
4da0: 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71  t stores the unq
4db0: 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e  ualified table n
4dc0: 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78 20  ame.  The index 
4dd0: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
4de0: 73 65 20 22 78 78 78 22 20 69 73 20 72 65 74 75  se "xxx" is retu
4df0: 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
4e00: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
4e10: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4e20: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  ,      /* Parsin
4e30: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
4e40: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
4e50: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
4e60: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78  ,      /* The "x
4e70: 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  xx" in the name 
4e80: 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78 78  "xxx.yyy" or "xx
4e90: 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  x" */.  Token *p
4ea0: 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54  Name2,      /* T
4eb0: 68 65 20 22 79 79 79 22 20 69 6e 20 74 68 65 20  he "yyy" in the 
4ec0: 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 2a  name "xxx.yyy" *
4ed0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71  /.  Token **pUnq
4ee0: 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ual     /* Write
4ef0: 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64   the unqualified
4f00: 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65 72   object name her
4f10: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44  e */.){.  int iD
4f20: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
4f30: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
4f40: 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62  e holding the ob
4f50: 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
4f60: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
4f70: 64 62 3b 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65  db;..  if( pName
4f80: 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30  2 && pName2->n>0
4f90: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
4fa0: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
4fb0: 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d  ;.    *pUnqual =
4fc0: 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44 62   pName2;.    iDb
4fd0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
4fe0: 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  (db, pName1);.  
4ff0: 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20    if( iDb<0 ){. 
5000: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
5010: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
5020: 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20 25  known database %
5030: 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20  T", pName1);.   
5040: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
5050: 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  +;.      return 
5060: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  -1;.    }.  }els
5070: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
5080: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c  b->init.iDb==0 |
5090: 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  | db->init.busy 
50a0: 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d  );.    iDb = db-
50b0: 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a  >init.iDb;.    *
50c0: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31  pUnqual = pName1
50d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
50e0: 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  Db;.}../*.** Thi
50f0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
5100: 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68  d to check if th
5110: 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 7a  e UTF-8 string z
5120: 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c 0a  Name is a legal.
5130: 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6e  ** unqualified n
5140: 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73 63  ame for a new sc
5150: 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61 62  hema object (tab
5160: 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77 20  le, index, view 
5170: 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e 20  or.** trigger). 
5180: 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c 65  All names are le
5190: 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73 65  gal except those
51a0: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
51b0: 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22   the string.** "
51c0: 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70 70  sqlite_" (in upp
51d0: 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78  er, lower or mix
51e0: 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20 70  ed case). This p
51f0: 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61  ortion of the na
5200: 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72 65  mespace.** is re
5210: 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72  served for inter
5220: 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20  nal use..*/.int 
5230: 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
5240: 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70 50  ctName(Parse *pP
5250: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
5260: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20   *zName){.  if( 
5270: 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69  !pParse->db->ini
5280: 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73 65  t.busy && pParse
5290: 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20 20  ->nested==0 .   
52a0: 20 20 20 20 20 20 20 26 26 20 28 70 50 61 72 73         && (pPars
52b0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
52c0: 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d  QLITE_WriteSchem
52d0: 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  a)==0.          
52e0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
52f0: 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  NICmp(zName, "sq
5300: 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20  lite_", 7) ){.  
5310: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
5320: 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a 65 63  g(pParse, "objec
5330: 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64 20  t name reserved 
5340: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65  for internal use
5350: 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  : %s", zName);. 
5360: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5370: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
5380: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5390: 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63  }../*.** Begin c
53a0: 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65  onstructing a ne
53b0: 77 20 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e  w table represen
53c0: 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79  tation in memory
53d0: 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68  .  This is.** th
53e0: 65 20 66 69 72 73 74 20 6f 66 20 73 65 76 65 72  e first of sever
53f0: 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  al action routin
5400: 65 73 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c  es that get call
5410: 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a  ed in response.*
5420: 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20 54 41  * to a CREATE TA
5430: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
5440: 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74  In particular, t
5450: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
5460: 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73  alled.** after s
5470: 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52  eeing tokens "CR
5480: 45 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45  EATE" and "TABLE
5490: 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  " and the table 
54a0: 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65 6d 70  name. The isTemp
54b0: 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65  .** flag is true
54c0: 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73 68   if the table sh
54d0: 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69  ould be stored i
54e0: 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  n the auxiliary 
54f0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
5500: 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20 74   instead of in t
5510: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
5520: 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20   file.  This is 
5530: 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61 73  normally the cas
5540: 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22 54  e.** when the "T
5550: 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52 41  EMP" or "TEMPORA
5560: 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63 75  RY" keyword occu
5570: 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a  rs in between.**
5580: 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42 4c   CREATE and TABL
5590: 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  E..**.** The new
55a0: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 73   table record is
55b0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64   initialized and
55c0: 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d 3e   put in pParse->
55d0: 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73  pNewTable..** As
55e0: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52 45   more of the CRE
55f0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
5600: 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20 61  ent is parsed, a
5610: 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e  dditional action
5620: 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  .** routines wil
5630: 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 61  l be called to a
5640: 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74  dd more informat
5650: 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63 6f  ion to this reco
5660: 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  rd..** At the en
5670: 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  d of the CREATE 
5680: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c  TABLE statement,
5690: 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64 54   the sqlite3EndT
56a0: 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a  able() routine.*
56b0: 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  * is called to c
56c0: 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e 73  omplete the cons
56d0: 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  truction of the 
56e0: 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64  new table record
56f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5700: 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20 50  3StartTable(.  P
5710: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5720: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
5730: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
5740: 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73 74  ame1,   /* First
5750: 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d   part of the nam
5760: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  e of the table o
5770: 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65  r view */.  Toke
5780: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20  n *pName2,   /* 
5790: 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 74  Second part of t
57a0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
57b0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a  able or view */.
57c0: 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20    int isTemp,   
57d0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
57e0: 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61 62  is is a TEMP tab
57f0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  le */.  int isVi
5800: 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ew,      /* True
5810: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56 49   if this is a VI
5820: 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  EW */.  int isVi
5830: 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72 75 65  rtual,   /* True
5840: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56 49   if this is a VI
5850: 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f 0a 20  RTUAL table */. 
5860: 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20   int noErr      
5870: 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
5880: 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  if table already
5890: 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20   exists */.){.  
58a0: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20  Table *pTable;. 
58b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
58c0: 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66  ; /* The name of
58d0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a   the new table *
58e0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
58f0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
5900: 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69  Vdbe *v;.  int i
5910: 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  Db;         /* D
5920: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 74  atabase number t
5930: 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61 62  o create the tab
5940: 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  le in */.  Token
5950: 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55   *pName;    /* U
5960: 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
5970: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
5980: 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20  create */..  /* 
5990: 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  The table or vie
59a0: 77 20 6e 61 6d 65 20 74 6f 20 63 72 65 61 74 65  w name to create
59b0: 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68   is passed to th
59c0: 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74  is routine via t
59d0: 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d 65  okens.  ** pName
59e0: 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66  1 and pName2. If
59f0: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
5a00: 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  was fully qualif
5a10: 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ied, for example
5a20: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41  :.  **.  ** CREA
5a30: 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79  TE TABLE xxx.yyy
5a40: 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20   (...);.  ** .  
5a50: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
5a60: 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61  s set to "xxx" a
5a70: 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e  nd pName2 "yyy".
5a80: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
5a90: 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 74  nd if.  ** the t
5aa0: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74  able name is not
5ab0: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
5ac0: 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a  , i.e.:.  **.  *
5ad0: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 79  * CREATE TABLE y
5ae0: 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20  yy(...);.  **.  
5af0: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
5b00: 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20 61  s set to "yyy" a
5b10: 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e  nd pName2 is "".
5b20: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63  .  **.  ** The c
5b30: 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73 20 74  all below sets t
5b40: 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74 65 72  he pName pointer
5b50: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
5b60: 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f   token (pName1 o
5b70: 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29 20 74  r.  ** pName2) t
5b80: 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75  hat stores the u
5b90: 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65  nqualified table
5ba0: 20 6e 61 6d 65 2e 20 54 68 65 20 76 61 72 69 61   name. The varia
5bb0: 62 6c 65 20 69 44 62 20 69 73 0a 20 20 2a 2a 20  ble iDb is.  ** 
5bc0: 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
5bd0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
5be0: 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
5bf0: 6f 72 20 76 69 65 77 20 69 73 20 74 6f 20 62 65  or view is to be
5c00: 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e  .  ** created in
5c10: 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73  ..  */.  iDb = s
5c20: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
5c30: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
5c40: 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
5c50: 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29  );.  if( iDb<0 )
5c60: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21   return;.  if( !
5c70: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
5c80: 73 54 65 6d 70 20 26 26 20 69 44 62 3e 31 20 29  sTemp && iDb>1 )
5c90: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61  {.    /* If crea
5ca0: 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c  ting a temp tabl
5cb0: 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20  e, the name may 
5cc0: 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65 64  not be qualified
5cd0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
5ce0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
5cf0: 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65  "temporary table
5d00: 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e   name must be un
5d10: 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20  qualified");.   
5d20: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
5d30: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
5d40: 26 26 20 69 73 54 65 6d 70 20 29 20 69 44 62 20  && isTemp ) iDb 
5d50: 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e  = 1;..  pParse->
5d60: 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e  sNameToken = *pN
5d70: 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  ame;.  zName = s
5d80: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
5d90: 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66  ken(pName);.  if
5da0: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
5db0: 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  urn;.  if( SQLIT
5dc0: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65  E_OK!=sqlite3Che
5dd0: 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61  ckObjectName(pPa
5de0: 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  rse, zName) ){. 
5df0: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
5e00: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ble_error;.  }. 
5e10: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44   if( db->init.iD
5e20: 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20  b==1 ) isTemp = 
5e30: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
5e40: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
5e50: 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 28  TION.  assert( (
5e60: 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69 73 54  isTemp & 1)==isT
5e70: 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69  emp );.  {.    i
5e80: 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 68 61  nt code;.    cha
5e90: 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
5ea0: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
5eb0: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
5ec0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
5ed0: 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48  LITE_INSERT, SCH
5ee0: 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70  EMA_TABLE(isTemp
5ef0: 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  ), 0, zDb) ){.  
5f00: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
5f10: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
5f20: 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  }.    if( isView
5f30: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f   ){.      if( !O
5f40: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73  MIT_TEMPDB && is
5f50: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
5f60: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
5f70: 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a  EATE_TEMP_VIEW;.
5f80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5f90: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
5fa0: 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a  TE_CREATE_VIEW;.
5fb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
5fc0: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  e{.      if( !OM
5fd0: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54  IT_TEMPDB && isT
5fe0: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63  emp ){.        c
5ff0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
6000: 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a  ATE_TEMP_TABLE;.
6010: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6020: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
6030: 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b  TE_CREATE_TABLE;
6040: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6050: 20 20 20 69 66 28 20 21 69 73 56 69 72 74 75 61     if( !isVirtua
6060: 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75 74 68  l && sqlite3Auth
6070: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
6080: 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  de, zName, 0, zD
6090: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
60a0: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
60b0: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  or;.    }.  }.#e
60c0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ndif..  /* Make 
60d0: 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61 62  sure the new tab
60e0: 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74  le name does not
60f0: 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e   collide with an
6100: 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69   existing.  ** i
6110: 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61  ndex or table na
6120: 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  me in the same d
6130: 61 74 61 62 61 73 65 2e 20 20 49 73 73 75 65 20  atabase.  Issue 
6140: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
6150: 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73   if.  ** it does
6160: 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20  . The exception 
6170: 69 73 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  is if the statem
6180: 65 6e 74 20 62 65 69 6e 67 20 70 61 72 73 65 64  ent being parsed
6190: 20 77 61 73 20 70 61 73 73 65 64 0a 20 20 2a 2a   was passed.  **
61a0: 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 64   to an sqlite3_d
61b0: 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20 63 61  eclare_vtab() ca
61c0: 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ll. In that case
61d0: 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e   only the column
61e0: 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20   names.  ** and 
61f0: 74 79 70 65 73 20 77 69 6c 6c 20 62 65 20 75 73  types will be us
6200: 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20  ed, so there is 
6210: 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74 20  no need to test 
6220: 66 6f 72 20 6e 61 6d 65 73 70 61 63 65 0a 20 20  for namespace.  
6230: 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20  ** collisions.. 
6240: 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44 45   */.  if( !IN_DE
6250: 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20  CLARE_VTAB ){.  
6260: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
6270: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
6280: 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
6290: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
62a0: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
62b0: 7d 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 73  }.    pTable = s
62c0: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
62d0: 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61  db, zName, db->a
62e0: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a  Db[iDb].zName);.
62f0: 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 20 29      if( pTable )
6300: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6e 6f 45  {.      if( !noE
6310: 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rr ){.        sq
6320: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
6330: 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54 20  arse, "table %T 
6340: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
6350: 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   pName);.      }
6360: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
6370: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
6380: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
6390: 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
63a0: 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 26  , zName, 0)!=0 &
63b0: 26 20 28 69 44 62 3d 3d 30 20 7c 7c 20 21 64 62  & (iDb==0 || !db
63c0: 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a  ->init.busy) ){.
63d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
63e0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
63f0: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
6400: 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 25  an index named %
6410: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
6420: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
6430: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
6440: 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20 3d 20    }..  pTable = 
6450: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
6460: 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20  zeof(Table) );. 
6470: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
6480: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  {.    pParse->rc
6490: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
64a0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
64b0: 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65  r++;.    goto be
64c0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
64d0: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a  .  }.  pTable->z
64e0: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
64f0: 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20  pTable->iPKey = 
6500: 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53  -1;.  pTable->pS
6510: 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
6520: 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  iDb].pSchema;.  
6530: 70 54 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31  pTable->nRef = 1
6540: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
6550: 70 4e 65 77 54 61 62 6c 65 20 29 20 73 71 6c 69  pNewTable ) sqli
6560: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
6570: 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  b, pParse->pNewT
6580: 61 62 6c 65 29 3b 0a 20 20 70 50 61 72 73 65 2d  able);.  pParse-
6590: 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61  >pNewTable = pTa
65a0: 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ble;..  /* If th
65b0: 69 73 20 69 73 20 74 68 65 20 6d 61 67 69 63 20  is is the magic 
65c0: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
65d0: 74 61 62 6c 65 20 75 73 65 64 20 62 79 20 61 75  table used by au
65e0: 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a  toincrement,.  *
65f0: 2a 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20  * then record a 
6600: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
6610: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69  table in the mai
6620: 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
6630: 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61  ture.  ** so tha
6640: 74 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e  t INSERT can fin
6650: 64 20 74 68 65 20 74 61 62 6c 65 20 65 61 73 69  d the table easi
6660: 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ly..  */.#ifndef
6670: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
6680: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28  OINCREMENT.  if(
6690: 20 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64   !pParse->nested
66a0: 20 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65   && strcmp(zName
66b0: 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  , "sqlite_sequen
66c0: 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ce")==0 ){.    p
66d0: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e  Table->pSchema->
66e0: 70 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c 65  pSeqTab = pTable
66f0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
6700: 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
6710: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
6720: 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68  t will insert th
6730: 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  e table record i
6740: 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c  nto.  ** the SQL
6750: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
6760: 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69  .  Note in parti
6770: 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75  cular that we mu
6780: 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a  st go ahead.  **
6790: 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68   and allocate th
67a0: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
67b0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e  for the table en
67c0: 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65  try now.  Before
67d0: 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52   any.  ** PRIMAR
67e0: 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
67f0: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61 72  keywords are par
6800: 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77  sed.  Those keyw
6810: 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a  ords will cause.
6820: 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
6830: 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 74  be created and t
6840: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
6850: 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65  must come before
6860: 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63   the .  ** indic
6870: 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20  es.  Hence, the 
6880: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f  record number fo
6890: 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74  r the table must
68a0: 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20   be allocated.  
68b0: 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69  ** now..  */.  i
68c0: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
68d0: 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65  y && (v = sqlite
68e0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
68f0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
6900: 6c 62 6c 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c  lbl;.    int fil
6910: 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20 73 71 6c  eFormat;.    sql
6920: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
6930: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
6940: 30 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65  0, iDb);..#ifnde
6950: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
6960: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
6970: 66 28 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a  f( isVirtual ){.
6980: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6990: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 42 65  eAddOp(v, OP_VBe
69a0: 67 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  gin, 0, 0);.    
69b0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
69c0: 20 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   If the file for
69d0: 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67  mat and encoding
69e0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
69f0: 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73   have not been s
6a00: 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20  et, .    ** set 
6a10: 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f  them now..    */
6a20: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6a30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64  AddOp(v, OP_Read
6a40: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b  Cookie, iDb, 1);
6a50: 20 20 20 2f 2a 20 66 69 6c 65 5f 66 6f 72 6d 61     /* file_forma
6a60: 74 20 2a 2f 0a 20 20 20 20 6c 62 6c 20 3d 20 73  t */.    lbl = s
6a70: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
6a80: 62 65 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  bel(v);.    sqli
6a90: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6aa0: 4f 50 5f 49 66 2c 20 30 2c 20 6c 62 6c 29 3b 0a  OP_If, 0, lbl);.
6ab0: 20 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d      fileFormat =
6ac0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
6ad0: 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46  LITE_LegacyFileF
6ae0: 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20  mt)!=0 ?.       
6af0: 20 20 20 20 20 20 20 20 20 20 20 31 20 3a 20 53             1 : S
6b00: 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46  QLITE_MAX_FILE_F
6b10: 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74  ORMAT;.    sqlit
6b20: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
6b30: 50 5f 49 6e 74 65 67 65 72 2c 20 66 69 6c 65 46  P_Integer, fileF
6b40: 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20 73  ormat, 0);.    s
6b50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6b60: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
6b70: 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 73 71   iDb, 1);.    sq
6b80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6b90: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 45 4e  , OP_Integer, EN
6ba0: 43 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 73  C(db), 0);.    s
6bb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6bc0: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
6bd0: 20 69 44 62 2c 20 34 29 3b 0a 20 20 20 20 73 71   iDb, 4);.    sq
6be0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
6bf0: 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 0a  Label(v, lbl);..
6c00: 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74      /* This just
6c10: 20 63 72 65 61 74 65 73 20 61 20 70 6c 61 63 65   creates a place
6c20: 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69  -holder record i
6c30: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
6c40: 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  ter table..    *
6c50: 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63 72 65  * The record cre
6c60: 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f  ated does not co
6c70: 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79  ntain anything y
6c80: 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  et.  It will be 
6c90: 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20  replaced.    ** 
6ca0: 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72  by the real entr
6cb0: 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61  y in code genera
6cc0: 74 65 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e  ted at sqlite3En
6cd0: 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a  dTable()..    **
6ce0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69  .    ** The rowi
6cf0: 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e  d for the new en
6d00: 74 72 79 20 69 73 20 6c 65 66 74 20 6f 6e 20 74  try is left on t
6d10: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
6d20: 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ack..    ** The 
6d30: 72 6f 77 69 64 20 76 61 6c 75 65 20 69 73 20 6e  rowid value is n
6d40: 65 65 64 65 64 20 62 79 20 74 68 65 20 63 6f 64  eeded by the cod
6d50: 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 45 6e  e that sqlite3En
6d60: 64 54 61 62 6c 65 20 77 69 6c 6c 0a 20 20 20 20  dTable will.    
6d70: 2a 2a 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20  ** generate..   
6d80: 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
6d90: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
6da0: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
6db0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
6dc0: 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 69 66 28  ALTABLE).    if(
6dd0: 20 69 73 56 69 65 77 20 7c 7c 20 69 73 56 69 72   isView || isVir
6de0: 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  tual ){.      sq
6df0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6e00: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
6e10: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23   0);.    }else.#
6e20: 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20  endif.    {.    
6e30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6e40: 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54  Op(v, OP_CreateT
6e50: 61 62 6c 65 2c 20 69 44 62 2c 20 30 29 3b 0a 20  able, iDb, 0);. 
6e60: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
6e70: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
6e80: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
6e90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6ea0: 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  Op(v, OP_NewRowi
6eb0: 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  d, 0, 0);.    sq
6ec0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6ed0: 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
6ee0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6ef0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
6f00: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
6f10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
6f20: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 30   OP_Insert, 0, 0
6f30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6f40: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
6f50: 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ose, 0, 0);.    
6f60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6f70: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
6f80: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  0);.  }..  /* No
6f90: 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29  rmal (non-error)
6fa0: 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65   return. */.  re
6fb0: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  turn;..  /* If a
6fc0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
6fd0: 77 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a  we jump here */.
6fe0: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
6ff0: 72 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  r:.  sqliteFree(
7000: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
7010: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
7020: 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f  macro is used to
7030: 20 63 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 72   compare two str
7040: 69 6e 67 73 20 69 6e 20 61 20 63 61 73 65 2d 69  ings in a case-i
7050: 6e 73 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e 65  nsensitive manne
7060: 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69 67  r..** It is slig
7070: 68 74 6c 79 20 66 61 73 74 65 72 20 74 68 61 6e  htly faster than
7080: 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
7090: 53 74 72 49 43 6d 70 28 29 20 64 69 72 65 63 74  StrICmp() direct
70a0: 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64 75  ly, but.** produ
70b0: 63 65 73 20 6c 61 72 67 65 72 20 63 6f 64 65 2e  ces larger code.
70c0: 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20  .**.** WARNING: 
70d0: 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 6e 6f  This macro is no
70e0: 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  t compatible wit
70f0: 68 20 74 68 65 20 73 74 72 63 6d 70 28 29 20 66  h the strcmp() f
7100: 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65 74  amily. It.** ret
7110: 75 72 6e 73 20 74 72 75 65 20 69 66 20 74 68 65  urns true if the
7120: 20 74 77 6f 20 73 74 72 69 6e 67 73 20 61 72 65   two strings are
7130: 20 65 71 75 61 6c 2c 20 6f 74 68 65 72 77 69 73   equal, otherwis
7140: 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66  e false..*/.#def
7150: 69 6e 65 20 53 54 52 49 43 4d 50 28 78 2c 20 79  ine STRICMP(x, y
7160: 29 20 28 5c 0a 73 71 6c 69 74 65 33 55 70 70 65  ) (\.sqlite3Uppe
7170: 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67  rToLower[*(unsig
7180: 6e 65 64 20 63 68 61 72 20 2a 29 28 78 29 5d 3d  ned char *)(x)]=
7190: 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33 55 70 70  =   \.sqlite3Upp
71a0: 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69  erToLower[*(unsi
71b0: 67 6e 65 64 20 63 68 61 72 20 2a 29 28 79 29 5d  gned char *)(y)]
71c0: 20 20 20 20 20 5c 0a 26 26 20 73 71 6c 69 74 65       \.&& sqlite
71d0: 33 53 74 72 49 43 6d 70 28 28 78 29 2b 31 2c 28  3StrICmp((x)+1,(
71e0: 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a  y)+1)==0 )../*.*
71f0: 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75  * Add a new colu
7200: 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  mn to the table 
7210: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
7220: 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a  constructed..**.
7230: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
7240: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
7250: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63   once for each c
7260: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
7270: 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45  n.** in a CREATE
7280: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
7290: 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  .  sqlite3StartT
72a0: 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c  able() gets call
72b0: 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67  ed.** first to g
72c0: 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e  et things going.
72d0: 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74    Then this rout
72e0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  ine is called fo
72f0: 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e  r each.** column
7300: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7310: 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65  3AddColumn(Parse
7320: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
7330: 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65  *pName){.  Table
7340: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
7350: 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d  char *z;.  Colum
7360: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28  n *pCol;.  if( (
7370: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
7380: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
7390: 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  rn;.  z = sqlite
73a0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
73b0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  Name);.  if( z==
73c0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
73d0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=0; i<p->nCol
73e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
73f0: 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43  STRICMP(z, p->aC
7400: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a  ol[i].zName) ){.
7410: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
7420: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64  orMsg(pParse, "d
7430: 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20  uplicate column 
7440: 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20  name: %s", z);. 
7450: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
7460: 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  z);.      return
7470: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
7480: 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37  ( (p->nCol & 0x7
7490: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75  )==0 ){.    Colu
74a0: 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e  mn *aNew;.    aN
74b0: 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c  ew = sqliteReall
74c0: 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d  oc( p->aCol, (p-
74d0: 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28  >nCol+8)*sizeof(
74e0: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
74f0: 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b    if( aNew==0 ){
7500: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
7510: 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(z);.      retu
7520: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  rn;.    }.    p-
7530: 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20  >aCol = aNew;.  
7540: 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61  }.  pCol = &p->a
7550: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20  Col[p->nCol];.  
7560: 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20  memset(pCol, 0, 
7570: 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30  sizeof(p->aCol[0
7580: 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61  ]));.  pCol->zNa
7590: 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49  me = z;. .  /* I
75a0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79  f there is no ty
75b0: 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f  pe specified, co
75c0: 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64  lumns have the d
75d0: 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a  efault affinity.
75e0: 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20    ** 'NONE'. If 
75f0: 74 68 65 72 65 20 69 73 20 61 20 74 79 70 65 20  there is a type 
7600: 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20  specified, then 
7610: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
7620: 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a  Type() will.  **
7630: 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78 74 20   be called next 
7640: 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66  to set pCol->aff
7650: 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c 79 2e  inity correctly.
7660: 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66  .  */.  pCol->af
7670: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
7680: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 6e  AFF_NONE;.  p->n
7690: 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Col++;.}../*.** 
76a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
76b0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
76c0: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
76d0: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
76e0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
76f0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
7700: 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63    A "NOT NULL" c
7710: 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a  onstraint has.**
7720: 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20   been seen on a 
7730: 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f  column.  This ro
7740: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e  utine sets the n
7750: 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a  otNull flag on.*
7760: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72  * the column cur
7770: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
7780: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
7790: 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74  id sqlite3AddNot
77a0: 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72  Null(Parse *pPar
77b0: 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29  se, int onError)
77c0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
77d0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20  int i;.  if( (p 
77e0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
77f0: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
7800: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
7810: 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20  1;.  if( i>=0 ) 
7820: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75  p->aCol[i].notNu
7830: 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a  ll = onError;.}.
7840: 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20  ./*.** Scan the 
7850: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65  column type name
7860: 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e   zType (length n
7870: 54 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e  Type) and return
7880: 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   the.** associat
7890: 65 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65  ed affinity type
78a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
78b0: 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65  tine does a case
78c0: 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61  -independent sea
78d0: 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72  rch of zType for
78e0: 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69   the .** substri
78f0: 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ngs in the follo
7900: 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f  wing table. If o
7910: 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72  ne of the substr
7920: 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64  ings is.** found
7930: 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
7940: 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20  ing affinity is 
7950: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79  returned. If zTy
7960: 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d  pe contains.** m
7970: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20  ore than one of 
7980: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20  the substrings, 
7990: 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74  entries toward t
79a0: 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68  he top of .** th
79b0: 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69  e table take pri
79c0: 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70  ority. For examp
79d0: 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20  le, if zType is 
79e0: 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53  'BLOBINT', .** S
79f0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
7a00: 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  R is returned..*
7a10: 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20  *.** Substring  
7a20: 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a     | Affinity.**
7a30: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
7a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a50: 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20  -.** 'INT'      
7a60: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
7a70: 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52  INTEGER.** 'CHAR
7a80: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
7a90: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43  E_AFF_TEXT.** 'C
7aa0: 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOB'        | SQ
7ab0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
7ac0: 20 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c   'TEXT'        |
7ad0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
7ae0: 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20  .** 'BLOB'      
7af0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e    | SQLITE_AFF_N
7b00: 4f 4e 45 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20  ONE.** 'REAL'   
7b10: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
7b20: 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27  F_REAL.** 'FLOA'
7b30: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
7b40: 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f  _AFF_REAL.** 'DO
7b50: 55 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  UB'        | SQL
7b60: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a  ITE_AFF_REAL.**.
7b70: 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68  ** If none of th
7b80: 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20  e substrings in 
7b90: 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20  the above table 
7ba0: 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51  are found,.** SQ
7bb0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
7bc0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
7bd0: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66  .char sqlite3Aff
7be0: 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20  inityType(const 
7bf0: 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20  Token *pType){. 
7c00: 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68   u32 h = 0;.  ch
7c10: 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f  ar aff = SQLITE_
7c20: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63  AFF_NUMERIC;.  c
7c30: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
7c40: 61 72 20 2a 7a 49 6e 20 3d 20 70 54 79 70 65 2d  ar *zIn = pType-
7c50: 3e 7a 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  >z;.  const unsi
7c60: 67 6e 65 64 20 63 68 61 72 20 2a 7a 45 6e 64 20  gned char *zEnd 
7c70: 3d 20 26 70 54 79 70 65 2d 3e 7a 5b 70 54 79 70  = &pType->z[pTyp
7c80: 65 2d 3e 6e 5d 3b 0a 0a 20 20 77 68 69 6c 65 28  e->n];..  while(
7c90: 20 7a 49 6e 21 3d 7a 45 6e 64 20 29 7b 0a 20 20   zIn!=zEnd ){.  
7ca0: 20 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73    h = (h<<8) + s
7cb0: 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
7cc0: 65 72 5b 2a 7a 49 6e 5d 3b 0a 20 20 20 20 7a 49  er[*zIn];.    zI
7cd0: 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d  n++;.    if( h==
7ce0: 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c  (('c'<<24)+('h'<
7cf0: 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72  <16)+('a'<<8)+'r
7d00: 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  ') ){           
7d10: 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20    /* CHAR */.   
7d20: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
7d30: 41 46 46 5f 54 45 58 54 3b 20 0a 20 20 20 20 7d  AFF_TEXT; .    }
7d40: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63  else if( h==(('c
7d50: 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29  '<<24)+('l'<<16)
7d60: 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29  +('o'<<8)+'b') )
7d70: 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20  {       /* CLOB 
7d80: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
7d90: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
7da0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
7db0: 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27  =(('t'<<24)+('e'
7dc0: 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27  <<16)+('x'<<8)+'
7dd0: 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20  t') ){       /* 
7de0: 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66  TEXT */.      af
7df0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
7e00: 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EXT;.    }else i
7e10: 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29  f( h==(('b'<<24)
7e20: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
7e30: 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20  <8)+'b')        
7e40: 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20    /* BLOB */.   
7e50: 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51       && (aff==SQ
7e60: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
7e70: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
7e80: 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20  AFF_REAL) ){.   
7e90: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
7ea0: 41 46 46 5f 4e 4f 4e 45 3b 0a 23 69 66 6e 64 65  AFF_NONE;.#ifnde
7eb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
7ec0: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
7ed0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
7ee0: 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31  'r'<<24)+('e'<<1
7ef0: 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29  6)+('a'<<8)+'l')
7f00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41            /* REA
7f10: 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  L */.        && 
7f20: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
7f30: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
7f40: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
7f50: 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73  F_REAL;.    }els
7f60: 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c  e if( h==(('f'<<
7f70: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
7f80: 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20 20  o'<<8)+'a')     
7f90: 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a       /* FLOA */.
7fa0: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
7fb0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
7fc0: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
7fd0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
7fe0: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  L;.    }else if(
7ff0: 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28   h==(('d'<<24)+(
8000: 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38  'o'<<16)+('u'<<8
8010: 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20  )+'b')          
8020: 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20  /* DOUB */.     
8030: 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54     && aff==SQLIT
8040: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b  E_AFF_NUMERIC ){
8050: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
8060: 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65  ITE_AFF_REAL;.#e
8070: 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69  ndif.    }else i
8080: 66 28 20 28 68 26 30 78 30 30 46 46 46 46 46 46  f( (h&0x00FFFFFF
8090: 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28 27  )==(('i'<<16)+('
80a0: 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20  n'<<8)+'t') ){  
80b0: 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20    /* INT */.    
80c0: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
80d0: 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  FF_INTEGER;.    
80e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
80f0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 66 66   }..  return aff
8100: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
8110: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
8120: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
8130: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
8140: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
8150: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
8160: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
8170: 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73   pFirst token is
8180: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f   the first.** to
8190: 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65  ken in the seque
81a0: 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68  nce of tokens th
81b0: 61 74 20 64 65 73 63 72 69 62 65 20 74 68 65 20  at describe the 
81c0: 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  type of the.** c
81d0: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
81e0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
81f0: 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74  on.   pLast is t
8200: 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a  he last token.**
8210: 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65   in the sequence
8220: 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f  .  Use this info
8230: 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74  rmation to const
8240: 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a  ruct a string.**
8250: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
8260: 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74  he typename of t
8270: 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74  he column and st
8280: 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a  ore that string.
8290: 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20  ** in zType..*/ 
82a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
82b0: 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65  ColumnType(Parse
82c0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
82d0: 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65  *pType){.  Table
82e0: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
82f0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a 20  Column *pCol;.. 
8300: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
8310: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
8320: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
8330: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28  p->nCol-1;.  if(
8340: 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20   i<0 ) return;. 
8350: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
8360: 5b 69 5d 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  [i];.  sqliteFre
8370: 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a  e(pCol->zType);.
8380: 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20    pCol->zType = 
8390: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
83a0: 6f 6b 65 6e 28 70 54 79 70 65 29 3b 0a 20 20 70  oken(pType);.  p
83b0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
83c0: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
83d0: 79 70 65 28 70 54 79 70 65 29 3b 0a 7d 0a 0a 2f  ype(pType);.}../
83e0: 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73  *.** The express
83f0: 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61 75  ion is the defau
8400: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
8410: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
8420: 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f  dded column.** o
8430: 66 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  f the table curr
8440: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
8450: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
8460: 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78  Default value ex
8470: 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62  pressions must b
8480: 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69  e constant.  Rai
8490: 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20  se an exception 
84a0: 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f  if this.** is no
84b0: 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a  t the case..**.*
84c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
84d0: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
84e0: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
84f0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
8500: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
8510: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
8520: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
8530: 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  e3AddDefaultValu
8540: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
8550: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
8560: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c   Table *p;.  Col
8570: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28  umn *pCol;.  if(
8580: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
8590: 65 77 54 61 62 6c 65 29 21 3d 30 20 29 7b 0a 20  ewTable)!=0 ){. 
85a0: 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61     pCol = &(p->a
85b0: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b  Col[p->nCol-1]);
85c0: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
85d0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
85e0: 72 46 75 6e 63 74 69 6f 6e 28 70 45 78 70 72 29  rFunction(pExpr)
85f0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8600: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8610: 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65  , "default value
8620: 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20   of column [%s] 
8630: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22  is not constant"
8640: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  ,.          pCol
8650: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  ->zName);.    }e
8660: 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
8670: 2a 70 43 6f 70 79 3b 0a 20 20 20 20 20 20 73 71  *pCopy;.      sq
8680: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
8690: 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20  pCol->pDflt);.  
86a0: 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20      pCol->pDflt 
86b0: 3d 20 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65  = pCopy = sqlite
86c0: 33 45 78 70 72 44 75 70 28 70 45 78 70 72 29 3b  3ExprDup(pExpr);
86d0: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 70 79  .      if( pCopy
86e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
86f0: 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 43  te3TokenCopy(&pC
8700: 6f 70 79 2d 3e 73 70 61 6e 2c 20 26 70 45 78 70  opy->span, &pExp
8710: 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20  r->span);.      
8720: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
8730: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
8740: 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExpr);.}../*.**
8750: 20 44 65 73 69 67 6e 61 74 65 20 74 68 65 20 50   Designate the P
8760: 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74  RIMARY KEY for t
8770: 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74  he table.  pList
8780: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61   is a list of na
8790: 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d  mes .** of colum
87a0: 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65  ns that form the
87b0: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
87c0: 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c  f pList is NULL,
87d0: 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73   then the.** mos
87e0: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
87f0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74   column of the t
8800: 61 62 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d  able is the prim
8810: 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41  ary key..**.** A
8820: 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20   table can have 
8830: 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d  at most one prim
8840: 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65  ary key.  If the
8850: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68   table already h
8860: 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20  as.** a primary 
8870: 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20 69 73  key (and this is
8880: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d   the second prim
8890: 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72  ary key) then cr
88a0: 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  eate an.** error
88b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
88c0: 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e  RIMARY KEY is on
88d0: 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
88e0: 20 77 68 6f 73 65 20 64 61 74 61 74 79 70 65 20   whose datatype 
88f0: 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74  is INTEGER,.** t
8900: 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20  hen we will try 
8910: 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75  to use that colu
8920: 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 69 64 2e  mn as the rowid.
8930: 20 20 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e    Set the Table.
8940: 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f  iPKey.** field o
8950: 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65  f the table unde
8960: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74  r construction t
8970: 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f  o be the index o
8980: 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52  f the.** INTEGER
8990: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
89a0: 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65  umn.  Table.iPKe
89b0: 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69  y is set to -1 i
89c0: 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  f there is.** no
89d0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
89e0: 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   KEY..**.** If t
89f0: 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e  he key is not an
8a00: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
8a10: 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74   KEY, then creat
8a20: 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e  e a unique.** in
8a30: 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e  dex for the key.
8a40: 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72    No index is cr
8a50: 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45  eated for INTEGE
8a60: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a  R PRIMARY KEYs..
8a70: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
8a80: 64 64 50 72 69 6d 61 72 79 4b 65 79 28 0a 20 20  ddPrimaryKey(.  
8a90: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
8aa0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
8ab0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
8ac0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c  st *pList,  /* L
8ad0: 69 73 74 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d  ist of field nam
8ae0: 65 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  es to be indexed
8af0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
8b00: 72 2c 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20  r,      /* What 
8b10: 74 6f 20 64 6f 20 77 69 74 68 20 61 20 75 6e 69  to do with a uni
8b20: 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74  queness conflict
8b30: 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e   */.  int autoIn
8b40: 63 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  c,      /* True 
8b50: 69 66 20 74 68 65 20 41 55 54 4f 49 4e 43 52 45  if the AUTOINCRE
8b60: 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20 69 73 20  MENT keyword is 
8b70: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
8b80: 20 73 6f 72 74 4f 72 64 65 72 20 20 20 20 20 2f   sortOrder     /
8b90: 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20  * SQLITE_SO_ASC 
8ba0: 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53  or SQLITE_SO_DES
8bb0: 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  C */.){.  Table 
8bc0: 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  *pTab = pParse->
8bd0: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63 68 61  pNewTable;.  cha
8be0: 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20  r *zType = 0;.  
8bf0: 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69  int iCol = -1, i
8c00: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
8c10: 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
8c20: 41 42 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72  AB ) goto primar
8c30: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66  y_key_exit;.  if
8c40: 28 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b  ( pTab->hasPrimK
8c50: 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
8c60: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8c70: 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20  , .      "table 
8c80: 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20  \"%s\" has more 
8c90: 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79  than one primary
8ca0: 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61   key", pTab->zNa
8cb0: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72  me);.    goto pr
8cc0: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a  imary_key_exit;.
8cd0: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 68 61 73 50    }.  pTab->hasP
8ce0: 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 69 66  rimKey = 1;.  if
8cf0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
8d00: 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e    iCol = pTab->n
8d10: 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54 61  Col - 1;.    pTa
8d20: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73  b->aCol[iCol].is
8d30: 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 7d  PrimKey = 1;.  }
8d40: 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
8d50: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
8d60: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  r; i++){.      f
8d70: 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
8d80: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
8d90: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
8da0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
8db0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
8dc0: 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  e, pTab->aCol[iC
8dd0: 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  ol].zName)==0 ){
8de0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
8df0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8e00: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43    }.      if( iC
8e10: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  ol<pTab->nCol ){
8e20: 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61  .        pTab->a
8e30: 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d  Col[iCol].isPrim
8e40: 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Key = 1;.      }
8e50: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
8e60: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 20  List->nExpr>1 ) 
8e70: 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20  iCol = -1;.  }. 
8e80: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
8e90: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  iCol<pTab->nCol 
8ea0: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70  ){.    zType = p
8eb0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
8ec0: 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28  zType;.  }.  if(
8ed0: 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69 74 65   zType && sqlite
8ee0: 33 53 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20  3StrICmp(zType, 
8ef0: 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20  "INTEGER")==0.  
8f00: 20 20 20 20 20 20 26 26 20 73 6f 72 74 4f 72 64        && sortOrd
8f10: 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53  er==SQLITE_SO_AS
8f20: 43 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69  C ){.    pTab->i
8f30: 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  PKey = iCol;.   
8f40: 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d   pTab->keyConf =
8f50: 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 70 54   onError;.    pT
8f60: 61 62 2d 3e 61 75 74 6f 49 6e 63 20 3d 20 61 75  ab->autoInc = au
8f70: 74 6f 49 6e 63 3b 0a 20 20 7d 65 6c 73 65 20 69  toInc;.  }else i
8f80: 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69  f( autoInc ){.#i
8f90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8fa0: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
8fb0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8fc0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41 55 54  Msg(pParse, "AUT
8fd0: 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e  OINCREMENT is on
8fe0: 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e  ly allowed on an
8ff0: 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45 47   ".       "INTEG
9000: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 29  ER PRIMARY KEY")
9010: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
9020: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65  {.    sqlite3Cre
9030: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
9040: 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c   0, 0, 0, pList,
9050: 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30 2c 20   onError, 0, 0, 
9060: 73 6f 72 74 4f 72 64 65 72 2c 20 30 29 3b 0a 20  sortOrder, 0);. 
9070: 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20     pList = 0;.  
9080: 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  }..primary_key_e
9090: 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  xit:.  sqlite3Ex
90a0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  prListDelete(pLi
90b0: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  st);.  return;.}
90c0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
90d0: 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  w CHECK constrai
90e0: 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  nt to the table 
90f0: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
9100: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f  construction..*/
9110: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
9120: 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28  CheckConstraint(
9130: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9140: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
9150: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
9160: 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20 2f  r *pCheckExpr  /
9170: 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78 70 72  * The check expr
9180: 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66  ession */.){.#if
9190: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
91a0: 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a  _CHECK.  Table *
91b0: 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
91c0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
91d0: 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45 43 4c  pTab && !IN_DECL
91e0: 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20  ARE_VTAB ){.    
91f0: 2f 2a 20 54 68 65 20 43 48 45 43 4b 20 65 78 70  /* The CHECK exp
9200: 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20  ression must be 
9210: 64 75 70 6c 69 63 61 74 65 64 20 73 6f 20 74 68  duplicated so th
9220: 61 74 20 74 6f 6b 65 6e 73 20 72 65 66 65 72 0a  at tokens refer.
9230: 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6c 6c 6f 63      ** to malloc
9240: 65 64 20 73 70 61 63 65 20 61 6e 64 20 6e 6f 74  ed space and not
9250: 20 74 68 65 20 28 65 70 68 65 6d 65 72 61 6c 29   the (ephemeral)
9260: 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
9270: 41 54 45 20 54 41 42 4c 45 0a 20 20 20 20 2a 2a  ATE TABLE.    **
9280: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
9290: 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d    pTab->pCheck =
92a0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
92b0: 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 73 71  pTab->pCheck, sq
92c0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 43 68  lite3ExprDup(pCh
92d0: 65 63 6b 45 78 70 72 29 29 3b 0a 20 20 7d 0a 23  eckExpr));.  }.#
92e0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 45  endif.  sqlite3E
92f0: 78 70 72 44 65 6c 65 74 65 28 70 43 68 65 63 6b  xprDelete(pCheck
9300: 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
9310: 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  Set the collatio
9320: 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68  n function of th
9330: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
9340: 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c  parsed table col
9350: 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f  umn.** to the Co
9360: 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a  llSeq given..*/.
9370: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
9380: 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73 65  ollateType(Parse
9390: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
93a0: 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74  char *zType, int
93b0: 20 6e 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65   nType){.  Table
93c0: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20   *p;.  int i;.. 
93d0: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
93e0: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
93f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
9400: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 0a 20 20 69 66  p->nCol-1;..  if
9410: 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  ( sqlite3LocateC
9420: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
9430: 54 79 70 65 2c 20 6e 54 79 70 65 29 20 29 7b 0a  Type, nType) ){.
9440: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
9450: 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  .    p->aCol[i].
9460: 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 53 74  zColl = sqliteSt
9470: 72 4e 44 75 70 28 7a 54 79 70 65 2c 20 6e 54 79  rNDup(zType, nTy
9480: 70 65 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49  pe);.  .    /* I
9490: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  f the column is 
94a0: 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61  declared as "<na
94b0: 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20  me> PRIMARY KEY 
94c0: 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c  COLLATE <type>",
94d0: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20  .    ** then an 
94e0: 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65 20 62  index may have b
94f0: 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74  een created on t
9500: 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72  his column befor
9510: 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c  e the.    ** col
9520: 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20  lation type was 
9530: 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74  added. Correct t
9540: 68 69 73 20 69 66 20 69 74 20 69 73 20 74 68 65  his if it is the
9550: 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
9560: 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49    for(pIdx=p->pI
9570: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
9580: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
9590: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
95a0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  x->nColumn==1 );
95b0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
95c0: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20  >aiColumn[0]==i 
95d0: 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  ){.        pIdx-
95e0: 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e  >azColl[0] = p->
95f0: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20  aCol[i].zColl;. 
9600: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9610: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
9620: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
9630: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
9640: 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62  quence for datab
9650: 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a  ase native text.
9660: 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e  ** encoding iden
9670: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73 74  tified by the st
9680: 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67  ring zName, leng
9690: 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  th nName..**.** 
96a0: 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
96b0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
96c0: 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  nce is not avail
96d0: 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61  able, or not ava
96e0: 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65  ilable.** in the
96f0: 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65   database native
9700: 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63   encoding, the c
9710: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
9720: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a   is invoked to.*
9730: 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49 66  * request it. If
9740: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
9750: 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20  actory does not 
9760: 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73 65  supply such a se
9770: 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74  quence,.** and t
9780: 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20 61  he sequence is a
9790: 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74  vailable in anot
97a0: 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  her text encodin
97b0: 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a  g, then that is.
97c0: 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  ** returned inst
97d0: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ead..**.** If no
97e0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
97f0: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
9800: 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61  tions sequence a
9810: 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72  re available, or
9820: 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f  .** another erro
9830: 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
9840: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61  s returned and a
9850: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
9860: 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
9870: 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  pParse..**.** Th
9880: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
9890: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
98a0: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
98b0: 71 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69  q().  This routi
98c0: 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68  ne.** invokes th
98d0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
98e0: 6f 72 79 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ory if the named
98f0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f   collation canno
9900: 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e  t be found.** an
9910: 64 20 67 65 6e 65 72 61 74 65 73 20 61 6e 20 65  d generates an e
9920: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f  rror message..*/
9930: 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65  .CollSeq *sqlite
9940: 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50  3LocateCollSeq(P
9950: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
9960: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
9970: 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 73   int nName){.  s
9980: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
9990: 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e  rse->db;.  u8 en
99a0: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75  c = ENC(db);.  u
99b0: 38 20 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d  8 initbusy = db-
99c0: 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f  >init.busy;.  Co
99d0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20  llSeq *pColl;.. 
99e0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
99f0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
9a00: 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  enc, zName, nNam
9a10: 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20  e, initbusy);.  
9a20: 69 66 28 20 21 69 6e 69 74 62 75 73 79 20 26 26  if( !initbusy &&
9a30: 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f   (!pColl || !pCo
9a40: 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20  ll->xCmp) ){.   
9a50: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
9a60: 47 65 74 43 6f 6c 6c 53 65 71 28 64 62 2c 20 70  GetCollSeq(db, p
9a70: 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Coll, zName, nNa
9a80: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43  me);.    if( !pC
9a90: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  oll ){.      if(
9aa0: 20 6e 4e 61 6d 65 3c 30 20 29 7b 0a 20 20 20 20   nName<0 ){.    
9ab0: 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c      nName = strl
9ac0: 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  en(zName);.     
9ad0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
9ae0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
9af0: 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74   "no such collat
9b00: 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 25 2e  ion sequence: %.
9b10: 2a 73 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d  *s", nName, zNam
9b20: 65 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20  e);.      pColl 
9b30: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
9b40: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
9b50: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
9b60: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
9b70: 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  l increment the 
9b80: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a  schema cookie..*
9b90: 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20  *.** The schema 
9ba0: 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74  cookie is used t
9bb0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e  o determine when
9bc0: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
9bd0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
9be0: 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20  changes.  After 
9bf0: 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e  each schema chan
9c00: 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76  ge, the cookie v
9c10: 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e  alue.** changes.
9c20: 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73    When a process
9c30: 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68 65   first reads the
9c40: 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72   schema it recor
9c50: 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65  ds the.** cookie
9c60: 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20 77  .  Thereafter, w
9c70: 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20  henever it goes 
9c80: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
9c90: 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68  tabase,.** it ch
9ca0: 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20  ecks the cookie 
9cb0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
9cc0: 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20   schema has not 
9cd0: 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65  changed.** since
9ce0: 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65 61   it was last rea
9cf0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c  d..**.** This pl
9d00: 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65  an is not comple
9d10: 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f  tely bullet-proo
9d20: 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62  f.  It is possib
9d30: 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63  le for.** the sc
9d40: 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d  hema to change m
9d50: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e  ultiple times an
9d60: 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65  d for the cookie
9d70: 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61   to be.** set ba
9d80: 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75  ck to prior valu
9d90: 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20 63  e.  But schema c
9da0: 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65  hanges are infre
9db0: 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65  quent.** and the
9dc0: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
9dd0: 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65  hitting the same
9de0: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73   cookie value is
9df0: 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63   only.** 1 chanc
9e00: 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77  e in 2^32.  So w
9e10: 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68  e're safe enough
9e20: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9e30: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71  3ChangeCookie(sq
9e40: 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
9e50: 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  *v, int iDb){.  
9e60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9e70: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
9e80: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
9e90: 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  hema->schema_coo
9ea0: 6b 69 65 2b 31 2c 20 30 29 3b 0a 20 20 73 71 6c  kie+1, 0);.  sql
9eb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9ec0: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
9ed0: 44 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Db, 0);.}../*.**
9ee0: 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d   Measure the num
9ef0: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
9f00: 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70  s needed to outp
9f10: 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  ut the given.** 
9f20: 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65  identifier.  The
9f30: 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64   number returned
9f40: 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75   includes any qu
9f50: 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74  otes used.** but
9f60: 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64   does not includ
9f70: 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69  e the null termi
9f80: 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nator..**.** The
9f90: 20 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e   estimate is con
9fa0: 73 65 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d  servative.  It m
9fb0: 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
9fc0: 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72  hat what is.** r
9fd0: 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f  eally needed..*/
9fe0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e  .static int iden
9ff0: 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68  tLength(const ch
a000: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b  ar *z){.  int n;
a010: 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20  .  for(n=0; *z; 
a020: 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69  n++, z++){.    i
a030: 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b  f( *z=='"' ){ n+
a040: 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72  +; }.  }.  retur
a050: 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  n n + 2;.}../*.*
a060: 2a 20 57 72 69 74 65 20 61 6e 20 69 64 65 6e 74  * Write an ident
a070: 69 66 69 65 72 20 6f 6e 74 6f 20 74 68 65 20 65  ifier onto the e
a080: 6e 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  nd of the given 
a090: 73 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20  string.  Add.** 
a0a0: 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73  quote characters
a0b0: 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73   as needed..*/.s
a0c0: 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74  tatic void ident
a0d0: 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74  Put(char *z, int
a0e0: 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53   *pIdx, char *zS
a0f0: 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75  ignedIdent){.  u
a100: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49  nsigned char *zI
a110: 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  dent = (unsigned
a120: 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64   char*)zSignedId
a130: 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  ent;.  int i, j,
a140: 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20   needQuote;.  i 
a150: 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a  = *pIdx;.  for(j
a160: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
a170: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73  ++){.    if( !is
a180: 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29  alnum(zIdent[j])
a190: 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27   && zIdent[j]!='
a1a0: 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  _' ) break;.  }.
a1b0: 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 20 7a    needQuote =  z
a1c0: 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69  Ident[j]!=0 || i
a1d0: 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d  sdigit(zIdent[0]
a1e0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
a1f0: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65      || sqlite3Ke
a200: 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74  ywordCode(zIdent
a210: 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69  , j)!=TK_ID;.  i
a220: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
a230: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66  [i++] = '"';.  f
a240: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
a250: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69  ]; j++){.    z[i
a260: 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b  ++] = zIdent[j];
a270: 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b  .    if( zIdent[
a280: 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d  j]=='"' ) z[i++]
a290: 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66   = '"';.  }.  if
a2a0: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
a2b0: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b  i++] = '"';.  z[
a2c0: 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20  i] = 0;.  *pIdx 
a2d0: 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = i;.}../*.** Ge
a2e0: 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20  nerate a CREATE 
a2f0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
a300: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
a310: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62  the given.** tab
a320: 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68  le.  Memory to h
a330: 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20  old the text of 
a340: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
a350: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f   obtained.** fro
a360: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
a370: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
a380: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
a390: 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  g function..*/.s
a3a0: 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61  tatic char *crea
a3b0: 74 65 54 61 62 6c 65 53 74 6d 74 28 54 61 62 6c  teTableStmt(Tabl
a3c0: 65 20 2a 70 2c 20 69 6e 74 20 69 73 54 65 6d 70  e *p, int isTemp
a3d0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e  ){.  int i, k, n
a3e0: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b  ;.  char *zStmt;
a3f0: 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a  .  char *zSep, *
a400: 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 2c 20 2a 7a  zSep2, *zEnd, *z
a410: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
a420: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72  ;.  n = 0;.  for
a430: 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c  (pCol = p->aCol,
a440: 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b   i=0; i<p->nCol;
a450: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
a460: 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e     n += identLen
a470: 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  gth(pCol->zName)
a480: 3b 0a 20 20 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e  ;.    z = pCol->
a490: 7a 54 79 70 65 3b 0a 20 20 20 20 69 66 28 20 7a  zType;.    if( z
a4a0: 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 28   ){.      n += (
a4b0: 73 74 72 6c 65 6e 28 7a 29 20 2b 20 31 29 3b 0a  strlen(z) + 1);.
a4c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e 20 2b 3d      }.  }.  n +=
a4d0: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e   identLength(p->
a4e0: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c  zName);.  if( n<
a4f0: 35 30 20 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d  50 ){.    zSep =
a500: 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d   "";.    zSep2 =
a510: 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d   ",";.    zEnd =
a520: 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   ")";.  }else{. 
a530: 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22     zSep = "\n  "
a540: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
a550: 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20  \n  ";.    zEnd 
a560: 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e  = "\n)";.  }.  n
a570: 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43   += 35 + 6*p->nC
a580: 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71  ol;.  zStmt = sq
a590: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e  liteMallocRaw( n
a5a0: 20 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d   );.  if( zStmt=
a5b0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
a5c0: 20 73 74 72 63 70 79 28 7a 53 74 6d 74 2c 20 21   strcpy(zStmt, !
a5d0: 4f 4d 49 54 5f 54 45 4d 50 44 42 26 26 69 73 54  OMIT_TEMPDB&&isT
a5e0: 65 6d 70 20 3f 20 22 43 52 45 41 54 45 20 54 45  emp ? "CREATE TE
a5f0: 4d 50 20 54 41 42 4c 45 20 22 3a 22 43 52 45 41  MP TABLE ":"CREA
a600: 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b  TE TABLE ");.  k
a610: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29   = strlen(zStmt)
a620: 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74  ;.  identPut(zSt
a630: 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65  mt, &k, p->zName
a640: 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20  );.  zStmt[k++] 
a650: 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f  = '(';.  for(pCo
a660: 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20  l=p->aCol, i=0; 
a670: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  i<p->nCol; i++, 
a680: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72  pCol++){.    str
a690: 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  cpy(&zStmt[k], z
a6a0: 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73  Sep);.    k += s
a6b0: 74 72 6c 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29  trlen(&zStmt[k])
a6c0: 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65  ;.    zSep = zSe
a6d0: 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74  p2;.    identPut
a6e0: 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c  (zStmt, &k, pCol
a6f0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ->zName);.    if
a700: 28 20 28 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79  ( (z = pCol->zTy
a710: 70 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  pe)!=0 ){.      
a720: 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27  zStmt[k++] = ' '
a730: 3b 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 26  ;.      strcpy(&
a740: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 29 3b 0a 20 20  zStmt[k], z);.  
a750: 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28      k += strlen(
a760: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  z);.    }.  }.  
a770: 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d  strcpy(&zStmt[k]
a780: 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72  , zEnd);.  retur
a790: 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zStmt;.}../*.*
a7a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
a7b0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f  s called to repo
a7c0: 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22  rt the final ")"
a7d0: 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73   that terminates
a7e0: 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41 42  .** a CREATE TAB
a7f0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
a800: 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74  .** The table st
a810: 72 75 63 74 75 72 65 20 74 68 61 74 20 6f 74 68  ructure that oth
a820: 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  er action routin
a830: 65 73 20 68 61 76 65 20 62 65 65 6e 20 62 75 69  es have been bui
a840: 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65  lding.** is adde
a850: 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61  d to the interna
a860: 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61  l hash tables, a
a870: 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72  ssuming no error
a880: 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72  s have.** occurr
a890: 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74  ed..**.** An ent
a8a0: 72 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ry for the table
a8b0: 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20   is made in the 
a8c0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20  master table on 
a8d0: 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20  disk, unless.** 
a8e0: 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72  this is a tempor
a8f0: 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d  ary table or db-
a900: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20  >init.busy==1.  
a910: 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75  When db->init.bu
a920: 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e  sy==1.** it mean
a930: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
a940: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
a950: 65 72 20 74 61 62 6c 65 20 62 65 63 61 75 73 65  er table because
a960: 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e   we just.** conn
a970: 65 63 74 65 64 20 74 6f 20 74 68 65 20 64 61 74  ected to the dat
a980: 61 62 61 73 65 20 6f 72 20 62 65 63 61 75 73 65  abase or because
a990: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
a9a0: 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20  er table has.** 
a9b0: 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 64  recently changed
a9c0: 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66  , so the entry f
a9d0: 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c  or this table al
a9e0: 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a  ready exists in.
a9f0: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ** the sqlite_ma
aa00: 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20  ster table.  We 
aa10: 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63  do not want to c
aa20: 72 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a  reate it again..
aa30: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65  **.** If the pSe
aa40: 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73  lect argument is
aa50: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65   not NULL, it me
aa60: 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 72 6f  ans that this ro
aa70: 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c  utine.** was cal
aa80: 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  led to create a 
aa90: 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20  table generated 
aaa0: 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41  from a .** "CREA
aab0: 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20  TE TABLE ... AS 
aac0: 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74  SELECT ..." stat
aad0: 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75  ement.  The colu
aae0: 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74  mn names of.** t
aaf0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c  he new table wil
ab00: 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65 73 75  l match the resu
ab10: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
ab20: 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  LECT..*/.void sq
ab30: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 0a 20  lite3EndTable(. 
ab40: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
ab50: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
ab60: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  e context */.  T
ab70: 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20  oken *pCons,    
ab80: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27 2c         /* The ',
ab90: 27 20 74 6f 6b 65 6e 20 61 66 74 65 72 20 74 68  ' token after th
aba0: 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65  e last column de
abb0: 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  fn. */.  Token *
abc0: 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  pEnd,           
abd0: 20 2f 2a 20 54 68 65 20 66 69 6e 61 6c 20 27 29   /* The final ')
abe0: 27 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 43  ' token in the C
abf0: 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20  REATE TABLE */. 
ac00: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
ac10: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
ac20: 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45 41 54  ct from a "CREAT
ac30: 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 22  E ... AS SELECT"
ac40: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
ac50: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
ac60: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
ac70: 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28   int iDb;..  if(
ac80: 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65   (pEnd==0 && pSe
ac90: 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50 61 72  lect==0) || pPar
aca0: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
acb0: 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
acc0: 29 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  ) ) {.    return
acd0: 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 70 50 61 72  ;.  }.  p = pPar
ace0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
acf0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
ad00: 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  rn;..  assert( !
ad10: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c  db->init.busy ||
ad20: 20 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20   !pSelect );..  
ad30: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
ad40: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
ad50: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66  ->pSchema);..#if
ad60: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ad70: 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f  _CHECK.  /* Reso
ad80: 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c  lve names in all
ad90: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
ada0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20  t expressions.. 
adb0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43 68   */.  if( p->pCh
adc0: 65 63 6b 20 29 7b 0a 20 20 20 20 53 72 63 4c 69  eck ){.    SrcLi
add0: 73 74 20 73 53 72 63 3b 20 20 20 20 20 20 20 20  st sSrc;        
ade0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61             /* Fa
adf0: 6b 65 20 53 72 63 4c 69 73 74 20 66 6f 72 20 70  ke SrcList for p
ae00: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
ae10: 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74   */.    NameCont
ae20: 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20  ext sNC;        
ae30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
ae40: 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 50 61 72  context for pPar
ae50: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f  se->pNewTable */
ae60: 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e  ..    memset(&sN
ae70: 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
ae80: 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ));.    memset(&
ae90: 73 53 72 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sSrc, 0, sizeof(
aea0: 73 53 72 63 29 29 3b 0a 20 20 20 20 73 53 72 63  sSrc));.    sSrc
aeb0: 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 73  .nSrc = 1;.    s
aec0: 53 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d  Src.a[0].zName =
aed0: 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73   p->zName;.    s
aee0: 53 72 63 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20  Src.a[0].pTab = 
aef0: 70 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d  p;.    sSrc.a[0]
af00: 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  .iCursor = -1;. 
af10: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
af20: 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e  pParse;.    sNC.
af30: 70 53 72 63 4c 69 73 74 20 3d 20 26 73 53 72 63  pSrcList = &sSrc
af40: 3b 0a 20 20 20 20 73 4e 43 2e 69 73 43 68 65 63  ;.    sNC.isChec
af50: 6b 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 73  k = 1;.    if( s
af60: 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
af70: 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  eNames(&sNC, p->
af80: 70 43 68 65 63 6b 29 20 29 7b 0a 20 20 20 20 20  pCheck) ){.     
af90: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
afa0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65   }.#endif /* !de
afb0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
afc0: 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f  T_CHECK) */..  /
afd0: 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69  * If the db->ini
afe0: 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20 6d  t.busy is 1 it m
aff0: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
b000: 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20  ing the SQL off 
b010: 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65  the.  ** "sqlite
b020: 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c  _master" or "sql
b030: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22  ite_temp_master"
b040: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69   table on the di
b050: 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e  sk..  ** So do n
b060: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
b070: 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74  disk again.  Ext
b080: 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61  ract the root pa
b090: 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66  ge number.  ** f
b0a0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  or the table fro
b0b0: 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e  m the db->init.n
b0c0: 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28  ewTnum field.  (
b0d0: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  The page number.
b0e0: 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65    ** should have
b0f0: 20 62 65 65 6e 20 70 75 74 20 74 68 65 72 65 20   been put there 
b100: 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65  by the sqliteOpe
b110: 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20  nCb routine.).  
b120: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
b130: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 70 2d  t.busy ){.    p-
b140: 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74  >tnum = db->init
b150: 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20  .newTnum;.  }.. 
b160: 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69   /* If not initi
b170: 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72  alizing, then cr
b180: 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f  eate a record fo
b190: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a  r the new table.
b1a0: 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49    ** in the SQLI
b1b0: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
b1c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
b1d0: 20 20 54 68 65 20 72 65 63 6f 72 64 20 6e 75 6d    The record num
b1e0: 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ber.  ** for the
b1f0: 20 6e 65 77 20 74 61 62 6c 65 20 65 6e 74 72 79   new table entry
b200: 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
b210: 62 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  be on the stack.
b220: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
b230: 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52  is is a TEMPORAR
b240: 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74  Y table, write t
b250: 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  he entry into th
b260: 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a  e auxiliary.  **
b270: 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
b280: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64   into the main d
b290: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
b2a0: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
b2b0: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69  it.busy ){.    i
b2c0: 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a  nt n;.    Vdbe *
b2d0: 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79  v;.    char *zTy
b2e0: 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22  pe;    /* "view"
b2f0: 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20   or "table" */. 
b300: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b     char *zType2;
b310: 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20     /* "VIEW" or 
b320: 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63  "TABLE" */.    c
b330: 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f  har *zStmt;    /
b340: 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 43 52  * Text of the CR
b350: 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52  EATE TABLE or CR
b360: 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d  EATE VIEW statem
b370: 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20  ent */..    v = 
b380: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
b390: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
b3a0: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  v==0 ) return;..
b3b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b3c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
b3d0: 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  , 0, 0);..    /*
b3e0: 20 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74   Create the root
b3f0: 70 61 67 65 20 66 6f 72 20 74 68 65 20 6e 65 77  page for the new
b400: 20 74 61 62 6c 65 20 61 6e 64 20 70 75 73 68 20   table and push 
b410: 69 74 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  it onto the stac
b420: 6b 2e 0a 20 20 20 20 2a 2a 20 41 20 76 69 65 77  k..    ** A view
b430: 20 68 61 73 20 6e 6f 20 72 6f 6f 74 70 61 67 65   has no rootpage
b440: 2c 20 73 6f 20 6a 75 73 74 20 70 75 73 68 20 61  , so just push a
b450: 20 7a 65 72 6f 20 6f 6e 74 6f 20 74 68 65 20 73   zero onto the s
b460: 74 61 63 6b 20 66 6f 72 0a 20 20 20 20 2a 2a 20  tack for.    ** 
b470: 76 69 65 77 73 2e 20 20 49 6e 69 74 69 61 6c 69  views.  Initiali
b480: 7a 65 20 7a 54 79 70 65 20 61 74 20 74 68 65 20  ze zType at the 
b490: 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 2a  same time..    *
b4a0: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65  /.    if( p->pSe
b4b0: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lect==0 ){.     
b4c0: 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61   /* A regular ta
b4d0: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79  ble */.      zTy
b4e0: 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20  pe = "table";.  
b4f0: 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41      zType2 = "TA
b500: 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51  BLE";.#ifndef SQ
b510: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
b520: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b530: 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20  /* A view */.   
b540: 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77     zType = "view
b550: 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20  ";.      zType2 
b560: 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66  = "VIEW";.#endif
b570: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
b580: 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45 41  f this is a CREA
b590: 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20 53  TE TABLE xx AS S
b5a0: 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75  ELECT ..., execu
b5b0: 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  te the SELECT.  
b5c0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
b5d0: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e  o populate the n
b5e0: 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f  ew table. The ro
b5f0: 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66  ot-page number f
b600: 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65  or the.    ** ne
b610: 77 20 74 61 62 6c 65 20 69 73 20 6f 6e 20 74 68  w table is on th
b620: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 76 64 62  e top of the vdb
b630: 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 0a  e stack..    **.
b640: 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20      ** Once the 
b650: 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20  SELECT has been 
b660: 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33  coded by sqlite3
b670: 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20  Select(), it is 
b680: 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74  in a.    ** suit
b690: 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75  able state to qu
b6a0: 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ery for the colu
b6b0: 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70  mn names and typ
b6c0: 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20  es to be used.  
b6d0: 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20    ** by the new 
b6e0: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  table..    **.  
b6f0: 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61    ** A shared-ca
b700: 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69  che write-lock i
b710: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74  s not required t
b720: 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e  o write to the n
b730: 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a  ew table,.    **
b740: 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63   as a schema-loc
b750: 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  k must have alre
b760: 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ady been obtaine
b770: 64 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20  d to create it. 
b780: 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73  Since.    ** a s
b790: 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75  chema-lock exclu
b7a0: 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61  des all other da
b7b0: 74 61 62 61 73 65 20 75 73 65 72 73 2c 20 74 68  tabase users, th
b7c0: 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75  e write-lock wou
b7d0: 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64  ld.    ** be red
b7e0: 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20  undant..    */. 
b7f0: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
b800: 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
b810: 53 65 6c 54 61 62 3b 0a 20 20 20 20 20 20 73 71  SelTab;.      sq
b820: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b830: 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
b840: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b850: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
b860: 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a  teger, iDb, 0);.
b870: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b880: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
b890: 6e 57 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20  nWrite, 1, 0);. 
b8a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61       pParse->nTa
b8b0: 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c  b = 2;.      sql
b8c0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
b8d0: 65 2c 20 70 53 65 6c 65 63 74 2c 20 53 52 54 5f  e, pSelect, SRT_
b8e0: 54 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20  Table, 1, 0, 0, 
b8f0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
b900: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b910: 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29   OP_Close, 1, 0)
b920: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
b930: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
b940: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d         pSelTab =
b950: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
b960: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
b970: 2c 20 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  , 0, pSelect);. 
b980: 20 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54         if( pSelT
b990: 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ab==0 ) return;.
b9a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b9b0: 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  p->aCol==0 );.  
b9c0: 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20        p->nCol = 
b9d0: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
b9e0: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d         p->aCol =
b9f0: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a   pSelTab->aCol;.
ba00: 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d          pSelTab-
ba10: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >nCol = 0;.     
ba20: 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c     pSelTab->aCol
ba30: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71   = 0;.        sq
ba40: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
ba50: 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  (0, pSelTab);.  
ba60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
ba70: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
ba80: 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
ba90: 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74   the CREATE stat
baa0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28  ement */.    if(
bab0: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
bac0: 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65    zStmt = create
bad0: 54 61 62 6c 65 53 74 6d 74 28 70 2c 20 70 2d 3e  TableStmt(p, p->
bae0: 70 53 63 68 65 6d 61 3d 3d 70 50 61 72 73 65 2d  pSchema==pParse-
baf0: 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68  >db->aDb[1].pSch
bb00: 65 6d 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ema);.    }else{
bb10: 0a 20 20 20 20 20 20 6e 20 3d 20 70 45 6e 64 2d  .      n = pEnd-
bb20: 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61  >z - pParse->sNa
bb30: 6d 65 54 6f 6b 65 6e 2e 7a 20 2b 20 31 3b 0a 20  meToken.z + 1;. 
bb40: 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c       zStmt = sql
bb50: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 43 52 45  ite3MPrintf("CRE
bb60: 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54  ATE %s %.*s", zT
bb70: 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d  ype2, n, pParse-
bb80: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a  >sNameToken.z);.
bb90: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20      }..    /* A 
bba0: 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63  slot for the rec
bbb0: 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64 79 20  ord has already 
bbc0: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69  been allocated i
bbd0: 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51  n the .    ** SQ
bbe0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
bbf0: 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64  e.  We just need
bc00: 20 74 6f 20 75 70 64 61 74 65 20 74 68 61 74 20   to update that 
bc10: 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20  slot with all.  
bc20: 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61    ** the informa
bc30: 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65  tion we've colle
bc40: 63 74 65 64 2e 20 20 54 68 65 20 72 6f 77 69 64  cted.  The rowid
bc50: 20 66 6f 72 20 74 68 65 20 70 72 65 61 6c 6c 6f   for the preallo
bc60: 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 73 6c 6f  cated.    ** slo
bc70: 74 20 69 73 20 74 68 65 20 32 6e 64 20 69 74 65  t is the 2nd ite
bc80: 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  m on the stack. 
bc90: 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   The top of the 
bca0: 73 74 61 63 6b 20 69 73 20 74 68 65 0a 20 20 20  stack is the.   
bcb0: 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 66 6f   ** root page fo
bcc0: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  r the new table 
bcd0: 28 6f 72 20 61 20 30 20 69 66 20 74 68 69 73 20  (or a 0 if this 
bce0: 69 73 20 61 20 76 69 65 77 29 2e 0a 20 20 20 20  is a view)..    
bcf0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  */.    sqlite3Ne
bd00: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
bd10: 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54 45 20  ,.      "UPDATE 
bd20: 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20  %Q.%s ".        
bd30: 20 22 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c   "SET type='%s',
bd40: 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61   name=%Q, tbl_na
bd50: 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d  me=%Q, rootpage=
bd60: 23 30 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20  #0, sql=%Q ".   
bd70: 20 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64      "WHERE rowid
bd80: 3d 23 31 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e  =#1",.      db->
bd90: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
bda0: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
bdb0: 29 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a  ),.      zType,.
bdc0: 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
bdd0: 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
bde0: 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20        zStmt.    
bdf0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
be00: 65 28 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73 71  e(zStmt);.    sq
be10: 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
be20: 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 0a  e(db, v, iDb);..
be30: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
be40: 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
be50: 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  T.    /* Check t
be60: 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65 65 64  o see if we need
be70: 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71   to create an sq
be80: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
be90: 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b  ble for.    ** k
bea0: 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20  eeping track of 
beb0: 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65  autoincrement ke
bec0: 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ys..    */.    i
bed0: 66 28 20 70 2d 3e 61 75 74 6f 49 6e 63 20 29 7b  f( p->autoInc ){
bee0: 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d  .      Db *pDb =
bef0: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
bf00: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70        if( pDb->p
bf10: 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d  Schema->pSeqTab=
bf20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
bf30: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
bf40: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
bf50: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
bf60: 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65   %Q.sqlite_seque
bf70: 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a  nce(name,seq)",.
bf80: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a            pDb->z
bf90: 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a  Name.        );.
bfa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
bfb0: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70  ndif..    /* Rep
bfc0: 61 72 73 65 20 65 76 65 72 79 74 68 69 6e 67 20  arse everything 
bfd0: 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e  to update our in
bfe0: 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75  ternal data stru
bff0: 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71  ctures */.    sq
c000: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
c010: 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20  OP_ParseSchema, 
c020: 69 44 62 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  iDb, 0,.        
c030: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
c040: 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 22 2c 70  tbl_name='%q'",p
c050: 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e  ->zName), P3_DYN
c060: 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  AMIC);.  }...  /
c070: 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20  * Add the table 
c080: 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  to the in-memory
c090: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
c0a0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
c0b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
c0c0: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61  init.busy && pPa
c0d0: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a  rse->nErr==0 ){.
c0e0: 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b      Table *pOld;
c0f0: 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  .    FKey *pFKey
c100: 3b 20 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  ; .    Schema *p
c110: 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68  Schema = p->pSch
c120: 65 6d 61 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20  ema;.    pOld = 
c130: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
c140: 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  t(&pSchema->tblH
c150: 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73  ash, p->zName, s
c160: 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b  trlen(p->zName)+
c170: 31 2c 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  1,p);.    if( pO
c180: 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ld ){.      asse
c190: 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20  rt( p==pOld );  
c1a0: 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
c1b0: 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64  ave failed insid
c1c0: 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a  e HashInsert() *
c1d0: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  /.      return;.
c1e0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
c1f0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
c200: 4e 5f 4b 45 59 0a 20 20 20 20 66 6f 72 28 70 46  N_KEY.    for(pF
c210: 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46  Key=p->pFKey; pF
c220: 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79  Key; pFKey=pFKey
c230: 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20  ->pNextFrom){.  
c240: 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74      int nTo = st
c250: 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29  rlen(pFKey->zTo)
c260: 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 4b 65   + 1;.      pFKe
c270: 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c  y->pNextTo = sql
c280: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 53  ite3HashFind(&pS
c290: 63 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46  chema->aFKey, pF
c2a0: 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a  Key->zTo, nTo);.
c2b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 73        sqlite3Has
c2c0: 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61  hInsert(&pSchema
c2d0: 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e  ->aFKey, pFKey->
c2e0: 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29  zTo, nTo, pFKey)
c2f0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
c300: 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54     pParse->pNewT
c310: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62  able = 0;.    db
c320: 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20  ->nTable++;.    
c330: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
c340: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
c350: 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s;..#ifndef SQLI
c360: 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42  TE_OMIT_ALTERTAB
c370: 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70  LE.    if( !p->p
c380: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
c390: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
c3a0: 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
c3b0: 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  *)pParse->sNameT
c3c0: 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e  oken.z;.      in
c3d0: 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61  t nName;.      a
c3e0: 73 73 65 72 74 28 20 21 70 53 65 6c 65 63 74 20  ssert( !pSelect 
c3f0: 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e 64  && pCons && pEnd
c400: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43   );.      if( pC
c410: 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  ons->z==0 ){.   
c420: 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e       pCons = pEn
c430: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
c440: 20 6e 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20   nName = (const 
c450: 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20  char *)pCons->z 
c460: 2d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 70  - zName;.      p
c470: 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d  ->addColOffset =
c480: 20 31 33 20 2b 20 73 71 6c 69 74 65 33 75 74 66   13 + sqlite3utf
c490: 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20  8CharLen(zName, 
c4a0: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65  nName);.    }.#e
c4b0: 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  ndif.  }.}..#ifn
c4c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c4d0: 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  VIEW./*.** The p
c4e0: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
c4f0: 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65   routine in orde
c500: 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  r to create a ne
c510: 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73  w VIEW.*/.void s
c520: 71 6c 69 74 65 33 43 72 65 61 74 65 56 69 65 77  qlite3CreateView
c530: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
c540: 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  e,     /* The pa
c550: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
c560: 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e  .  Token *pBegin
c570: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45  ,     /* The CRE
c580: 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
c590: 65 67 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d  egins the statem
c5a0: 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ent */.  Token *
c5b0: 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54  pName1,     /* T
c5c0: 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f  he token that ho
c5d0: 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  lds the name of 
c5e0: 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f  the view */.  To
c5f0: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
c600: 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68   /* The token th
c610: 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  at holds the nam
c620: 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f  e of the view */
c630: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
c640: 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43  ct,   /* A SELEC
c650: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
c660: 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
c670: 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69   new view */.  i
c680: 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20  nt isTemp,      
c690: 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20    /* TRUE for a 
c6a0: 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a  TEMPORARY view *
c6b0: 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20  /.  int noErr   
c6c0: 20 20 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65         /* Suppre
c6d0: 73 73 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ss error message
c6e0: 73 20 69 66 20 56 49 45 57 20 61 6c 72 65 61 64  s if VIEW alread
c6f0: 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20  y exists */.){. 
c700: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
c710: 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   n;.  const unsi
c720: 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20  gned char *z;.  
c730: 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62  Token sEnd;.  Db
c740: 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f  Fixer sFix;.  To
c750: 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 20 20 69 6e  ken *pName;.  in
c760: 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50  t iDb;..  if( pP
c770: 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a  arse->nVar>0 ){.
c780: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
c790: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70 61 72  Msg(pParse, "par
c7a0: 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20  ameters are not 
c7b0: 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73  allowed in views
c7c0: 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  ");.    sqlite3S
c7d0: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c  electDelete(pSel
c7e0: 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ect);.    return
c7f0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
c800: 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65  tartTable(pParse
c810: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
c820: 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20  , isTemp, 1, 0, 
c830: 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50  noErr);.  p = pP
c840: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
c850: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
c860: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
c870: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
c880: 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b  Delete(pSelect);
c890: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
c8a0: 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  .  sqlite3TwoPar
c8b0: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
c8c0: 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
c8d0: 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20 73  Name);.  iDb = s
c8e0: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
c8f0: 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
c900: 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 69  p->pSchema);.  i
c910: 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  f( sqlite3FixIni
c920: 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
c930: 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e   iDb, "view", pN
c940: 61 6d 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69  ame).    && sqli
c950: 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46  te3FixSelect(&sF
c960: 69 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29  ix, pSelect).  )
c970: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
c980: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63  ectDelete(pSelec
c990: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
c9a0: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61    }..  /* Make a
c9b0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74   copy of the ent
c9c0: 69 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ire SELECT state
c9d0: 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
c9e0: 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a  s the view..  **
c9f0: 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65   This will force
ca00: 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f   all the Expr.to
ca10: 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20  ken.z values to 
ca20: 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20  be dynamically. 
ca30: 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61   ** allocated ra
ca40: 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20  ther than point 
ca50: 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  to the input str
ca60: 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e  ing - which mean
ca70: 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79  s that.  ** they
ca80: 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66   will persist af
ca90: 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ter the current 
caa0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63  sqlite3_exec() c
cab0: 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a  all returns..  *
cac0: 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d  /.  p->pSelect =
cad0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
cae0: 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71  p(pSelect);.  sq
caf0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
cb00: 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66  e(pSelect);.  if
cb10: 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46  ( sqlite3MallocF
cb20: 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 72  ailed() ){.    r
cb30: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
cb40: 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e   !pParse->db->in
cb50: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73  it.busy ){.    s
cb60: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
cb70: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
cb80: 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c   p);.  }..  /* L
cb90: 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  ocate the end of
cba0: 20 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57   the CREATE VIEW
cbb0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b   statement.  Mak
cbc0: 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a  e sEnd point to.
cbd0: 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20    ** the end..  
cbe0: 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72  */.  sEnd = pPar
cbf0: 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a  se->sLastToken;.
cc00: 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21    if( sEnd.z[0]!
cc10: 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21  =0 && sEnd.z[0]!
cc20: 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64  =';' ){.    sEnd
cc30: 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20  .z += sEnd.n;.  
cc40: 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a  }.  sEnd.n = 0;.
cc50: 20 20 6e 20 3d 20 73 45 6e 64 2e 7a 20 2d 20 70    n = sEnd.z - p
cc60: 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20  Begin->z;.  z = 
cc70: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
cc80: 63 68 61 72 2a 29 70 42 65 67 69 6e 2d 3e 7a 3b  char*)pBegin->z;
cc90: 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
cca0: 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c   (z[n-1]==';' ||
ccb0: 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29   isspace(z[n-1])
ccc0: 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45  ) ){ n--; }.  sE
ccd0: 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a  nd.z = &z[n-1];.
cce0: 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20    sEnd.n = 1;.. 
ccf0: 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45   /* Use sqlite3E
cd00: 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64  ndTable() to add
cd10: 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65   the view to the
cd20: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
cd30: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
cd40: 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  3EndTable(pParse
cd50: 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a  , 0, &sEnd, 0);.
cd60: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64    return;.}.#end
cd70: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
cd80: 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21  T_VIEW */..#if !
cd90: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
cda0: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
cdb0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
cdc0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
cdd0: 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  /*.** The Table 
cde0: 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65  structure pTable
cdf0: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45   is really a VIE
ce00: 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  W.  Fill in the 
ce10: 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
ce20: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76  columns of the v
ce30: 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c  iew in the pTabl
ce40: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  e structure.  Re
ce50: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a  turn the number.
ce60: 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  ** of errors.  I
ce70: 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65  f an error is se
ce80: 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  en leave an erro
ce90: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
cea0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f  rse->zErrMsg..*/
ceb0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77  .int sqlite3View
cec0: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50  GetColumnNames(P
ced0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
cee0: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
cef0: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20  Table *pSelTab; 
cf00: 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c    /* A fake tabl
cf10: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20  e from which we 
cf20: 67 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 73  get the result s
cf30: 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  et */.  Select *
cf40: 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70  pSel;     /* Cop
cf50: 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  y of the SELECT 
cf60: 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
cf70: 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  the view */.  in
cf80: 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20  t nErr = 0;     
cf90: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72  /* Number of err
cfa0: 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ors encountered 
cfb0: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
cfc0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
cfd0: 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20  arily holds the 
cfe0: 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  number of cursor
cff0: 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 0a 20  s assigned */.. 
d000: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20   assert( pTable 
d010: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
d020: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
d030: 41 42 4c 45 0a 20 20 69 66 28 20 73 71 6c 69 74  ABLE.  if( sqlit
d040: 65 33 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63  e3VtabCallConnec
d050: 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  t(pParse, pTable
d060: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
d070: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
d080: 7d 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  }.  if( IsVirtua
d090: 6c 28 70 54 61 62 6c 65 29 20 29 20 72 65 74 75  l(pTable) ) retu
d0a0: 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  rn 0;.#endif..#i
d0b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d0c0: 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f  T_VIEW.  /* A po
d0d0: 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e  sitive nCol mean
d0e0: 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61  s the columns na
d0f0: 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65  mes for this vie
d100: 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61  w are.  ** alrea
d110: 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20  dy known..  */. 
d120: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
d130: 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  l>0 ) return 0;.
d140: 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65  .  /* A negative
d150: 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69   nCol is a speci
d160: 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e  al marker meanin
d170: 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75  g that we are cu
d180: 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79  rrently.  ** try
d190: 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  ing to compute t
d1a0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  he column names.
d1b0: 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68    If we enter th
d1c0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a  is routine with.
d1d0: 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20    ** a negative 
d1e0: 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  nCol, it means t
d1f0: 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73  wo or more views
d200: 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69   form a loop, li
d210: 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  ke this:.  **.  
d220: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
d230: 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54  EW one AS SELECT
d240: 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a   * FROM two;.  *
d250: 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
d260: 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20  W two AS SELECT 
d270: 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a  * FROM one;.  **
d280: 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  .  ** Actually, 
d290: 74 68 69 73 20 65 72 72 6f 72 20 69 73 20 63 61  this error is ca
d2a0: 75 67 68 74 20 70 72 65 76 69 6f 75 73 6c 79 20  ught previously 
d2b0: 61 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f  and so the follo
d2c0: 77 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20 73  wing test.  ** s
d2d0: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 66 61 69  hould always fai
d2e0: 6c 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20  l.  But we will 
d2f0: 6c 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61 63  leave it in plac
d300: 65 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66  e just to be saf
d310: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  e..  */.  if( pT
d320: 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a  able->nCol<0 ){.
d330: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
d340: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65  Msg(pParse, "vie
d350: 77 20 25 73 20 69 73 20 63 69 72 63 75 6c 61 72  w %s is circular
d360: 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61  ly defined", pTa
d370: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  ble->zName);.   
d380: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
d390: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
d3a0: 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f  >nCol>=0 );..  /
d3b0: 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
d3c0: 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77   far, it means w
d3d0: 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74  e need to comput
d3e0: 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  e the table name
d3f0: 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  s..  ** Note tha
d400: 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  t the call to sq
d410: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
d420: 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78  Select() will ex
d430: 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a  pand any.  ** "*
d440: 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  " elements in th
d450: 65 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66  e results set of
d460: 20 74 68 65 20 76 69 65 77 20 61 6e 64 20 77 69   the view and wi
d470: 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72  ll assign cursor
d480: 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c  s.  ** to the el
d490: 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52  ements of the FR
d4a0: 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20  OM clause.  But 
d4b0: 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  we do not want t
d4c0: 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a  hese changes.  *
d4d0: 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e  * to be permanen
d4e0: 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75  t.  So the compu
d4f0: 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f  tation is done o
d500: 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  n a copy of the 
d510: 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74  SELECT.  ** stat
d520: 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e  ement that defin
d530: 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a  es the view..  *
d540: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  /.  assert( pTab
d550: 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20  le->pSelect );. 
d560: 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53   pSel = sqlite3S
d570: 65 6c 65 63 74 44 75 70 28 70 54 61 62 6c 65 2d  electDup(pTable-
d580: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28  >pSelect);.  if(
d590: 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 6e 20 3d   pSel ){.    n =
d5a0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
d5b0: 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
d5c0: 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
d5d0: 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72  Parse, pSel->pSr
d5e0: 63 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e  c);.    pTable->
d5f0: 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 70  nCol = -1;.    p
d600: 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
d610: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
d620: 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65  t(pParse, 0, pSe
d630: 6c 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  l);.    pParse->
d640: 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66  nTab = n;.    if
d650: 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20  ( pSelTab ){.   
d660: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c     assert( pTabl
d670: 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  e->aCol==0 );.  
d680: 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
d690: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c   = pSelTab->nCol
d6a0: 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  ;.      pTable->
d6b0: 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  aCol = pSelTab->
d6c0: 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c  aCol;.      pSel
d6d0: 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->nCol = 0;. 
d6e0: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43       pSelTab->aC
d6f0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  ol = 0;.      sq
d700: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
d710: 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  (0, pSelTab);.  
d720: 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68      pTable->pSch
d730: 65 6d 61 2d 3e 66 6c 61 67 73 20 7c 3d 20 44 42  ema->flags |= DB
d740: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 20  _UnresetViews;. 
d750: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d760: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
d770: 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  ;.      nErr++;.
d780: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
d790: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  3SelectDelete(pS
d7a0: 65 6c 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  el);.  } else {.
d7b0: 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a      nErr++;.  }.
d7c0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
d7d0: 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20  _OMIT_VIEW */.  
d7e0: 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d  return nErr;  .}
d7f0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
d800: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
d810: 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
d820: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
d830: 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a  RTUALTABLE) */..
d840: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d850: 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43  MIT_VIEW./*.** C
d860: 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
d870: 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79  names from every
d880: 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73   VIEW in databas
d890: 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  e idx..*/.static
d8a0: 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77   void sqliteView
d8b0: 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33  ResetAll(sqlite3
d8c0: 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a   *db, int idx){.
d8d0: 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20    HashElem *i;. 
d8e0: 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65   if( !DbHasPrope
d8f0: 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
d900: 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20  UnresetViews) ) 
d910: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
d920: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
d930: 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53  &db->aDb[idx].pS
d940: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
d950: 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e   i;i=sqliteHashN
d960: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62  ext(i)){.    Tab
d970: 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
d980: 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
d990: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
d9a0: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ect ){.      sql
d9b0: 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61  iteResetColumnNa
d9c0: 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20 20 7d  mes(pTab);.    }
d9d0: 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72  .  }.  DbClearPr
d9e0: 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20  operty(db, idx, 
d9f0: 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29  DB_UnresetViews)
da00: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
da10: 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  ne sqliteViewRes
da20: 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69  etAll(A,B).#endi
da30: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
da40: 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _VIEW */../*.** 
da50: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
da60: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56   called by the V
da70: 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68  DBE to adjust th
da80: 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  e internal schem
da90: 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c  a.** used by SQL
daa0: 69 74 65 20 77 68 65 6e 20 74 68 65 20 62 74 72  ite when the btr
dab0: 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61  ee layer moves a
dac0: 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65   table root page
dad0: 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61  . The.** root-pa
dae0: 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  ge of a table or
daf0: 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61   index in databa
db00: 73 65 20 69 44 62 20 68 61 73 20 63 68 61 6e 67  se iDb has chang
db10: 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a  ed from iFrom.**
db20: 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54   to iTo..**.** T
db30: 69 63 6b 65 74 20 23 31 37 32 38 3a 20 20 54 68  icket #1728:  Th
db40: 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d  e symbol table m
db50: 69 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61  ight still conta
db60: 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a  in information.*
db70: 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f  * on tables and/
db80: 6f 72 20 69 6e 64 69 63 65 73 20 74 68 61 74 20  or indices that 
db90: 61 72 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  are the process 
dba0: 6f 66 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  of being deleted
dbb0: 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20  ..** If you are 
dbc0: 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20  unlucky, one of 
dbd0: 74 68 6f 73 65 20 64 65 6c 65 74 65 64 20 69 6e  those deleted in
dbe0: 64 69 63 65 73 20 6f 72 20 74 61 62 6c 65 73 20  dices or tables 
dbf0: 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20 74 68  might.** have th
dc00: 65 20 73 61 6d 65 20 72 6f 6f 74 70 61 67 65 20  e same rootpage 
dc10: 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20 72 65  number as the re
dc20: 61 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  al table or inde
dc30: 78 20 74 68 61 74 20 69 73 0a 2a 2a 20 62 65 69  x that is.** bei
dc40: 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65  ng moved.  So we
dc50: 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61   cannot stop sea
dc60: 72 63 68 69 6e 67 20 61 66 74 65 72 20 74 68 65  rching after the
dc70: 20 66 69 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a   first match .**
dc80: 20 62 65 63 61 75 73 65 20 74 68 65 20 66 69 72   because the fir
dc90: 73 74 20 6d 61 74 63 68 20 6d 69 67 68 74 20 62  st match might b
dca0: 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  e for one of the
dcb0: 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73   deleted indices
dcc0: 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20 61 6e  .** or tables an
dcd0: 64 20 6e 6f 74 20 74 68 65 20 74 61 62 6c 65 2f  d not the table/
dce0: 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 61 63  index that is ac
dcf0: 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76  tually being mov
dd00: 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63  ed..** We must c
dd10: 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20  ontinue looping 
dd20: 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73  until all tables
dd30: 20 61 6e 64 20 69 6e 64 69 63 65 73 20 77 69 74   and indices wit
dd40: 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69  h.** rootpage==i
dd50: 46 72 6f 6d 20 68 61 76 65 20 62 65 65 6e 20 63  From have been c
dd60: 6f 6e 76 65 72 74 65 64 20 74 6f 20 68 61 76 65  onverted to have
dd70: 20 61 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 69   a rootpage of i
dd80: 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  To.** in order t
dd90: 6f 20 62 65 20 63 65 72 74 61 69 6e 20 74 68 61  o be certain tha
dda0: 74 20 77 65 20 67 6f 74 20 74 68 65 20 72 69 67  t we got the rig
ddb0: 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64  ht one..*/.#ifnd
ddc0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
ddd0: 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73  UTOVACUUM.void s
dde0: 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f  qlite3RootPageMo
ddf0: 76 65 64 28 44 62 20 2a 70 44 62 2c 20 69 6e 74  ved(Db *pDb, int
de00: 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29   iFrom, int iTo)
de10: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45  {.  HashElem *pE
de20: 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61  lem;.  Hash *pHa
de30: 73 68 3b 0a 0a 20 20 70 48 61 73 68 20 3d 20 26  sh;..  pHash = &
de40: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
de50: 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c  lHash;.  for(pEl
de60: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
de70: 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d  st(pHash); pElem
de80: 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
de90: 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
dea0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
deb0: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
dec0: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
ded0: 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pTab->tnum==iFr
dee0: 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  om ){.      pTab
def0: 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
df00: 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68 20    }.  }.  pHash 
df10: 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  = &pDb->pSchema-
df20: 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72 28  >idxHash;.  for(
df30: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
df40: 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45  First(pHash); pE
df50: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
df60: 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
df70: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
df80: 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  dx = sqliteHashD
df90: 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
dfa0: 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d  if( pIdx->tnum==
dfb0: 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70  iFrom ){.      p
dfc0: 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b  Idx->tnum = iTo;
dfd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
dfe0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
dff0: 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74   code to erase t
e000: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
e010: 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66  ot-page iTable f
e020: 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44 62  rom database iDb
e030: 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20  ..** Also write 
e040: 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74  code to modify t
e050: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
e060: 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72   table and inter
e070: 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66  nal schema.** if
e080: 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20   a root-page of 
e090: 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73  another table is
e0a0: 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74   moved by the bt
e0b0: 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74  ree-layer whilst
e0c0: 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62  .** erasing iTab
e0d0: 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68 61 70  le (this can hap
e0e0: 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f  pen with an auto
e0f0: 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
e100: 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  )..*/ .static vo
e110: 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61  id destroyRootPa
e120: 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
e130: 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e  , int iTable, in
e140: 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a  t iDb){.  Vdbe *
e150: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
e160: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  be(pParse);.  sq
e170: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
e180: 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54  , OP_Destroy, iT
e190: 61 62 6c 65 2c 20 69 44 62 29 3b 0a 23 69 66 6e  able, iDb);.#ifn
e1a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e1b0: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20  AUTOVACUUM.  /* 
e1c0: 4f 50 5f 44 65 73 74 72 6f 79 20 70 75 73 68 65  OP_Destroy pushe
e1d0: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 6e 74  s an integer ont
e1e0: 6f 20 74 68 65 20 73 74 61 63 6b 2e 20 49 66 20  o the stack. If 
e1f0: 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a  this integer.  *
e200: 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  * is non-zero, t
e210: 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f  hen it is the ro
e220: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
e230: 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20  f a table moved 
e240: 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e  to.  ** location
e250: 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c   iTable. The fol
e260: 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69  lowing code modi
e270: 66 69 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f  fies the sqlite_
e280: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a  master table to.
e290: 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69    ** reflect thi
e2a0: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
e2b0: 20 22 23 30 22 20 69 6e 20 74 68 65 20 53 51 4c   "#0" in the SQL
e2c0: 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f   is a special co
e2d0: 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e  nstant that mean
e2e0: 73 20 77 68 61 74 65 76 65 72 20 76 61 6c 75 65  s whatever value
e2f0: 0a 20 20 2a 2a 20 69 73 20 6f 6e 20 74 68 65 20  .  ** is on the 
e300: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
e310: 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 52 65  .  See sqlite3Re
e320: 67 69 73 74 65 72 45 78 70 72 28 29 2e 0a 20 20  gisterExpr()..  
e330: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74  */.  sqlite3Nest
e340: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
e350: 0a 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51  .     "UPDATE %Q
e360: 2e 25 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65  .%s SET rootpage
e370: 3d 25 64 20 57 48 45 52 45 20 23 30 20 41 4e 44  =%d WHERE #0 AND
e380: 20 72 6f 6f 74 70 61 67 65 3d 23 30 22 2c 0a 20   rootpage=#0",. 
e390: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
e3a0: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
e3b0: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
e3c0: 29 2c 20 69 54 61 62 6c 65 29 3b 0a 23 65 6e 64  ), iTable);.#end
e3d0: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  if.}../*.** Writ
e3e0: 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65  e VDBE code to e
e3f0: 72 61 73 65 20 74 61 62 6c 65 20 70 54 61 62 20  rase table pTab 
e400: 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74  and all associat
e410: 65 64 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69  ed indices on di
e420: 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75  sk..** Code to u
e430: 70 64 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  pdate the sqlite
e440: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20 61  _master tables a
e450: 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  nd internal sche
e460: 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a  ma definitions.*
e470: 2a 20 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74  * in case a root
e480: 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20  -page belonging 
e490: 74 6f 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65  to another table
e4a0: 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65   is moved by the
e4b0: 20 62 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20   btree layer.** 
e4c0: 69 73 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74  is also added (t
e4d0: 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77  his can happen w
e4e0: 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ith an auto-vacu
e4f0: 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  um database)..*/
e500: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73  .static void des
e510: 74 72 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20  troyTable(Parse 
e520: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
e530: 70 54 61 62 29 7b 0a 23 69 66 64 65 66 20 53 51  pTab){.#ifdef SQ
e540: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
e550: 43 55 55 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49  CUUM.  Index *pI
e560: 64 78 3b 0a 20 20 69 6e 74 20 69 44 62 20 3d 20  dx;.  int iDb = 
e570: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
e580: 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
e590: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
e5a0: 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61  .  destroyRootPa
e5b0: 67 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  ge(pParse, pTab-
e5c0: 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 66  >tnum, iDb);.  f
e5d0: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
e5e0: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
e5f0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
e600: 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61     destroyRootPa
e610: 67 65 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d  ge(pParse, pIdx-
e620: 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d  >tnum, iDb);.  }
e630: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74  .#else.  /* If t
e640: 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
e650: 62 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  be auto-vacuum c
e660: 61 70 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54  apable (if SQLIT
e670: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
e680: 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65  M.  ** is not de
e690: 66 69 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20  fined), then it 
e6a0: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
e6b0: 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20  call OP_Destroy 
e6c0: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c  on the.  ** tabl
e6d0: 65 20 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74  e and index root
e6e0: 2d 70 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c  -pages in order,
e6f0: 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74   starting with t
e700: 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a  he numerically .
e710: 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f    ** largest roo
e720: 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54  t-page number. T
e730: 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20 74  his guarantees t
e740: 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hat none of the 
e750: 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20  root-pages.  ** 
e760: 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  to be destroyed 
e770: 69 73 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20  is relocated by 
e780: 61 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65  an earlier OP_De
e790: 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74  stroy. i.e. if t
e7a0: 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  he.  ** followin
e7b0: 67 20 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20  g were coded:.  
e7c0: 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72  **.  ** OP_Destr
e7d0: 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a  oy 4 0.  ** ....
e7e0: 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    ** OP_Destroy 
e7f0: 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e  5 0.  **.  ** an
e800: 64 20 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61  d root page 5 ha
e810: 70 70 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65  ppened to be the
e820: 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
e830: 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  ge number in the
e840: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20  .  ** database, 
e850: 74 68 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35  then root page 5
e860: 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20   would be moved 
e870: 74 6f 20 70 61 67 65 20 34 20 62 79 20 74 68 65  to page 4 by the
e880: 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72   .  ** "OP_Destr
e890: 6f 79 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20  oy 4 0" opcode. 
e8a0: 54 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 22  The subsequent "
e8b0: 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20  OP_Destroy 5 0" 
e8c0: 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61  would hit.  ** a
e8d0: 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e   free-list page.
e8e0: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  .  */.  int iTab
e8f0: 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20   = pTab->tnum;. 
e900: 20 69 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20   int iDestroyed 
e910: 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31  = 0;..  while( 1
e920: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
e930: 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61  Idx;.    int iLa
e940: 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20  rgest = 0;..    
e950: 69 66 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d  if( iDestroyed==
e960: 30 20 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72  0 || iTab<iDestr
e970: 6f 79 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c  oyed ){.      iL
e980: 61 72 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20  argest = iTab;. 
e990: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64     }.    for(pId
e9a0: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
e9b0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
e9c0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
e9d0: 6e 74 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e  nt iIdx = pIdx->
e9e0: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65  tnum;.      asse
e9f0: 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d  rt( pIdx->pSchem
ea00: 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
ea10: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   );.      if( (i
ea20: 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20  Destroyed==0 || 
ea30: 28 69 49 64 78 3c 69 44 65 73 74 72 6f 79 65 64  (iIdx<iDestroyed
ea40: 29 29 20 26 26 20 69 49 64 78 3e 69 4c 61 72 67  )) && iIdx>iLarg
ea50: 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  est ){.        i
ea60: 4c 61 72 67 65 73 74 20 3d 20 69 49 64 78 3b 0a  Largest = iIdx;.
ea70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ea80: 20 20 69 66 28 20 69 4c 61 72 67 65 73 74 3d 3d    if( iLargest==
ea90: 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
eaa0: 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  n;.    }else{.  
eab0: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
eac0: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
ead0: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
eae0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
eaf0: 20 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74       destroyRoot
eb00: 50 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c 61  Page(pParse, iLa
eb10: 72 67 65 73 74 2c 20 69 44 62 29 3b 0a 20 20 20  rgest, iDb);.   
eb20: 20 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20     iDestroyed = 
eb30: 69 4c 61 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a  iLargest;.    }.
eb40: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
eb50: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
eb60: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f   is called to do
eb70: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44   the work of a D
eb80: 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ROP TABLE statem
eb90: 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73  ent..** pName is
eba0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
ebb0: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f   table to be dro
ebc0: 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  pped..*/.void sq
ebd0: 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50  lite3DropTable(P
ebe0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
ebf0: 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e  cList *pName, in
ec00: 74 20 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f  t isView, int no
ec10: 45 72 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  Err){.  Table *p
ec20: 54 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  Tab;.  Vdbe *v;.
ec30: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
ec40: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
ec50: 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50  t iDb;..  if( pP
ec60: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
ec70: 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
ec80: 64 28 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  d() ){.    goto 
ec90: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
eca0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
ecb0: 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
ecc0: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
ecd0: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
ece0: 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  rse, pName->a[0]
ecf0: 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61  .zName, pName->a
ed00: 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
ed10: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
ed20: 7b 0a 20 20 20 20 69 66 28 20 6e 6f 45 72 72 20  {.    if( noErr 
ed30: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ed40: 45 72 72 6f 72 43 6c 65 61 72 28 70 50 61 72 73  ErrorClear(pPars
ed50: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f  e);.    }.    go
ed60: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
ed70: 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  le;.  }.  iDb = 
ed80: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
ed90: 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
eda0: 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72  Schema);.  asser
edb0: 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
edc0: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 23 69 66 6e  <db->nDb );.#ifn
edd0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ede0: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
edf0: 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a  {.    int code;.
ee00: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
ee10: 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41  zTab = SCHEMA_TA
ee20: 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 63 6f  BLE(iDb);.    co
ee30: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
ee40: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
ee50: 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me;.    const ch
ee60: 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20  ar *zArg2 = 0;. 
ee70: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
ee80: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
ee90: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
eea0: 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20  Tab, 0, zDb)){. 
eeb0: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
eec0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
eed0: 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
eee0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  ){.      if( !OM
eef0: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
ef00: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
ef10: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
ef20: 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20  P_TEMP_VIEW;.   
ef30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ef40: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
ef50: 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  DROP_VIEW;.     
ef60: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
ef70: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
ef80: 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  BLE.    }else if
ef90: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
efa0: 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ) ){.      if( s
efb0: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
efc0: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
efd0: 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20   pTab) ){.      
efe0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
eff0: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 20 20 7d 0a  _table;.      }.
f000: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
f010: 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b  ITE_DROP_VTABLE;
f020: 0a 20 20 20 20 20 20 7a 41 72 67 32 20 3d 20 70  .      zArg2 = p
f030: 54 61 62 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65  Tab->pMod->zName
f040: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
f050: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  se{.      if( !O
f060: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
f070: 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
f080: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
f090: 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20  OP_TEMP_TABLE;. 
f0a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f0b0: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
f0c0: 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20  E_DROP_TABLE;.  
f0d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
f0e0: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
f0f0: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
f100: 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
f110: 7a 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20  zArg2, zDb) ){. 
f120: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
f130: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
f140: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
f150: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
f160: 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
f170: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c   pTab->zName, 0,
f180: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
f190: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
f1a0: 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ble;.    }.  }.#
f1b0: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 54 61 62  endif.  if( pTab
f1c0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 70 54  ->readOnly || pT
f1d0: 61 62 3d 3d 64 62 2d 3e 61 44 62 5b 69 44 62 5d  ab==db->aDb[iDb]
f1e0: 2e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61  .pSchema->pSeqTa
f1f0: 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
f200: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
f210: 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
f220: 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
f230: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
f240: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
f250: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66  _table;.  }..#if
f260: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f270: 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72  _VIEW.  /* Ensur
f280: 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20  e DROP TABLE is 
f290: 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69  not used on a vi
f2a0: 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45  ew, and DROP VIE
f2b0: 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20  W is not used.  
f2c0: 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20  ** on a table.. 
f2d0: 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77   */.  if( isView
f2e0: 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
f2f0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t==0 ){.    sqli
f300: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
f310: 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41  se, "use DROP TA
f320: 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61  BLE to delete ta
f330: 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a  ble %s", pTab->z
f340: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
f350: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
f360: 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69  .  }.  if( !isVi
f370: 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c  ew && pTab->pSel
f380: 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
f390: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
f3a0: 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49 45  e, "use DROP VIE
f3b0: 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77  W to delete view
f3c0: 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   %s", pTab->zNam
f3d0: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
f3e0: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
f3f0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
f400: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
f410: 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65  remove the table
f420: 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
f430: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64   table.  ** on d
f440: 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  isk..  */.  v = 
f450: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
f460: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
f470: 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a  ){.    Trigger *
f480: 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 44 62  pTrigger;.    Db
f490: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
f4a0: 5b 69 44 62 5d 3b 0a 20 20 20 20 73 71 6c 69 74  [iDb];.    sqlit
f4b0: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
f4c0: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
f4d0: 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
f4e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
f4f0: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
f500: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
f510: 20 29 7b 0a 20 20 20 20 20 20 56 64 62 65 20 2a   ){.      Vdbe *
f520: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
f530: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
f540: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 20    if( v ){.     
f550: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f560: 64 4f 70 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e  dOp(v, OP_VBegin
f570: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
f580: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
f590: 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74     /* Drop all t
f5a0: 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74  riggers associat
f5b0: 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
f5c0: 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e  e being dropped.
f5d0: 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73 20   Code.    ** is 
f5e0: 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d  generated to rem
f5f0: 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d  ove entries from
f600: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61   sqlite_master a
f610: 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c  nd/or.    ** sql
f620: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20  ite_temp_master 
f630: 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  if required..   
f640: 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72   */.    pTrigger
f650: 20 3d 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65   = pTab->pTrigge
f660: 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54  r;.    while( pT
f670: 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20  rigger ){.      
f680: 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
f690: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
f6a0: 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20  >pSchema || .   
f6b0: 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72 2d         pTrigger-
f6c0: 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
f6d0: 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a  b[1].pSchema );.
f6e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f        sqlite3Dro
f6f0: 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61 72  pTriggerPtr(pPar
f700: 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20  se, pTrigger);. 
f710: 20 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20       pTrigger = 
f720: 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b  pTrigger->pNext;
f730: 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
f740: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
f750: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a  INCREMENT.    /*
f760: 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72   Remove any entr
f770: 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ies of the sqlit
f780: 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
f790: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
f7a0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  .    ** the tabl
f7b0: 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e  e being dropped.
f7c0: 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
f7d0: 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20 69  fore the table i
f7e0: 73 20 64 72 6f 70 70 65 64 0a 20 20 20 20 2a 2a  s dropped.    **
f7f0: 20 61 74 20 74 68 65 20 62 74 72 65 65 20 6c 65   at the btree le
f800: 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74 68 65  vel, in case the
f810: 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
f820: 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a   table needs to.
f830: 20 20 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61      ** move as a
f840: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64   result of the d
f850: 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20  rop (can happen 
f860: 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  in auto-vacuum m
f870: 6f 64 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ode)..    */.   
f880: 20 69 66 28 20 70 54 61 62 2d 3e 61 75 74 6f 49   if( pTab->autoI
f890: 6e 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  nc ){.      sqli
f8a0: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
f8b0: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
f8c0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 73 2e 73  DELETE FROM %s.s
f8d0: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 57  qlite_sequence W
f8e0: 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20  HERE name=%Q",. 
f8f0: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d         pDb->zNam
f900: 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20  e, pTab->zName. 
f910: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65       );.    }.#e
f920: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72 6f  ndif..    /* Dro
f930: 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53  p all SQLITE_MAS
f940: 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e  TER table and in
f950: 64 65 78 20 65 6e 74 72 69 65 73 20 74 68 61 74  dex entries that
f960: 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20   refer to the.  
f970: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20    ** table. The 
f980: 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f  program name loo
f990: 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d  ps through the m
f9a0: 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
f9b0: 64 65 6c 65 74 65 73 0a 20 20 20 20 2a 2a 20 65  deletes.    ** e
f9c0: 76 65 72 79 20 72 6f 77 20 74 68 61 74 20 72 65  very row that re
f9d0: 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20  fers to a table 
f9e0: 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
f9f0: 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e   as the one bein
fa00: 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70 70 65 64  g.    ** dropped
fa10: 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20 68  . Triggers are h
fa20: 61 6e 64 6c 65 64 20 73 65 70 65 72 61 74 65 6c  andled seperatel
fa30: 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69 67  y because a trig
fa40: 67 65 72 20 63 61 6e 20 62 65 0a 20 20 20 20 2a  ger can be.    *
fa50: 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  * created in the
fa60: 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 74   temp database t
fa70: 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20  hat refers to a 
fa80: 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72  table in another
fa90: 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
faa0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
fab0: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
fac0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
fad0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
fae0: 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61  .%s WHERE tbl_na
faf0: 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d  me=%Q and type!=
fb00: 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20  'trigger'",.    
fb10: 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20      pDb->zName, 
fb20: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
fb30: 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ), pTab->zName);
fb40: 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77  .    if( !isView
fb50: 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70   && !IsVirtual(p
fb60: 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 64 65  Tab) ){.      de
fb70: 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73  stroyTable(pPars
fb80: 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  e, pTab);.    }.
fb90: 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  .    /* Remove t
fba0: 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66  he table entry f
fbb0: 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74  rom SQLite's int
fbc0: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64  ernal schema and
fbd0: 20 6d 6f 64 69 66 79 0a 20 20 20 20 2a 2a 20 74   modify.    ** t
fbe0: 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
fbf0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
fc00: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
fc10: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
fc20: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 56  3VdbeOp3(v, OP_V
fc30: 44 65 73 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c  Destroy, iDb, 0,
fc40: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
fc50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
fc60: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
fc70: 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c  _DropTable, iDb,
fc80: 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   0, pTab->zName,
fc90: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
fca0: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
fcb0: 20 76 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20   v, iDb);.  }.  
fcc0: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
fcd0: 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78  ll(db, iDb);..ex
fce0: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20  it_drop_table:. 
fcf0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
fd00: 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a  elete(pName);.}.
fd10: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
fd20: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
fd30: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f   create a new fo
fd40: 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65  reign key on the
fd50: 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e   table.** curren
fd60: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
fd70: 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f  uction.  pFromCo
fd80: 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69  l determines whi
fd90: 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  ch columns.** in
fda0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
fdb0: 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  le point to the 
fdc0: 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66  foreign key.  If
fdd0: 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65   pFromCol==0 the
fde0: 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65  n.** connect the
fdf0: 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74   key to the last
fe00: 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64   column inserted
fe10: 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61  .  pTo is the na
fe20: 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62  me of.** the tab
fe30: 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20  le referred to. 
fe40: 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73   pToCol is a lis
fe50: 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  t of tables in t
fe60: 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20  he other.** pTo 
fe70: 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 66  table that the f
fe80: 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74  oreign key point
fe90: 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e  s to.  flags con
fea0: 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66  tains all.** inf
feb0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
fec0: 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f  he conflict reso
fed0: 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
fee0: 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69  s specified.** i
fef0: 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c  n the ON DELETE,
ff00: 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f   ON UPDATE and O
ff10: 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73  N INSERT clauses
ff20: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20  ..**.** An FKey 
ff30: 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
ff40: 61 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74  ated and added t
ff50: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
ff60: 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63  ently.** under c
ff70: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74  onstruction in t
ff80: 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  he pParse->pNewT
ff90: 61 62 6c 65 20 66 69 65 6c 64 2e 20 20 54 68 65  able field.  The
ffa0: 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20   new FKey.** is 
ffb0: 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20  not linked into 
ffc0: 64 62 2d 3e 61 46 4b 65 79 20 61 74 20 74 68 69  db->aFKey at thi
ffd0: 73 20 70 6f 69 6e 74 20 2d 20 74 68 61 74 20 64  s point - that d
ffe0: 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a  oes not happen.*
fff0: 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 33 45  * until sqlite3E
10000 6e 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a  ndTable()..**.**
10010 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   The foreign key
10020 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45   is set for IMME
10030 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67  DIATE processing
10040 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20  .  A subsequent 
10050 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  call.** to sqlit
10060 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
10070 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65  y() might change
10080 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45   this to DEFERRE
10090 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  D..*/.void sqlit
100a0 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b  e3CreateForeignK
100b0 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ey(.  Parse *pPa
100c0 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
100d0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
100e0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72  .  ExprList *pFr
100f0 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d  omCol,  /* Colum
10100 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65  ns in this table
10110 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
10120 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
10130 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20  Token *pTo,     
10140 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
10150 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
10160 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
10170 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c  ToCol,    /* Col
10180 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65  umns in the othe
10190 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  r table */.  int
101a0 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
101b0 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65    /* Conflict re
101c0 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
101d0 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64  hms. */.){.#ifnd
101e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
101f0 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65  OREIGN_KEY.  FKe
10200 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20  y *pFKey = 0;.  
10210 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73  Table *p = pPars
10220 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
10230 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74  int nByte;.  int
10240 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a   i;.  int nCol;.
10250 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73    char *z;..  as
10260 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a  sert( pTo!=0 );.
10270 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50    if( p==0 || pP
10280 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 49 4e  arse->nErr || IN
10290 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20  _DECLARE_VTAB ) 
102a0 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69  goto fk_end;.  i
102b0 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29  f( pFromCol==0 )
102c0 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  {.    int iCol =
102d0 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20   p->nCol-1;.    
102e0 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74  if( iCol<0 ) got
102f0 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66  o fk_end;.    if
10300 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
10310 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  ol->nExpr!=1 ){.
10320 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
10330 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66  orMsg(pParse, "f
10340 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73  oreign key on %s
10350 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f  ".         " sho
10360 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  uld reference on
10370 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66  ly one column of
10380 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20   table %T",.    
10390 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f       p->aCol[iCo
103a0 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a  l].zName, pTo);.
103b0 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
103c0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f  d;.    }.    nCo
103d0 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  l = 1;.  }else i
103e0 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
103f0 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f  Col->nExpr!=pFro
10400 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  mCol->nExpr ){. 
10410 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
10420 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
10430 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f     "number of co
10440 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e  lumns in foreign
10450 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61   key does not ma
10460 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
10470 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c  f ".        "col
10480 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65  umns in the refe
10490 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a  renced table");.
104a0 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
104b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
104c0 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  ol = pFromCol->n
104d0 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  Expr;.  }.  nByt
104e0 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65  e = sizeof(*pFKe
104f0 79 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66  y) + nCol*sizeof
10500 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29  (pFKey->aCol[0])
10510 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20   + pTo->n + 1;. 
10520 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20   if( pToCol ){. 
10530 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
10540 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  oCol->nExpr; i++
10550 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b  ){.      nByte +
10560 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d  = strlen(pToCol-
10570 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31  >a[i].zName) + 1
10580 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46  ;.    }.  }.  pF
10590 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  Key = sqliteMall
105a0 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  oc( nByte );.  i
105b0 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 20 67 6f  f( pFKey==0 ) go
105c0 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b  to fk_end;.  pFK
105d0 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20  ey->pFrom = p;. 
105e0 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
105f0 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20  m = p->pFKey;.  
10600 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65  z = (char*)&pFKe
10610 79 5b 31 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61  y[1];.  pFKey->a
10620 43 6f 6c 20 3d 20 28 73 74 72 75 63 74 20 73 43  Col = (struct sC
10630 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d  olMap*)z;.  z +=
10640 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
10650 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20  ColMap)*nCol;.  
10660 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a  pFKey->zTo = z;.
10670 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d    memcpy(z, pTo-
10680 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a  >z, pTo->n);.  z
10690 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  [pTo->n] = 0;.  
106a0 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20  z += pTo->n+1;. 
106b0 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20   pFKey->pNextTo 
106c0 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43  = 0;.  pFKey->nC
106d0 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28  ol = nCol;.  if(
106e0 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
106f0 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
10700 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43  0].iFrom = p->nC
10710 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ol-1;.  }else{. 
10720 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
10730 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
10740 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
10750 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b  (j=0; j<p->nCol;
10760 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
10770 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
10780 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  p(p->aCol[j].zNa
10790 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b  me, pFromCol->a[
107a0 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
107b0 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
107c0 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d  >aCol[i].iFrom =
107d0 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   j;.          br
107e0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
107f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
10800 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20   j>=p->nCol ){. 
10810 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
10820 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
10830 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f            "unkno
10840 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22  wn column \"%s\"
10850 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
10860 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20  definition", .  
10870 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c          pFromCol
10880 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
10890 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65         goto fk_e
108a0 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
108b0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43  }.  }.  if( pToC
108c0 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
108d0 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
108e0 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
108f0 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b  trlen(pToCol->a[
10900 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
10910 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
10920 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20  zCol = z;.      
10930 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c  memcpy(z, pToCol
10940 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29  ->a[i].zName, n)
10950 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30  ;.      z[n] = 0
10960 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31  ;.      z += n+1
10970 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46  ;.    }.  }.  pF
10980 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
10990 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65  = 0;.  pFKey->de
109a0 6c 65 74 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73  leteConf = flags
109b0 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79   & 0xff;.  pFKey
109c0 2d 3e 75 70 64 61 74 65 43 6f 6e 66 20 3d 20 28  ->updateConf = (
109d0 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30  flags >> 8 ) & 0
109e0 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e  xff;.  pFKey->in
109f0 73 65 72 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67  sertConf = (flag
10a00 73 20 3e 3e 20 31 36 20 29 20 26 20 30 78 66 66  s >> 16 ) & 0xff
10a10 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  ;..  /* Link the
10a20 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20   foreign key to 
10a30 74 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65  the table as the
10a40 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f   last step..  */
10a50 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46  .  p->pFKey = pF
10a60 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30  Key;.  pFKey = 0
10a70 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c  ;..fk_end:.  sql
10a80 69 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a  iteFree(pFKey);.
10a90 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
10aa0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
10ab0 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20  OREIGN_KEY) */. 
10ac0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
10ad0 44 65 6c 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29  Delete(pFromCol)
10ae0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
10af0 69 73 74 44 65 6c 65 74 65 28 70 54 6f 43 6f 6c  istDelete(pToCol
10b00 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
10b10 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
10b20 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49  ed when an INITI
10b30 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f  ALLY IMMEDIATE o
10b40 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
10b50 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69  RRED.** clause i
10b60 73 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f  s seen as part o
10b70 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  f a foreign key 
10b80 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65  definition.  The
10b90 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70   isDeferred.** p
10ba0 61 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f  arameter is 1 fo
10bb0 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
10bc0 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49  RRED and 0 for I
10bd0 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
10be0 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76  TE..** The behav
10bf0 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ior of the most 
10c00 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64  recently created
10c10 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
10c20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f  adjusted.** acco
10c30 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rdingly..*/.void
10c40 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
10c50 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70  eignKey(Parse *p
10c60 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66  Parse, int isDef
10c70 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20  erred){.#ifndef 
10c80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
10c90 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20  IGN_KEY.  Table 
10ca0 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70  *pTab;.  FKey *p
10cb0 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61  FKey;.  if( (pTa
10cc0 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
10cd0 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46  Table)==0 || (pF
10ce0 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65  Key = pTab->pFKe
10cf0 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  y)==0 ) return;.
10d00 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72    pFKey->isDefer
10d10 72 65 64 20 3d 20 69 73 44 65 66 65 72 72 65 64  red = isDeferred
10d20 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
10d30 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
10d40 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20  that will erase 
10d50 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78  and refill index
10d60 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69 73   *pIdx.  This is
10d70 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74  .** used to init
10d80 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63  ialize a newly c
10d90 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20  reated index or 
10da0 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65  to recompute the
10db0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  .** content of a
10dc0 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f  n index in respo
10dd0 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58  nse to a REINDEX
10de0 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
10df0 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69  if memRootPage i
10e00 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20  s not negative, 
10e10 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
10e20 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79  e index is newly
10e30 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68  .** created.  Th
10e40 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 73 70  e memory cell sp
10e50 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f  ecified by memRo
10e60 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  otPage contains 
10e70 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
10e80 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
10e90 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f  ndex.  If memRoo
10ea0 74 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  tPage is negativ
10eb0 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69  e, then.** the i
10ec0 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
10ed0 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20  sts and must be 
10ee0 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 62  cleared before b
10ef0 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e  eing refilled an
10f00 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61  d.** the root pa
10f10 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
10f20 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20   index is taken 
10f30 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75  from pIndex->tnu
10f40 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m..*/.static voi
10f50 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49  d sqlite3RefillI
10f60 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
10f70 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  se, Index *pInde
10f80 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61  x, int memRootPa
10f90 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ge){.  Table *pT
10fa0 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61  ab = pIndex->pTa
10fb0 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62  ble;  /* The tab
10fc0 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64 65 78  le that is index
10fd0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ed */.  int iTab
10fe0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
10ff0 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
11000 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  cursor used for 
11010 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49  pTab */.  int iI
11020 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
11030 62 2b 31 3b 20 20 20 20 20 2f 2a 20 42 74 72 65  b+1;     /* Btre
11040 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f  e cursor used fo
11050 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  r pIndex */.  in
11060 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20  t addr1;        
11070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11080 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f  Address of top o
11090 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  f loop */.  int 
110a0 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  tnum;           
110b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
110c0 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65 78  ot page of index
110d0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
110e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110f0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
11100 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
11110 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
11120 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
11130 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ey;             
11140 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66      /* KeyInfo f
11150 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  or index */.  in
11160 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
11170 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
11180 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78 2d  rse->db, pIndex-
11190 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e  >pSchema);..#ifn
111a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
111b0 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
111c0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
111d0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
111e0 49 54 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e  ITE_REINDEX, pIn
111f0 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20  dex->zName, 0,. 
11200 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d       pParse->db-
11210 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20  >aDb[iDb].zName 
11220 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
11230 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
11240 2a 20 52 65 71 75 69 72 65 20 61 20 77 72 69 74  * Require a writ
11250 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  e-lock on the ta
11260 62 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74  ble to perform t
11270 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  his operation */
11280 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c  .  sqlite3TableL
11290 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
112a0 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20   pTab->tnum, 1, 
112b0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20  pTab->zName);.. 
112c0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
112d0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
112e0 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
112f0 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50  ;.  if( memRootP
11300 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  age>=0 ){.    sq
11310 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11320 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65  , OP_MemLoad, me
11330 6d 52 6f 6f 74 50 61 67 65 2c 20 30 29 3b 0a 20  mRootPage, 0);. 
11340 20 20 20 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 7d     tnum = 0;.  }
11350 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d  else{.    tnum =
11360 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20   pIndex->tnum;. 
11370 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11380 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c  dOp(v, OP_Clear,
11390 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d   tnum, iDb);.  }
113a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
113b0 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
113c0 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 70 4b  r, iDb, 0);.  pK
113d0 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  ey = sqlite3Inde
113e0 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
113f0 20 70 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69   pIndex);.  sqli
11400 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
11410 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78  _OpenWrite, iIdx
11420 2c 20 74 6e 75 6d 2c 20 28 63 68 61 72 20 2a 29  , tnum, (char *)
11430 70 4b 65 79 2c 20 50 33 5f 4b 45 59 49 4e 46 4f  pKey, P3_KEYINFO
11440 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 73 71 6c  _HANDOFF);.  sql
11450 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
11460 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c  arse, iTab, iDb,
11470 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
11480 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73  ad);.  addr1 = s
11490 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
114a0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54  v, OP_Rewind, iT
114b0 61 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  ab, 0);.  sqlite
114c0 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
114d0 79 28 76 2c 20 70 49 6e 64 65 78 2c 20 69 54 61  y(v, pIndex, iTa
114e0 62 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  b);.  if( pIndex
114f0 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
11500 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 75  ne ){.    int cu
11510 72 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  raddr = sqlite3V
11520 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
11530 29 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 32  );.    int addr2
11540 20 3d 20 63 75 72 61 64 64 72 2b 34 3b 0a 20 20   = curaddr+4;.  
11550 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
11560 6e 67 65 50 32 28 76 2c 20 63 75 72 61 64 64 72  ngeP2(v, curaddr
11570 2d 31 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20  -1, addr2);.    
11580 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11590 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54  (v, OP_Rowid, iT
115a0 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  ab, 0);.    sqli
115b0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
115c0 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 30 29  OP_AddImm, 1, 0)
115d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
115e0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73 55  eAddOp(v, OP_IsU
115f0 6e 69 71 75 65 2c 20 69 49 64 78 2c 20 61 64 64  nique, iIdx, add
11600 72 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r2);.    sqlite3
11610 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61  VdbeOp3(v, OP_Ha
11620 6c 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  lt, SQLITE_CONST
11630 52 41 49 4e 54 2c 20 4f 45 5f 41 62 6f 72 74 2c  RAINT, OE_Abort,
11640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11650 20 20 20 20 20 22 69 6e 64 65 78 65 64 20 63 6f       "indexed co
11660 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e  lumns are not un
11670 69 71 75 65 22 2c 20 50 33 5f 53 54 41 54 49 43  ique", P3_STATIC
11680 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
11690 64 64 72 32 3d 3d 73 71 6c 69 74 65 33 56 64 62  ddr2==sqlite3Vdb
116a0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
116b0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
116c0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
116d0 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c  IdxInsert, iIdx,
116e0 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
116f0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
11700 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b  xt, iTab, addr1+
11710 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
11720 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
11730 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r1);.  sqlite3Vd
11740 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
11750 6f 73 65 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20  ose, iTab, 0);. 
11760 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11770 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  p(v, OP_Close, i
11780 49 64 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Idx, 0);.}../*.*
11790 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69  * Create a new i
117a0 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20  ndex for an SQL 
117b0 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70  table.  pName1.p
117c0 4e 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d  Name2 is the nam
117d0 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a  e of the index .
117e0 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20  ** and pTblList 
117f0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
11800 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
11810 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
11820 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62   Both will .** b
11830 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69  e NULL for a pri
11840 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69  mary key or an i
11850 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65  ndex that is cre
11860 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  ated to satisfy 
11870 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73  a.** UNIQUE cons
11880 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62  traint.  If pTab
11890 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72  le and pIndex ar
118a0 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72  e NULL, use pPar
118b0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a  se->pNewTable.**
118c0 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f   as the table to
118d0 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50   be indexed.  pP
118e0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
118f0 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  is a table that 
11900 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  is.** currently 
11910 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65  being constructe
11920 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41  d by a CREATE TA
11930 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
11940 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20  *.** pList is a 
11950 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
11960 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
11970 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55  pList will be NU
11980 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73  LL if this.** is
11990 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
119a0 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61  r unique-constra
119b0 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20  int on the most 
119c0 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64  recent column ad
119d0 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61  ded.** to the ta
119e0 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
119f0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
11a00 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  .  .*/.void sqli
11a10 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a  te3CreateIndex(.
11a20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
11a30 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f       /* All info
11a40 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
11a50 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f  is parse */.  To
11a60 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20  ken *pName1,    
11a70 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f   /* First part o
11a80 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61  f index name. Ma
11a90 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  y be NULL */.  T
11aa0 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
11ab0 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74    /* Second part
11ac0 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20   of index name. 
11ad0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
11ae0 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61   SrcList *pTblNa
11af0 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20  me, /* Table to 
11b00 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72 73  index. Use pPars
11b10 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20  e->pNewTable if 
11b20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  0 */.  ExprList 
11b30 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c  *pList,   /* A l
11b40 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
11b50 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
11b60 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
11b70 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74       /* OE_Abort
11b80 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f  , OE_Ignore, OE_
11b90 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e  Replace, or OE_N
11ba0 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  one */.  Token *
11bb0 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54  pStart,     /* T
11bc0 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20  he CREATE token 
11bd0 74 68 61 74 20 62 65 67 69 6e 73 20 61 20 43 52  that begins a CR
11be0 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
11bf0 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ment */.  Token 
11c00 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 2f 2a 20  *pEnd,       /* 
11c10 54 68 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f  The ")" that clo
11c20 73 65 73 20 74 68 65 20 43 52 45 41 54 45 20 49  ses the CREATE I
11c30 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
11c40 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
11c50 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f  r,     /* Sort o
11c60 72 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20  rder of primary 
11c70 6b 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d  key when pList==
11c80 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66  NULL */.  int if
11c90 4e 6f 74 45 78 69 73 74 20 20 20 20 20 2f 2a 20  NotExist     /* 
11ca0 4f 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e  Omit error if in
11cb0 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
11cc0 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ts */.){.  Table
11cd0 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *pTab = 0;     
11ce0 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69  /* Table to be i
11cf0 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ndexed */.  Inde
11d00 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20  x *pIndex = 0;  
11d10 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
11d20 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20   be created */. 
11d30 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
11d40 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ;     /* Name of
11d50 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
11d60 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
11d70 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11d80 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
11d90 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69  zName */.  int i
11da0 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c  , j;.  Token nul
11db0 6c 49 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  lId;        /* F
11dc0 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e  ake token for an
11dd0 20 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a   empty ID list *
11de0 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78  /.  DbFixer sFix
11df0 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ;        /* For 
11e00 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61  assigning databa
11e10 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62  se names to pTab
11e20 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74  le */.  int sort
11e30 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20  OrderMask;   /* 
11e40 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20  1 to honor DESC 
11e50 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74 6f 20  in index.  0 to 
11e60 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c  ignore. */.  sql
11e70 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
11e80 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44 62  e->db;.  Db *pDb
11e90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
11ea0 20 54 68 65 20 73 70 65 63 69 66 69 63 20 74 61   The specific ta
11eb0 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
11ec0 68 65 20 69 6e 64 65 78 65 64 20 64 61 74 61 62  he indexed datab
11ed0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ase */.  int iDb
11ee0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
11ef0 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   Index of the da
11f00 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20 62  tabase that is b
11f10 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a  eing written */.
11f20 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d    Token *pName =
11f30 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c   0;    /* Unqual
11f40 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68  ified name of th
11f50 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74  e index to creat
11f60 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78  e */.  struct Ex
11f70 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69  prList_item *pLi
11f80 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c  stItem; /* For l
11f90 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c 69 73  ooping over pLis
11fa0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  t */.  int nCol;
11fb0 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20  .  int nExtra = 
11fc0 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72  0;.  char *zExtr
11fd0 61 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  a;..  if( pParse
11fe0 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
11ff0 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
12000 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
12010 41 42 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  AB ){.    goto e
12020 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
12030 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
12040 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   Find the table 
12050 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
12060 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65  dexed.  Return e
12070 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e  arly if not foun
12080 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  d..  */.  if( pT
12090 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20  blName!=0 ){..  
120a0 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f    /* Use the two
120b0 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65  -part index name
120c0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
120d0 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
120e0 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72  ** to search for
120f0 20 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78   the table. 'Fix
12100 27 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  ' the table name
12110 20 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20   to this db.    
12120 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e  ** before lookin
12130 67 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a  g up the table..
12140 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
12150 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61  t( pName1 && pNa
12160 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d  me2 );.    iDb =
12170 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
12180 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
12190 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
121a0 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  me);.    if( iDb
121b0 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  <0 ) goto exit_c
121c0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 23 69  reate_index;..#i
121d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
121e0 54 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20  T_TEMPDB.    /* 
121f0 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  If the index nam
12200 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65  e was unqualifie
12210 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  d, check if the 
12220 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  the table.    **
12230 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65   is a temp table
12240 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65  . If so, set the
12250 20 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e 0a   database to 1..
12260 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 61 62 20      */.    pTab 
12270 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
12280 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
12290 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  TblName);.    if
122a0 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d  ( pName2 && pNam
122b0 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62  e2->n==0 && pTab
122c0 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d   && pTab->pSchem
122d0 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  a==db->aDb[1].pS
122e0 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 69  chema ){.      i
122f0 44 62 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  Db = 1;.    }.#e
12300 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20 73 71  ndif..    if( sq
12310 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46  lite3FixInit(&sF
12320 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c  ix, pParse, iDb,
12330 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29   "index", pName)
12340 20 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c 69   &&.        sqli
12350 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73  te3FixSrcList(&s
12360 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20  Fix, pTblName). 
12370 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42     ){.      /* B
12380 65 63 61 75 73 65 20 74 68 65 20 70 61 72 73 65  ecause the parse
12390 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62  r constructs pTb
123a0 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e  lName from a sin
123b0 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a  gle identifier,.
123c0 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
123d0 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e  FixSrcList can n
123e0 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20  ever fail. */.  
123f0 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20      assert(0);. 
12400 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20     }.    pTab = 
12410 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
12420 6c 65 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e  le(pParse, pTblN
12430 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ame->a[0].zName,
12440 20 0a 20 20 20 20 20 20 20 20 70 54 62 6c 4e 61   .        pTblNa
12450 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
12460 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54  se);.    if( !pT
12470 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  ab ) goto exit_c
12480 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
12490 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
124a0 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3d 3d 70  [iDb].pSchema==p
124b0 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
124c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
124d0 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b  ert( pName==0 );
124e0 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50 61 72  .    pTab = pPar
124f0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
12500 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67     if( !pTab ) g
12510 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
12520 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20 3d  index;.    iDb =
12530 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
12540 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
12550 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20  pSchema);.  }.  
12560 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
12570 44 62 5d 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  Db];..  if( pTab
12580 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
12590 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Err ) goto exit_
125a0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
125b0 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e  if( pTab->readOn
125c0 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ly ){.    sqlite
125d0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
125e0 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
125f0 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c  not be indexed",
12600 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
12610 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
12620 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
12630 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12640 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54  IT_VIEW.  if( pT
12650 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
12660 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
12670 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77  sg(pParse, "view
12680 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
12690 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f  exed");.    goto
126a0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
126b0 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ex;.  }.#endif.#
126c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
126d0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
126e0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
126f0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
12700 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
12710 72 73 65 2c 20 22 76 69 72 74 75 61 6c 20 74 61  rse, "virtual ta
12720 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  bles may not be 
12730 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67  indexed");.    g
12740 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
12750 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69  index;.  }.#endi
12760 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  f..  /*.  ** Fin
12770 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  d the name of th
12780 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73  e index.  Make s
12790 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74  ure there is not
127a0 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72   already another
127b0 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74  .  ** index or t
127c0 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61  able with the sa
127d0 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a  me name.  .  **.
127e0 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20    ** Exception: 
127f0 20 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69   If we are readi
12800 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ng the names of 
12810 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65  permanent indice
12820 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20  s from the.  ** 
12830 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
12840 62 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d  ble (because som
12850 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
12860 63 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65  changed the sche
12870 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65  ma) and.  ** one
12880 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61   of the index na
12890 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74  mes collides wit
128a0 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  h the name of a 
128b0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
128c0 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74  or.  ** index, t
128d0 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74  hen we will cont
128e0 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20  inue to process 
128f0 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a  this index..  **
12900 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d  .  ** If pName==
12910 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  0 it means that 
12920 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c  we are.  ** deal
12930 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61  ing with a prima
12940 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45  ry key or UNIQUE
12950 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65   constraint.  We
12960 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20   have to invent 
12970 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d  our.  ** own nam
12980 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e  e..  */.  if( pN
12990 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  ame ){.    zName
129a0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
129b0 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a  omToken(pName);.
129c0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
129d0 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
129e0 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67  hema(pParse) ) g
129f0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
12a00 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 7a  index;.    if( z
12a10 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65  Name==0 ) goto e
12a20 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
12a30 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
12a40 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63  _OK!=sqlite3Chec
12a50 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72  kObjectName(pPar
12a60 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  se, zName) ){.  
12a70 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
12a80 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
12a90 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  }.    if( !db->i
12aa0 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
12ab0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
12ac0 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
12ad0 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74  ma(pParse) ) got
12ae0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
12af0 64 65 78 3b 0a 20 20 20 20 20 20 69 66 28 20 73  dex;.      if( s
12b00 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
12b10 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30  db, zName, 0)!=0
12b20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
12b30 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
12b40 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  se, "there is al
12b50 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61  ready a table na
12b60 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  med %s", zName);
12b70 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
12b80 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
12b90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12ba0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
12bb0 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
12bc0 65 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d  e, pDb->zName)!=
12bd0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
12be0 69 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20 20  ifNotExist ){.  
12bf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
12c00 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69  orMsg(pParse, "i
12c10 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64 79 20  ndex %s already 
12c20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b  exists", zName);
12c30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
12c40 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
12c50 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
12c60 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a  else{.    char z
12c70 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74  Buf[30];.    int
12c80 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   n;.    Index *p
12c90 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c  Loop;.    for(pL
12ca0 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  oop=pTab->pIndex
12cb0 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c  , n=1; pLoop; pL
12cc0 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74  oop=pLoop->pNext
12cd0 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72  , n++){}.    spr
12ce0 69 6e 74 66 28 7a 42 75 66 2c 22 5f 25 64 22 2c  intf(zBuf,"_%d",
12cf0 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  n);.    zName = 
12d00 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  0;.    sqlite3Se
12d10 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20  tString(&zName, 
12d20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65  "sqlite_autoinde
12d30 78 5f 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  x_", pTab->zName
12d40 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30  , zBuf, (char*)0
12d50 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
12d60 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
12d70 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
12d80 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
12d90 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  r authorization 
12da0 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64  to create an ind
12db0 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ex..  */.#ifndef
12dc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
12dd0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
12de0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
12df0 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b  Db = pDb->zName;
12e00 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
12e10 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
12e20 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
12e30 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
12e40 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  b), 0, zDb) ){. 
12e50 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
12e60 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
12e70 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54   }.    i = SQLIT
12e80 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a  E_CREATE_INDEX;.
12e90 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
12ea0 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
12eb0 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
12ec0 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  TE_TEMP_INDEX;. 
12ed0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
12ee0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
12ef0 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i, zName, pTab->
12f00 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
12f10 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
12f20 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
12f30 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
12f40 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c   /* If pList==0,
12f50 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72   it means this r
12f60 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
12f70 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d  d to make a prim
12f80 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74  ary.  ** key out
12f90 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   of the last col
12fa0 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  umn added to the
12fb0 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
12fc0 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  struction..  ** 
12fd0 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65  So create a fake
12fe0 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74   list to simulat
12ff0 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69  e this..  */.  i
13000 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
13010 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 28 75     nullId.z = (u
13020 38 2a 29 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54  8*)pTab->aCol[pT
13030 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d  ab->nCol-1].zNam
13040 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20  e;.    nullId.n 
13050 3d 20 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29  = strlen((char*)
13060 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70  nullId.z);.    p
13070 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
13080 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20  prListAppend(0, 
13090 30 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20  0, &nullId);.   
130a0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
130b0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
130c0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70 4c 69 73  _index;.    pLis
130d0 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  t->a[0].sortOrde
130e0 72 20 3d 20 73 6f 72 74 4f 72 64 65 72 3b 0a 20  r = sortOrder;. 
130f0 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20   }..  /* Figure 
13100 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74  out how many byt
13110 65 73 20 6f 66 20 73 70 61 63 65 20 61 72 65 20  es of space are 
13120 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72  required to stor
13130 65 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a  e explicitly.  *
13140 2a 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 6c  * specified coll
13150 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
13160 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ames..  */.  for
13170 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
13180 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
13190 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c  Expr *pExpr = pL
131a0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
131b0 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 20 29  .    if( pExpr )
131c0 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b  {.      nExtra +
131d0 3d 20 28 31 20 2b 20 73 74 72 6c 65 6e 28 70 45  = (1 + strlen(pE
131e0 78 70 72 2d 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  xpr->pColl->zNam
131f0 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  e));.    }.  }..
13200 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63    /* .  ** Alloc
13210 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74  ate the index st
13220 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20  ructure. .  */. 
13230 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28   nName = strlen(
13240 7a 4e 61 6d 65 29 3b 0a 20 20 6e 43 6f 6c 20 3d  zName);.  nCol =
13250 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
13260 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
13270 4d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 73  Malloc( .      s
13280 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 20  izeof(Index) +  
13290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
132a0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 20  ndex structure  
132b0 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
132c0 69 6e 74 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20  int)*nCol +     
132d0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
132e0 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20  iColumn   */.   
132f0 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28     sizeof(int)*(
13300 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20 20 20  nCol+1) +       
13310 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73  /* Index.aiRowEs
13320 74 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a  t   */.      siz
13330 65 6f 66 28 63 68 61 72 20 2a 29 2a 6e 43 6f 6c  eof(char *)*nCol
13340 20 2b 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64   +        /* Ind
13350 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f  ex.azColl     */
13360 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38  .      sizeof(u8
13370 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20  )*nCol +        
13380 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f      /* Index.aSo
13390 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20  rtOrder */.     
133a0 20 6e 4e 61 6d 65 20 2b 20 31 20 2b 20 20 20 20   nName + 1 +    
133b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
133c0 20 49 6e 64 65 78 2e 7a 4e 61 6d 65 20 20 20 20   Index.zName    
133d0 20 20 2a 2f 0a 20 20 20 20 20 20 6e 45 78 74 72    */.      nExtr
133e0 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a               
133f0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
13400 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
13410 6d 65 73 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66  mes */.  );.  if
13420 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46  ( sqlite3MallocF
13430 61 69 6c 65 64 28 29 20 29 20 67 6f 74 6f 20 65  ailed() ) goto e
13440 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13450 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  ;.  pIndex->azCo
13460 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29 28 26 70  ll = (char**)(&p
13470 49 6e 64 65 78 5b 31 5d 29 3b 0a 20 20 70 49 6e  Index[1]);.  pIn
13480 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20  dex->aiColumn = 
13490 28 69 6e 74 20 2a 29 28 26 70 49 6e 64 65 78 2d  (int *)(&pIndex-
134a0 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a  >azColl[nCol]);.
134b0 20 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45    pIndex->aiRowE
134c0 73 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 2a  st = (unsigned *
134d0 29 28 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  )(&pIndex->aiCol
134e0 75 6d 6e 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49  umn[nCol]);.  pI
134f0 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
13500 20 3d 20 28 75 38 20 2a 29 28 26 70 49 6e 64 65   = (u8 *)(&pInde
13510 78 2d 3e 61 69 52 6f 77 45 73 74 5b 6e 43 6f 6c  x->aiRowEst[nCol
13520 2b 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  +1]);.  pIndex->
13530 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29  zName = (char *)
13540 28 26 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f  (&pIndex->aSortO
13550 72 64 65 72 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 7a  rder[nCol]);.  z
13560 45 78 74 72 61 20 3d 20 28 63 68 61 72 20 2a 29  Extra = (char *)
13570 28 26 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 5b  (&pIndex->zName[
13580 6e 4e 61 6d 65 2b 31 5d 29 3b 0a 20 20 73 74 72  nName+1]);.  str
13590 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  cpy(pIndex->zNam
135a0 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e  e, zName);.  pIn
135b0 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  dex->pTable = pT
135c0 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43  ab;.  pIndex->nC
135d0 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  olumn = pList->n
135e0 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  Expr;.  pIndex->
135f0 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f  onError = onErro
13600 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74  r;.  pIndex->aut
13610 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d  oIndex = pName==
13620 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53 63  0;.  pIndex->pSc
13630 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69  hema = db->aDb[i
13640 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 0a 20 20  Db].pSchema;..  
13650 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
13660 69 66 20 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e  if we should hon
13670 6f 72 20 44 45 53 43 20 72 65 71 75 65 73 74 73  or DESC requests
13680 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   on index column
13690 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 62  s.  */.  if( pDb
136a0 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f  ->pSchema->file_
136b0 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20  format>=4 ){.   
136c0 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d   sortOrderMask =
136d0 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20   -1;   /* Honor 
136e0 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  DESC */.  }else{
136f0 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61  .    sortOrderMa
13700 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67  sk = 0;    /* Ig
13710 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d  nore DESC */.  }
13720 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20  ..  /* Scan the 
13730 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c  names of the col
13740 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c  umns of the tabl
13750 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  e to be indexed 
13760 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68  and.  ** load th
13770 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73  e column indices
13780 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78 20   into the Index 
13790 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 70 6f  structure.  Repo
137a0 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a  rt an error.  **
137b0 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69   if any column i
137c0 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a  s not found..  *
137d0 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 69  /.  for(i=0, pLi
137e0 73 74 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b  stItem=pList->a;
137f0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
13800 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b   i++, pListItem+
13810 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
13820 61 72 20 2a 7a 43 6f 6c 4e 61 6d 65 20 3d 20 70  ar *zColName = p
13830 4c 69 73 74 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b  ListItem->zName;
13840 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 54 61  .    Column *pTa
13850 62 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 72 65  bCol;.    int re
13860 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
13870 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c  ;.    char *zCol
13880 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
13890 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f       /* Collatio
138a0 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20  n sequence name 
138b0 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 2c  */..    for(j=0,
138c0 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61   pTabCol=pTab->a
138d0 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  Col; j<pTab->nCo
138e0 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62 43 6f 6c 2b  l; j++, pTabCol+
138f0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
13900 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f  lite3StrICmp(zCo
13910 6c 4e 61 6d 65 2c 20 70 54 61 62 43 6f 6c 2d 3e  lName, pTabCol->
13920 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  zName)==0 ) brea
13930 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
13940 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29   j>=pTab->nCol )
13950 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
13960 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
13970 22 74 61 62 6c 65 20 25 73 20 68 61 73 20 6e 6f  "table %s has no
13980 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 25 73   column named %s
13990 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ",.        pTab-
139a0 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61 6d 65  >zName, zColName
139b0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  );.      goto ex
139c0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
139d0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 54 4f  .    }.    /* TO
139e0 44 4f 3a 20 20 41 64 64 20 61 20 74 65 73 74 20  DO:  Add a test 
139f0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
13a00 74 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d  t the same colum
13a10 6e 20 69 73 20 6e 6f 74 20 6e 61 6d 65 64 0a 20  n is not named. 
13a20 20 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20     ** more than 
13a30 6f 6e 63 65 20 77 69 74 68 69 6e 20 74 68 65 20  once within the 
13a40 73 61 6d 65 20 69 6e 64 65 78 2e 20 20 4f 6e 6c  same index.  Onl
13a50 79 20 74 68 65 20 66 69 72 73 74 20 69 6e 73 74  y the first inst
13a60 61 6e 63 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74  ance of.    ** t
13a70 68 65 20 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65  he column will e
13a80 76 65 72 20 62 65 20 75 73 65 64 20 62 79 20 74  ver be used by t
13a90 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 4e  he optimizer.  N
13aa0 6f 74 65 20 74 68 61 74 20 75 73 69 6e 67 20 74  ote that using t
13ab0 68 65 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 63  he.    ** same c
13ac0 6f 6c 75 6d 6e 20 6d 6f 72 65 20 74 68 61 6e 20  olumn more than 
13ad0 6f 6e 63 65 20 63 61 6e 6e 6f 74 20 62 65 20 61  once cannot be a
13ae0 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20  n error because 
13af0 74 68 61 74 20 77 6f 75 6c 64 20 0a 20 20 20 20  that would .    
13b00 2a 2a 20 62 72 65 61 6b 20 62 61 63 6b 77 61 72  ** break backwar
13b10 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
13b20 20 2d 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62   - it needs to b
13b30 65 20 61 20 77 61 72 6e 69 6e 67 2e 0a 20 20 20  e a warning..   
13b40 20 2a 2f 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e   */.    pIndex->
13b50 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b  aiColumn[i] = j;
13b60 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 49 74  .    if( pListIt
13b70 65 6d 2d 3e 70 45 78 70 72 20 29 7b 0a 20 20 20  em->pExpr ){.   
13b80 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
13b90 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f  Item->pExpr->pCo
13ba0 6c 6c 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c  ll );.      zCol
13bb0 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20 20  l = zExtra;.    
13bc0 20 20 73 74 72 63 70 79 28 7a 45 78 74 72 61 2c    strcpy(zExtra,
13bd0 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
13be0 72 2d 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  r->pColl->zName)
13bf0 3b 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20 2b  ;.      zExtra +
13c00 3d 20 28 73 74 72 6c 65 6e 28 7a 43 6f 6c 6c 29  = (strlen(zColl)
13c10 20 2b 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65   + 1);.    }else
13c20 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  {.      zColl = 
13c30 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43  pTab->aCol[j].zC
13c40 6f 6c 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 21  oll;.      if( !
13c50 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  zColl ){.       
13c60 20 7a 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   zColl = db->pDf
13c70 6c 74 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20  ltColl->zName;. 
13c80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
13c90 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
13ca0 75 73 79 20 26 26 20 21 73 71 6c 69 74 65 33 4c  usy && !sqlite3L
13cb0 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
13cc0 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29 20  rse, zColl, -1) 
13cd0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
13ce0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13cf0 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65  .    }.    pInde
13d00 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a  x->azColl[i] = z
13d10 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65 73  Coll;.    reques
13d20 74 65 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70  tedSortOrder = p
13d30 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72  ListItem->sortOr
13d40 64 65 72 20 26 20 73 6f 72 74 4f 72 64 65 72 4d  der & sortOrderM
13d50 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d  ask;.    pIndex-
13d60 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
13d70 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72   requestedSortOr
13d80 64 65 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  der;.  }.  sqlit
13d90 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28  e3DefaultRowEst(
13da0 70 49 6e 64 65 78 29 3b 0a 0a 20 20 69 66 28 20  pIndex);..  if( 
13db0 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e  pTab==pParse->pN
13dc0 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f  ewTable ){.    /
13dd0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
13de0 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74  as been called t
13df0 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f  o create an auto
13e00 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73 20 61  matic index as a
13e10 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f  .    ** result o
13e20 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  f a PRIMARY KEY 
13e30 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65  or UNIQUE clause
13e40 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66   on a column def
13e50 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20  inition, or.    
13e60 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  ** a PRIMARY KEY
13e70 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73   or UNIQUE claus
13e80 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  e following the 
13e90 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f  column definitio
13ea0 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20  ns..    ** i.e. 
13eb0 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  one of:.    **. 
13ec0 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42     ** CREATE TAB
13ed0 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b  LE t(x PRIMARY K
13ee0 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43  EY, y);.    ** C
13ef0 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c  REATE TABLE t(x,
13f00 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29   y, UNIQUE(x, y)
13f10 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
13f20 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 68 65   Either way, che
13f30 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
13f40 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68   table already h
13f50 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78  as such an index
13f60 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20  . If.    ** so, 
13f70 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65  don't bother cre
13f80 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20  ating this one. 
13f90 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65  This only applie
13fa0 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f  s to.    ** auto
13fb0 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65  matically create
13fc0 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73  d indices. Users
13fd0 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20   can do as they 
13fe0 77 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a  wish with.    **
13ff0 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65   explicit indice
14000 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e  s..    */.    In
14010 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66  dex *pIdx;.    f
14020 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
14030 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
14040 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
14050 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
14060 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
14070 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
14080 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14090 28 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65  ( pIdx->autoInde
140a0 78 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  x );.      asser
140b0 74 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  t( pIndex->onErr
140c0 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a  or!=OE_None );..
140d0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
140e0 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65 78 2d  nColumn!=pIndex-
140f0 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  >nColumn ) conti
14100 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  nue;.      for(k
14110 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; k<pIdx->nCol
14120 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  umn; k++){.     
14130 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
14140 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  1 = pIdx->azColl
14150 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  [k];.        con
14160 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 70 49  st char *z2 = pI
14170 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b  ndex->azColl[k];
14180 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
14190 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d  x->aiColumn[k]!=
141a0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
141b0 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  [k] ) break;.   
141c0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
141d0 53 6f 72 74 4f 72 64 65 72 5b 6b 5d 21 3d 70 49  SortOrder[k]!=pI
141e0 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
141f0 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  [k] ) break;.   
14200 20 20 20 20 20 69 66 28 20 7a 31 21 3d 7a 32 20       if( z1!=z2 
14210 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
14220 70 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65 61  p(z1, z2) ) brea
14230 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
14240 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43   if( k==pIdx->nC
14250 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
14260 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
14270 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  or!=pIndex->onEr
14280 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ror ){.         
14290 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72 61   /* This constra
142a0 69 6e 74 20 63 72 65 61 74 65 73 20 74 68 65 20  int creates the 
142b0 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61 20  same index as a 
142c0 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20  previous.       
142d0 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
142e0 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65 77   specified somew
142f0 68 65 72 65 20 69 6e 20 74 68 65 20 43 52 45 41  here in the CREA
14300 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
14310 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  nt..          **
14320 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e 20   However the ON 
14330 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
14340 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20   are different. 
14350 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20 20  If both this .  
14360 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74          ** const
14370 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70 72  raint and the pr
14380 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65 6e  evious equivalen
14390 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 76  t constraint hav
143a0 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20 20  e explicit.     
143b0 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c       ** ON CONFL
143c0 49 43 54 20 63 6c 61 75 73 65 73 20 74 68 69 73  ICT clauses this
143d0 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74   is an error. Ot
143e0 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68 65  herwise, use the
143f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
14400 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69  plicitly specifi
14410 65 64 20 62 65 68 61 76 69 6f 75 72 20 66 6f 72  ed behaviour for
14420 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
14430 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
14440 20 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f     if( !(pIdx->o
14450 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
14460 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e  lt || pIndex->on
14470 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
14480 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
14490 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
144a0 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
144b0 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66             "conf
144c0 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c  licting ON CONFL
144d0 49 43 54 20 63 6c 61 75 73 65 73 20 73 70 65 63  ICT clauses spec
144e0 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  ified", 0);.    
144f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14500 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
14510 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror==OE_Default 
14520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
14530 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70  Idx->onError = p
14540 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a  Index->onError;.
14550 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14560 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f      }.        go
14570 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
14580 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
14590 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69    }.  }..  /* Li
145a0 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78  nk the new Index
145b0 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74   structure to it
145c0 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74  s table and to t
145d0 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e  he other.  ** in
145e0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
145f0 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20   structures. .  
14600 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
14610 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e  t.busy ){.    In
14620 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20  dex *p;.    p = 
14630 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
14640 74 28 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  t(&pIndex->pSche
14650 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20 20  ma->idxHash, .  
14660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14670 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
14680 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49 6e  Name, strlen(pIn
14690 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70  dex->zName)+1, p
146a0 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20  Index);.    if( 
146b0 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
146c0 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20  t( p==pIndex ); 
146d0 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
146e0 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
146f0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
14700 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
14710 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73   }.    db->flags
14720 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
14730 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69 66  nChanges;.    if
14740 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
14750 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74  .      pIndex->t
14760 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e  num = db->init.n
14770 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20  ewTnum;.    }.  
14780 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  }..  /* If the d
14790 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
147a0 30 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68  0 then create th
147b0 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e  e index on disk.
147c0 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f    This.  ** invo
147d0 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65  lves writing the
147e0 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   index into the 
147f0 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
14800 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a   filling in the.
14810 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20    ** index with 
14820 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
14830 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a  e contents..  **
14840 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e  .  ** The db->in
14850 69 74 2e 62 75 73 79 20 69 73 20 30 20 77 68 65  it.busy is 0 whe
14860 6e 20 74 68 65 20 75 73 65 72 20 66 69 72 73 74  n the user first
14870 20 65 6e 74 65 72 73 20 61 20 43 52 45 41 54 45   enters a CREATE
14880 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d   INDEX .  ** com
14890 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e  mand.  db->init.
148a0 62 75 73 79 20 69 73 20 31 20 77 68 65 6e 20 61  busy is 1 when a
148b0 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
148c0 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52  ned and .  ** CR
148d0 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
148e0 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f  ments are read o
148f0 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ut of the master
14900 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a   table.  In.  **
14910 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65   the latter case
14920 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61   the index alrea
14930 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73  dy exists on dis
14940 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68 79 0a  k, which is why.
14950 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61    ** we don't wa
14960 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 69  nt to recreate i
14970 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  t..  **.  ** If 
14980 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d  pTblName==0 it m
14990 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20  eans this index 
149a0 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20  is generated as 
149b0 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20  a primary key.  
149c0 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ** or UNIQUE con
149d0 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52 45  straint of a CRE
149e0 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
149f0 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20  ent.  Since the 
14a00 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a  table.  ** has j
14a10 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64  ust been created
14a20 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  , it contains no
14a30 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e   data and the in
14a40 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  dex initializati
14a50 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e  on.  ** step can
14a60 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a   be skipped..  *
14a70 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 64 62 2d  /.  else if( db-
14a80 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b  >init.busy==0 ){
14a90 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
14aa0 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
14ab0 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50     int iMem = pP
14ac0 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 0a 20  arse->nMem++;.. 
14ad0 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
14ae0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
14af0 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f     if( v==0 ) go
14b00 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
14b10 6e 64 65 78 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43  ndex;...    /* C
14b20 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61  reate the rootpa
14b30 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ge for the index
14b40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
14b50 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
14b60 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
14b70 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
14b80 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
14b90 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20  OP_CreateIndex, 
14ba0 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  iDb, 0);.    sql
14bb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
14bc0 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d   OP_MemStore, iM
14bd0 65 6d 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20  em, 0);..    /* 
14be0 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c  Gather the compl
14bf0 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
14c00 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
14c10 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20  tement into.    
14c20 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72  ** the zStmt var
14c30 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20  iable.    */.   
14c40 20 69 66 28 20 70 53 74 61 72 74 20 26 26 20 70   if( pStart && p
14c50 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  End ){.      /* 
14c60 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69  A named index wi
14c70 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43  th an explicit C
14c80 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
14c90 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a  ement */.      z
14ca0 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
14cb0 72 69 6e 74 66 28 22 43 52 45 41 54 45 25 73 20  rintf("CREATE%s 
14cc0 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20  INDEX %.*s",.   
14cd0 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45       onError==OE
14ce0 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55  _None ? "" : " U
14cf0 4e 49 51 55 45 22 2c 0a 20 20 20 20 20 20 20 20  NIQUE",.        
14d00 70 45 6e 64 2d 3e 7a 20 2d 20 70 4e 61 6d 65 2d  pEnd->z - pName-
14d10 3e 7a 20 2b 20 31 2c 0a 20 20 20 20 20 20 20 20  >z + 1,.        
14d20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d  pName->z);.    }
14d30 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
14d40 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
14d50 78 20 63 72 65 61 74 65 64 20 62 79 20 61 20 50  x created by a P
14d60 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
14d70 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
14d80 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d  */.      /* zStm
14d90 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
14da0 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20  tf(""); */.     
14db0 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20   zStmt = 0;.    
14dc0 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e  }..    /* Add an
14dd0 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65   entry in sqlite
14de0 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69 73  _master for this
14df0 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20   index.    */.  
14e00 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
14e10 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
14e20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
14e30 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28  TO %Q.%s VALUES(
14e40 27 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 30  'index',%Q,%Q,#0
14e50 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20  ,%Q);",.        
14e60 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
14e70 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
14e80 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70  (iDb),.        p
14e90 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20  Index->zName,.  
14ea0 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
14eb0 65 2c 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74  e,.        zStmt
14ec0 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
14ed0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
14ee0 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
14ef0 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 53     sqliteFree(zS
14f00 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  tmt);..    /* Fi
14f10 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77 69 74  ll the index wit
14f20 68 20 64 61 74 61 20 61 6e 64 20 72 65 70 61 72  h data and repar
14f30 73 65 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43  se the schema. C
14f40 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65  ode an OP_Expire
14f50 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c  .    ** to inval
14f60 69 64 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f  idate all pre-co
14f70 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
14f80 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
14f90 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20  ( pTblName ){.  
14fa0 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
14fb0 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
14fc0 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20  Index, iMem);.  
14fd0 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
14fe0 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69  eCookie(db, v, i
14ff0 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
15000 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
15010 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62  ParseSchema, iDb
15020 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 73 71  , 0,.         sq
15030 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 6e 61  lite3MPrintf("na
15040 6d 65 3d 27 25 71 27 22 2c 20 70 49 6e 64 65 78  me='%q'", pIndex
15050 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e  ->zName), P3_DYN
15060 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  AMIC);.      sql
15070 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
15080 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 2c 20 30   OP_Expire, 0, 0
15090 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
150a0 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61  /* When adding a
150b0 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c  n index to the l
150c0 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66  ist of indices f
150d0 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65  or a table, make
150e0 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69  .  ** sure all i
150f0 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f  ndices labeled O
15100 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61  E_Replace come a
15110 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c  fter all those l
15120 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49  abeled.  ** OE_I
15130 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20  gnore.  This is 
15140 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 74 68  necessary for th
15150 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74  e correct operat
15160 69 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a 20 20  ion of UPDATE.  
15170 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20  ** and INSERT.. 
15180 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
15190 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e  it.busy || pTblN
151a0 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ame==0 ){.    if
151b0 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ( onError!=OE_Re
151c0 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70  place || pTab->p
151d0 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20  Index==0.       
151e0 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65    || pTab->pInde
151f0 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52  x->onError==OE_R
15200 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70  eplace){.      p
15210 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
15220 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
15230 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20     pTab->pIndex 
15240 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65  = pIndex;.    }e
15250 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
15260 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d   *pOther = pTab-
15270 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77  >pIndex;.      w
15280 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e  hile( pOther->pN
15290 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70  ext && pOther->p
152a0 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  Next->onError!=O
152b0 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20  E_Replace ){.   
152c0 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f       pOther = pO
152d0 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
152e0 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65     }.      pInde
152f0 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65  x->pNext = pOthe
15300 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
15310 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20  pOther->pNext = 
15320 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  pIndex;.    }.  
15330 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20    pIndex = 0;.  
15340 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70  }..  /* Clean up
15350 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20   before exiting 
15360 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69  */.exit_create_i
15370 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64  ndex:.  if( pInd
15380 65 78 20 29 7b 0a 20 20 20 20 66 72 65 65 49 6e  ex ){.    freeIn
15390 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d  dex(pIndex);.  }
153a0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
153b0 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
153c0 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
153d0 74 44 65 6c 65 74 65 28 70 54 62 6c 4e 61 6d 65  tDelete(pTblName
153e0 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
153f0 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
15400 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
15410 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 61 6b 65  ate code to make
15420 20 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 66   sure the file f
15430 6f 72 6d 61 74 20 6e 75 6d 62 65 72 20 69 73 20  ormat number is 
15440 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 6f 72 6d  at least minForm
15450 61 74 2e 0a 2a 2a 20 54 68 65 20 67 65 6e 65 72  at..** The gener
15460 61 74 65 64 20 63 6f 64 65 20 77 69 6c 6c 20 69  ated code will i
15470 6e 63 72 65 61 73 65 20 74 68 65 20 66 69 6c 65  ncrease the file
15480 20 66 6f 72 6d 61 74 20 6e 75 6d 62 65 72 20 69   format number i
15490 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a  f necessary..*/.
154a0 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 69 6e 69  void sqlite3Mini
154b0 6d 75 6d 46 69 6c 65 46 6f 72 6d 61 74 28 50 61  mumFileFormat(Pa
154c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
154d0 20 69 44 62 2c 20 69 6e 74 20 6d 69 6e 46 6f 72   iDb, int minFor
154e0 6d 61 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  mat){.  Vdbe *v;
154f0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
15500 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
15510 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
15520 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
15530 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c  , OP_ReadCookie,
15540 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 73 71   iDb, 1);.    sq
15550 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
15560 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d 69  , OP_Integer, mi
15570 6e 46 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20  nFormat, 0);.   
15580 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15590 70 28 76 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 73  p(v, OP_Ge, 0, s
155a0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
155b0 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20  tAddr(v)+3);.   
155c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
155d0 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
155e0 20 6d 69 6e 46 6f 72 6d 61 74 2c 20 30 29 3b 0a   minFormat, 0);.
155f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15600 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
15610 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20  okie, iDb, 1);. 
15620 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c   }.}../*.** Fill
15630 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77   the Index.aiRow
15640 45 73 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68  Est[] array with
15650 20 64 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61   default informa
15660 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69  tion - informati
15670 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65 64  on.** to be used
15680 20 77 68 65 6e 20 77 65 20 68 61 76 65 20 6e 6f   when we have no
15690 74 20 72 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a  t run the ANALYZ
156a0 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  E command..**.**
156b0 20 61 69 52 6f 77 45 73 74 5b 30 5d 20 69 73 20   aiRowEst[0] is 
156c0 73 75 70 70 6f 73 65 20 74 6f 20 63 6f 6e 74 61  suppose to conta
156d0 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  in the number of
156e0 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
156f0 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65   index..** Since
15700 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c   we do not know,
15710 20 67 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e   guess 1 million
15720 2e 20 20 61 69 52 6f 77 45 73 74 5b 31 5d 20 69  .  aiRowEst[1] i
15730 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
15740 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
15750 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
15760 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20 61  ble that match a
15770 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 76 61  ny particular va
15780 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  lue of the.** fi
15790 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  rst column of th
157a0 65 20 69 6e 64 65 78 2e 20 20 61 69 52 6f 77 45  e index.  aiRowE
157b0 73 74 5b 32 5d 20 69 73 20 61 6e 20 65 73 74 69  st[2] is an esti
157c0 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62  mate of the numb
157d0 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68  er.** of rows th
157e0 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72  at match any par
157f0 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 69 61  ticular combinia
15800 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73  tion of the firs
15810 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f  t 2 columns.** o
15820 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 41 6e  f the index.  An
15830 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 74 20  d so forth.  It 
15840 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20 74  must always be t
15850 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a  he case that.*.*
15860 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f  *           aiRo
15870 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73  wEst[N]<=aiRowEs
15880 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20  t[N-1].**       
15890 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e      aiRowEst[N]>
158a0 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66  =1.**.** Apart f
158b0 72 6f 6d 20 74 68 61 74 2c 20 77 65 20 68 61 76  rom that, we hav
158c0 65 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f  e little to go o
158d0 6e 20 62 65 73 69 64 65 73 20 69 6e 74 75 69 74  n besides intuit
158e0 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77  ion as to.** how
158f0 20 61 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75   aiRowEst[] shou
15900 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ld be initialize
15910 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 73 20  d.  The numbers 
15920 67 65 6e 65 72 61 74 65 64 20 68 65 72 65 0a 2a  generated here.*
15930 2a 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 74  * are based on t
15940 79 70 69 63 61 6c 20 76 61 6c 75 65 73 20 66 6f  ypical values fo
15950 75 6e 64 20 69 6e 20 61 63 74 75 61 6c 20 69 6e  und in actual in
15960 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dices..*/.void s
15970 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77  qlite3DefaultRow
15980 45 73 74 28 49 6e 64 65 78 20 2a 70 49 64 78 29  Est(Index *pIdx)
15990 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 2a 61 20  {.  unsigned *a 
159a0 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74  = pIdx->aiRowEst
159b0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
159c0 65 72 74 28 20 61 21 3d 30 20 29 3b 0a 20 20 61  ert( a!=0 );.  a
159d0 5b 30 5d 20 3d 20 31 30 30 30 30 30 30 3b 0a 20  [0] = 1000000;. 
159e0 20 66 6f 72 28 69 3d 70 49 64 78 2d 3e 6e 43 6f   for(i=pIdx->nCo
159f0 6c 75 6d 6e 3b 20 69 3e 3d 35 3b 20 69 2d 2d 29  lumn; i>=5; i--)
15a00 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 35 3b 0a  {.    a[i] = 5;.
15a10 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 69 3e 3d    }.  while( i>=
15a20 31 20 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20  1 ){.    a[i] = 
15a30 31 31 20 2d 20 69 3b 0a 20 20 20 20 69 2d 2d 3b  11 - i;.    i--;
15a40 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78 2d  .  }.  if( pIdx-
15a50 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
15a60 65 20 29 7b 0a 20 20 20 20 61 5b 70 49 64 78 2d  e ){.    a[pIdx-
15a70 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d 20 31 3b 0a 20  >nColumn] = 1;. 
15a80 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
15a90 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72   routine will dr
15aa0 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e  op an existing n
15ab0 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69  amed index.  Thi
15ac0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70  s routine.** imp
15ad0 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50  lements the DROP
15ae0 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
15af0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15b00 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65  3DropIndex(Parse
15b10 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
15b20 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66  t *pName, int if
15b30 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65 78  Exists){.  Index
15b40 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65   *pIndex;.  Vdbe
15b50 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
15b60 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
15b70 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69  .  int iDb;..  i
15b80 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
15b90 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  || sqlite3Malloc
15ba0 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20  Failed() ){.    
15bb0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
15bc0 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ndex;.  }.  asse
15bd0 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d  rt( pName->nSrc=
15be0 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  =1 );.  if( SQLI
15bf0 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
15c00 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
15c10 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
15c20 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
15c30 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  }.  pIndex = sql
15c40 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
15c50 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  , pName->a[0].zN
15c60 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ame, pName->a[0]
15c70 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69  .zDatabase);.  i
15c80 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a  f( pIndex==0 ){.
15c90 20 20 20 20 69 66 28 20 21 69 66 45 78 69 73 74      if( !ifExist
15ca0 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
15cb0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
15cc0 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
15cd0 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30  x: %S", pName, 0
15ce0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
15cf0 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
15d00 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65   = 1;.    goto e
15d10 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
15d20 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78    }.  if( pIndex
15d30 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20  ->autoIndex ){. 
15d40 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15d50 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65  sg(pParse, "inde
15d60 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
15d70 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20  h UNIQUE ".     
15d80 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59   "or PRIMARY KEY
15d90 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e   constraint cann
15da0 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
15db0 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  0);.    goto exi
15dc0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
15dd0 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  }.  iDb = sqlite
15de0 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
15df0 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  b, pIndex->pSche
15e00 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ma);.#ifndef SQL
15e10 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
15e20 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
15e30 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45  nt code = SQLITE
15e40 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _DROP_INDEX;.   
15e50 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
15e60 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20  Index->pTable;. 
15e70 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
15e80 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
15e90 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  ].zName;.    con
15ea0 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
15eb0 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
15ec0 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
15ed0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
15ee0 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
15ef0 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
15f00 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
15f10 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
15f20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f      }.    if( !O
15f30 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
15f40 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  b ) code = SQLIT
15f50 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45  E_DROP_TEMP_INDE
15f60 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  X;.    if( sqlit
15f70 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
15f80 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78  se, code, pIndex
15f90 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  ->zName, pTab->z
15fa0 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Name, zDb) ){.  
15fb0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
15fc0 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
15fd0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
15fe0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
15ff0 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64  o remove the ind
16000 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20  ex and from the 
16010 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  master table */.
16020 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
16030 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
16040 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
16050 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
16060 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22  pParse,.       "
16070 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
16080 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22  s WHERE name=%Q"
16090 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ,.       db->aDb
160a0 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48  [iDb].zName, SCH
160b0 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a  EMA_TABLE(iDb),.
160c0 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
160d0 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  Name.    );.    
160e0 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
160f0 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b  kie(db, v, iDb);
16100 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  .    destroyRoot
16110 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Page(pParse, pIn
16120 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  dex->tnum, iDb);
16130 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16140 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e  Op3(v, OP_DropIn
16150 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 70 49 6e  dex, iDb, 0, pIn
16160 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  dex->zName, 0);.
16170 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69    }..exit_drop_i
16180 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53  ndex:.  sqlite3S
16190 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61  rcListDelete(pNa
161a0 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41  me);.}../*.** pA
161b0 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65  rray is a pointe
161c0 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  r to an array of
161d0 20 6f 62 6a 65 63 74 73 2e 20 20 45 61 63 68 20   objects.  Each 
161e0 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a  object in the.**
161f0 20 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72   array is szEntr
16200 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  y bytes in size.
16210 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
16220 6c 6c 6f 63 61 74 65 73 20 61 20 6e 65 77 0a 2a  llocates a new.*
16230 2a 20 6f 62 6a 65 63 74 20 6f 6e 20 74 68 65 20  * object on the 
16240 65 6e 64 20 6f 66 20 74 68 65 20 61 72 72 61 79  end of the array
16250 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 45 6e 74 72 79  ..**.** *pnEntry
16260 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
16270 66 20 65 6e 74 72 69 65 73 20 61 6c 72 65 61 64  f entries alread
16280 79 20 69 6e 20 75 73 65 2e 20 20 2a 70 6e 41 6c  y in use.  *pnAl
16290 6c 6f 63 20 69 73 0a 2a 2a 20 74 68 65 20 70 72  loc is.** the pr
162a0 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
162b0 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  ed size of the a
162c0 72 72 61 79 2e 20 20 69 6e 69 74 53 69 7a 65 20  rray.  initSize 
162d0 69 73 20 74 68 65 0a 2a 2a 20 73 75 67 67 65 73  is the.** sugges
162e0 74 65 64 20 69 6e 69 74 69 61 6c 20 61 72 72 61  ted initial arra
162f0 79 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 69 6f  y size allocatio
16300 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64  n..**.** The ind
16310 65 78 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e  ex of the new en
16320 74 72 79 20 69 73 20 72 65 74 75 72 6e 65 64 20  try is returned 
16330 69 6e 20 2a 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20  in *pIdx..**.** 
16340 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
16350 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
16360 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f  o the array of o
16370 62 6a 65 63 74 73 2e 20 20 54 68 69 73 0a 2a 2a  bjects.  This.**
16380 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 73 61   might be the sa
16390 6d 65 20 61 73 20 74 68 65 20 70 41 72 72 61 79  me as the pArray
163a0 20 70 61 72 61 6d 65 74 65 72 20 6f 72 20 69 74   parameter or it
163b0 20 6d 69 67 68 74 20 62 65 20 61 20 64 69 66 66   might be a diff
163c0 65 72 65 6e 74 0a 2a 2a 20 70 6f 69 6e 74 65 72  erent.** pointer
163d0 20 69 66 20 74 68 65 20 61 72 72 61 79 20 77 61   if the array wa
163e0 73 20 72 65 73 69 7a 65 64 2e 0a 2a 2f 0a 76 6f  s resized..*/.vo
163f0 69 64 20 2a 73 71 6c 69 74 65 33 41 72 72 61 79  id *sqlite3Array
16400 41 6c 6c 6f 63 61 74 65 28 0a 20 20 76 6f 69 64  Allocate(.  void
16410 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20 2f 2a   *pArray,     /*
16420 20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74   Array of object
16430 73 2e 20 20 4d 69 67 68 74 20 62 65 20 72 65 61  s.  Might be rea
16440 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e  llocated */.  in
16450 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 20 20 20  t szEntry,      
16460 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63 68 20  /* Size of each 
16470 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 61 72  object in the ar
16480 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 69  ray */.  int ini
16490 74 53 69 7a 65 2c 20 20 20 20 20 2f 2a 20 53 75  tSize,     /* Su
164a0 67 67 65 73 74 65 64 20 69 6e 69 74 69 61 6c 20  ggested initial 
164b0 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65  allocation, in e
164c0 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  lements */.  int
164d0 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f   *pnEntry,     /
164e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65  * Number of obje
164f0 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  cts currently in
16500 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   use */.  int *p
16510 6e 41 6c 6c 6f 63 2c 20 20 20 20 20 2f 2a 20 43  nAlloc,     /* C
16520 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
16530 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69  he allocation, i
16540 6e 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  n elements */.  
16550 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20 20  int *pIdx       
16560 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 69    /* Write the i
16570 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73 6c  ndex of a new sl
16580 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ot here */.){.  
16590 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 2a  char *z;.  if( *
165a0 70 6e 45 6e 74 72 79 20 3e 3d 20 2a 70 6e 41 6c  pnEntry >= *pnAl
165b0 6c 6f 63 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  loc ){.    void 
165c0 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e  *pNew;.    int n
165d0 65 77 53 69 7a 65 3b 0a 20 20 20 20 6e 65 77 53  ewSize;.    newS
165e0 69 7a 65 20 3d 20 28 2a 70 6e 41 6c 6c 6f 63 29  ize = (*pnAlloc)
165f0 2a 32 20 2b 20 69 6e 69 74 53 69 7a 65 3b 0a 20  *2 + initSize;. 
16600 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
16610 52 65 61 6c 6c 6f 63 28 70 41 72 72 61 79 2c 20  Realloc(pArray, 
16620 6e 65 77 53 69 7a 65 2a 73 7a 45 6e 74 72 79 29  newSize*szEntry)
16630 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
16640 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64 78  0 ){.      *pIdx
16650 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74   = -1;.      ret
16660 75 72 6e 20 70 41 72 72 61 79 3b 0a 20 20 20 20  urn pArray;.    
16670 7d 0a 20 20 20 20 2a 70 6e 41 6c 6c 6f 63 20 3d  }.    *pnAlloc =
16680 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 70 41   newSize;.    pA
16690 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  rray = pNew;.  }
166a0 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 41  .  z = (char*)pA
166b0 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26  rray;.  memset(&
166c0 7a 5b 2a 70 6e 45 6e 74 72 79 20 2a 20 73 7a 45  z[*pnEntry * szE
166d0 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72  ntry], 0, szEntr
166e0 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 2a 70  y);.  *pIdx = *p
166f0 6e 45 6e 74 72 79 3b 0a 20 20 2b 2b 2a 70 6e 45  nEntry;.  ++*pnE
16700 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e 20 70  ntry;.  return p
16710 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Array;.}../*.** 
16720 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65  Append a new ele
16730 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65  ment to the give
16740 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74  n IdList.  Creat
16750 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69  e a new IdList i
16760 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a  f.** need be..**
16770 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74  .** A new IdList
16780 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
16790 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
167a0 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69  ) fails..*/.IdLi
167b0 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73  st *sqlite3IdLis
167c0 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20 2a  tAppend(IdList *
167d0 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
167e0 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  oken){.  int i;.
167f0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
16800 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
16810 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
16820 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20  of(IdList) );.  
16830 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
16840 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
16850 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30  List->nAlloc = 0
16860 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61  ;.  }.  pList->a
16870 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
16880 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 70  llocate(.      p
16890 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73  List->a,.      s
168a0 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
168b0 5d 29 2c 0a 20 20 20 20 20 20 35 2c 0a 20 20 20  ]),.      5,.   
168c0 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a     &pList->nId,.
168d0 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 41        &pList->nA
168e0 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 26 69 0a 20  lloc,.      &i. 
168f0 20 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b   );.  if( i<0 ){
16900 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69  .    sqlite3IdLi
16910 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
16920 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
16930 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d   }.  pList->a[i]
16940 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  .zName = sqlite3
16950 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
16960 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20  oken);.  return 
16970 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
16980 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74  Delete an IdList
16990 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
169a0 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64  3IdListDelete(Id
169b0 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
169c0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
169d0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
169e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
169f0 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
16a00 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
16a10 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
16a20 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
16a30 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  ee(pList->a);.  
16a40 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
16a50 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
16a60 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  rn the index in 
16a70 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65  pList of the ide
16a80 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49  ntifier named zI
16a90 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a  d.  Return -1.**
16aa0 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
16ab0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c  /.int sqlite3IdL
16ac0 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20  istIndex(IdList 
16ad0 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68  *pList, const ch
16ae0 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
16af0 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
16b00 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  ==0 ) return -1;
16b10 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
16b20 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
16b30 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
16b40 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
16b50 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  i].zName, zName)
16b60 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
16b70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
16b80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
16b90 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d   a new table nam
16ba0 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53  e to the given S
16bb0 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  rcList.  Create 
16bc0 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66  a new SrcList if
16bd0 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20  .** need be.  A 
16be0 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65  new entry is cre
16bf0 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c  ated in the SrcL
16c00 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f 6b  ist even if pTok
16c10 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  en is NULL..**.*
16c20 2a 20 41 20 6e 65 77 20 53 72 63 4c 69 73 74 20  * A new SrcList 
16c30 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
16c40 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29  NULL if malloc()
16c50 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   fails..**.** If
16c60 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f   pDatabase is no
16c70 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73  t null, it means
16c80 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
16c90 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a  has an optional.
16ca0 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ** database name
16cb0 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74   prefix.  Like t
16cc0 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e  his:  "database.
16cd0 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61  table".  The pDa
16ce0 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73  tabase.** points
16cf0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61   to the table na
16d00 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c  me and the pTabl
16d10 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  e points to the 
16d20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a  database name..*
16d30 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b  * The SrcList.a[
16d40 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73  ].zName field is
16d50 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
16d60 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63   table name whic
16d70 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20  h might.** come 
16d80 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20  from pTable (if 
16d90 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
16da0 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61  L) or from pData
16db0 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69  base.  .** SrcLi
16dc0 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65  st.a[].zDatabase
16dd0 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
16de0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
16df0 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a  e from pTable,.*
16e00 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69  * or with NULL i
16e10 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73  f no database is
16e20 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
16e30 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
16e40 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74  , if call like t
16e50 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
16e60 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
16e70 74 41 70 70 65 6e 64 28 41 2c 42 2c 30 29 3b 0a  tAppend(A,B,0);.
16e80 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20  **.** Then B is 
16e90 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  a table name and
16ea0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
16eb0 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65  me is unspecifie
16ec0 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a  d.  If called.**
16ed0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
16ee0 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
16ef0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41  3SrcListAppend(A
16f00 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,C);.**.** The
16f10 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c 65  n C is the table
16f20 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74   name and B is t
16f30 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
16f40 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
16f50 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
16f60 6e 64 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  nd(SrcList *pLis
16f70 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  t, Token *pTable
16f80 2c 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61  , Token *pDataba
16f90 73 65 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  se){.  struct Sr
16fa0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
16fb0 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  m;.  if( pList==
16fc0 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
16fd0 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
16fe0 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29  izeof(SrcList) )
16ff0 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
17000 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
17010 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
17020 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
17030 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69  pList->nSrc>=pLi
17040 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  st->nAlloc ){.  
17050 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
17060 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
17070 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70 4e 65  oc *= 2;.    pNe
17080 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  w = sqliteReallo
17090 63 28 70 4c 69 73 74 2c 0a 20 20 20 20 20 20 20  c(pList,.       
170a0 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
170b0 70 4c 69 73 74 29 20 2b 20 28 70 4c 69 73 74 2d  pList) + (pList-
170c0 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f  >nAlloc-1)*sizeo
170d0 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29  f(pList->a[0]) )
170e0 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
170f0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
17100 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
17110 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pList);.      re
17120 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
17130 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a    pList = pNew;.
17140 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70    }.  pItem = &p
17150 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
17160 53 72 63 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  Src];.  memset(p
17170 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Item, 0, sizeof(
17180 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
17190 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26   if( pDatabase &
171a0 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d  & pDatabase->z==
171b0 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61  0 ){.    pDataba
171c0 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  se = 0;.  }.  if
171d0 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70  ( pDatabase && p
171e0 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f 6b  Table ){.    Tok
171f0 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74  en *pTemp = pDat
17200 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61  abase;.    pData
17210 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20  base = pTable;. 
17220 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d     pTable = pTem
17230 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e  p;.  }.  pItem->
17240 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
17250 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61  ameFromToken(pTa
17260 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a  ble);.  pItem->z
17270 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74  Database = sqlit
17280 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
17290 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 70 49  pDatabase);.  pI
172a0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 2d  tem->iCursor = -
172b0 31 3b 0a 20 20 70 49 74 65 6d 2d 3e 69 73 50 6f  1;.  pItem->isPo
172c0 70 75 6c 61 74 65 64 20 3d 20 30 3b 0a 20 20 70  pulated = 0;.  p
172d0 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20  List->nSrc++;.  
172e0 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
172f0 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75  ./*.** Assign cu
17300 72 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61 62  rsors to all tab
17310 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74  les in a SrcList
17320 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
17330 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
17340 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  sors(Parse *pPar
17350 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69  se, SrcList *pLi
17360 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
17370 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
17380 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73  tem *pItem;.  as
17390 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 73 71  sert(pList || sq
173a0 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
173b0 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  d() );.  if( pLi
173c0 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  st ){.    for(i=
173d0 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
173e0 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63  a; i<pList->nSrc
173f0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
17400 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
17410 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62  ->iCursor>=0 ) b
17420 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 49 74 65  reak;.      pIte
17430 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61  m->iCursor = pPa
17440 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
17450 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
17460 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
17470 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
17480 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
17490 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  rse, pItem->pSel
174a0 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20  ect->pSrc);.    
174b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
174c0 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
174d0 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20   entire SrcList 
174e0 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74  including all it
174f0 73 20 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a  s substructure..
17500 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
17510 72 63 4c 69 73 74 44 65 6c 65 74 65 28 53 72 63  rcListDelete(Src
17520 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
17530 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
17540 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
17550 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  tem;.  if( pList
17560 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
17570 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
17580 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74  >a, i=0; i<pList
17590 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
175a0 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  em++){.    sqlit
175b0 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 44 61  eFree(pItem->zDa
175c0 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c  tabase);.    sql
175d0 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a  iteFree(pItem->z
175e0 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
175f0 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 41 6c  eFree(pItem->zAl
17600 69 61 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ias);.    sqlite
17610 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20  3DeleteTable(0, 
17620 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20  pItem->pTab);.  
17630 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
17640 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 53 65  elete(pItem->pSe
17650 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  lect);.    sqlit
17660 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 49 74  e3ExprDelete(pIt
17670 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71  em->pOn);.    sq
17680 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
17690 65 28 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29  e(pItem->pUsing)
176a0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
176b0 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  ee(pList);.}../*
176c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
176d0 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
176e0 65 20 70 61 72 73 65 72 20 74 6f 20 61 64 64 20  e parser to add 
176f0 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68  a new term to th
17700 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20 67 72  e.** end of a gr
17710 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73  owing FROM claus
17720 65 2e 20 20 54 68 65 20 22 70 22 20 70 61 72 61  e.  The "p" para
17730 6d 65 74 65 72 20 69 73 20 74 68 65 20 70 61 72  meter is the par
17740 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d  t of.** the FROM
17750 20 63 6c 61 75 73 65 20 74 68 61 74 20 68 61 73   clause that has
17760 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f   already been co
17770 6e 73 74 72 75 63 74 65 64 2e 20 20 22 70 22 20  nstructed.  "p" 
17780 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68  is NULL.** if th
17790 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
177a0 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d  term of the FROM
177b0 20 63 6c 61 75 73 65 2e 20 20 70 54 61 62 6c 65   clause.  pTable
177c0 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 0a 2a   and pDatabase.*
177d0 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65 20 6f  * are the name o
177e0 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  f the table and 
177f0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20 69  database named i
17800 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
17810 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61  e term..** pData
17820 62 61 73 65 20 69 73 20 4e 55 4c 4c 20 69 66 20  base is NULL if 
17830 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
17840 65 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6d  e qualifier is m
17850 69 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20  issing - the.** 
17860 75 73 75 61 6c 20 63 61 73 65 2e 20 20 49 66 20  usual case.  If 
17870 74 68 65 20 74 65 72 6d 20 68 61 73 20 61 20 61  the term has a a
17880 6c 69 61 73 2c 20 74 68 65 6e 20 70 41 6c 69 61  lias, then pAlia
17890 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a  s points to the.
178a0 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20  ** alias token. 
178b0 20 49 66 20 74 68 65 20 74 65 72 6d 20 69 73 20   If the term is 
178c0 61 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e  a subquery, then
178d0 20 70 53 75 62 71 75 65 72 79 20 69 73 20 74 68   pSubquery is th
178e0 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  e.** SELECT stat
178f0 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20 73  ement that the s
17900 75 62 71 75 65 72 79 20 65 6e 63 6f 64 65 73 2e  ubquery encodes.
17910 20 20 54 68 65 20 70 54 61 62 6c 65 20 61 6e 64    The pTable and
17920 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 70 61  .** pDatabase pa
17930 72 61 6d 65 74 65 72 73 20 61 72 65 20 4e 55 4c  rameters are NUL
17940 4c 20 66 6f 72 20 73 75 62 71 75 65 72 69 65 73  L for subqueries
17950 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e 64 20 70  .  The pOn and p
17960 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74  Using.** paramet
17970 65 72 73 20 61 72 65 20 74 68 65 20 63 6f 6e 74  ers are the cont
17980 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e  ent of the ON an
17990 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 2e  d USING clauses.
179a0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  .**.** Return a 
179b0 6e 65 77 20 53 72 63 4c 69 73 74 20 77 68 69 63  new SrcList whic
179c0 68 20 65 6e 63 6f 64 65 73 20 69 73 20 74 68 65  h encodes is the
179d0 20 46 52 4f 4d 20 77 69 74 68 20 74 68 65 20 6e   FROM with the n
179e0 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65 64  ew.** term added
179f0 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
17a00 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
17a10 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20 20 53 72  ndFromTerm(.  Sr
17a20 63 4c 69 73 74 20 2a 70 2c 20 20 20 20 20 20 20  cList *p,       
17a30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66        /* The lef
17a40 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 46 52  t part of the FR
17a50 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64  OM clause alread
17a60 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65  y seen */.  Toke
17a70 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20  n *pTable,      
17a80 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
17a90 68 65 20 74 61 62 6c 65 20 74 6f 20 61 64 64 20  he table to add 
17aa0 74 6f 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  to the FROM clau
17ab0 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  se */.  Token *p
17ac0 44 61 74 61 62 61 73 65 2c 20 20 20 20 20 20 20  Database,       
17ad0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
17ae0 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
17af0 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54  ng pTable */.  T
17b00 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20  oken *pAlias,   
17b10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
17b20 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
17b30 20 74 68 65 20 41 53 20 73 75 62 65 78 70 72 65   the AS subexpre
17b40 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ssion */.  Selec
17b50 74 20 2a 70 53 75 62 71 75 65 72 79 2c 20 20 20  t *pSubquery,   
17b60 20 20 20 2f 2a 20 41 20 73 75 62 71 75 65 72 79     /* A subquery
17b70 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f   used in place o
17b80 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a  f a table name *
17b90 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20  /.  Expr *pOn,  
17ba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17bb0 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20  he ON clause of 
17bc0 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69  a join */.  IdLi
17bd0 73 74 20 2a 70 55 73 69 6e 67 20 20 20 20 20 20  st *pUsing      
17be0 20 20 20 20 2f 2a 20 54 68 65 20 55 53 49 4e 47      /* The USING
17bf0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69   clause of a joi
17c00 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  n */.){.  struct
17c10 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
17c20 49 74 65 6d 3b 0a 20 20 70 20 3d 20 73 71 6c 69  Item;.  p = sqli
17c30 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
17c40 28 70 2c 20 70 54 61 62 6c 65 2c 20 70 44 61 74  (p, pTable, pDat
17c50 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  abase);.  if( p=
17c60 3d 30 20 7c 7c 20 70 2d 3e 6e 53 72 63 3d 3d 30  =0 || p->nSrc==0
17c70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
17c80 78 70 72 44 65 6c 65 74 65 28 70 4f 6e 29 3b 0a  xprDelete(pOn);.
17c90 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
17ca0 74 44 65 6c 65 74 65 28 70 55 73 69 6e 67 29 3b  tDelete(pUsing);
17cb0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
17cc0 63 74 44 65 6c 65 74 65 28 70 53 75 62 71 75 65  ctDelete(pSubque
17cd0 72 79 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ry);.    return 
17ce0 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d  p;.  }.  pItem =
17cf0 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31   &p->a[p->nSrc-1
17d00 5d 3b 0a 20 20 69 66 28 20 70 41 6c 69 61 73 20  ];.  if( pAlias 
17d10 26 26 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a  && pAlias->n ){.
17d20 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61      pItem->zAlia
17d30 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  s = sqlite3NameF
17d40 72 6f 6d 54 6f 6b 65 6e 28 70 41 6c 69 61 73 29  romToken(pAlias)
17d50 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70  ;.  }.  pItem->p
17d60 53 65 6c 65 63 74 20 3d 20 70 53 75 62 71 75 65  Select = pSubque
17d70 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e  ry;.  pItem->pOn
17d80 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d   = pOn;.  pItem-
17d90 3e 70 55 73 69 6e 67 20 3d 20 70 55 73 69 6e 67  >pUsing = pUsing
17da0 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
17db0 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c  ./*.** When buil
17dc0 64 69 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63  ding up a FROM c
17dd0 6c 61 75 73 65 20 69 6e 20 74 68 65 20 70 61 72  lause in the par
17de0 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ser, the join op
17df0 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69  erator.** is ini
17e00 74 69 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20  tially attached 
17e10 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72  to the left oper
17e20 61 6e 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f  and.  But the co
17e30 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20  de generator.** 
17e40 65 78 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e  expects the join
17e50 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20   operator to be 
17e60 6f 6e 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  on the right ope
17e70 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74  rand.  This rout
17e80 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c  ine.** Shifts al
17e90 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73  l join operators
17ea0 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
17eb0 67 68 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72  ght for an entir
17ec0 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65  e FROM.** clause
17ed0 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a  ..**.** Example:
17ee0 20 53 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69   Suppose the joi
17ef0 6e 20 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  n is like this:.
17f00 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
17f10 41 20 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20  A natural cross 
17f20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65  join B.**.** The
17f30 20 6f 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61   operator is "na
17f40 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e  tural cross join
17f50 22 2e 20 20 54 68 65 20 41 20 61 6e 64 20 42 20  ".  The A and B 
17f60 6f 70 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f  operands are sto
17f70 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30  red.** in p->a[0
17f80 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72  ] and p->a[1], r
17f90 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68  espectively.  Th
17fa0 65 20 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c  e parser initial
17fb0 6c 79 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a  ly stores the.**
17fc0 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 41   operator with A
17fd0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
17fe0 73 68 69 66 74 73 20 74 68 61 74 20 6f 70 65 72  shifts that oper
17ff0 61 74 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a  ator over to B..
18000 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
18010 72 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54  rcListShiftJoinT
18020 79 70 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b  ype(SrcList *p){
18030 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 61  .  if( p && p->a
18040 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
18050 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63     for(i=p->nSrc
18060 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20  -1; i>0; i--){. 
18070 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 6a 6f 69       p->a[i].joi
18080 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31  ntype = p->a[i-1
18090 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  ].jointype;.    
180a0 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 6a 6f  }.    p->a[0].jo
180b0 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a  intype = 0;.  }.
180c0 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
180d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
180e0 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69  void sqlite3Begi
180f0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  nTransaction(Par
18100 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
18110 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  type){.  sqlite3
18120 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
18130 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
18140 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
18150 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
18160 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   || db->aDb[0].p
18170 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Bt==0 ) return;.
18180 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
18190 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c  rr || sqlite3Mal
181a0 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 20 72 65  locFailed() ) re
181b0 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
181c0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
181d0 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
181e0 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22  SACTION, "BEGIN"
181f0 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
18200 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
18210 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
18220 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75  .  if( !v ) retu
18230 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d  rn;.  if( type!=
18240 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20  TK_DEFERRED ){. 
18250 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
18260 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
18270 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18280 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61  dOp(v, OP_Transa
18290 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d  ction, i, (type=
182a0 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31  =TK_EXCLUSIVE)+1
182b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
182c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
182d0 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
182e0 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 0, 0);.}../*.*
182f0 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73  * Commit a trans
18300 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
18310 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e  qlite3CommitTran
18320 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
18330 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
18340 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
18350 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d  ;..  if( pParse=
18360 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65  =0 || (db=pParse
18370 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->db)==0 || db->
18380 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
18390 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
183a0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
183b0 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
183c0 64 28 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  d() ) return;.  
183d0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
183e0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
183f0 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
18400 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29   "COMMIT", 0, 0)
18410 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20   ) return;..  v 
18420 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
18430 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
18440 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
18450 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
18460 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30  AutoCommit, 1, 0
18470 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
18480 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73  Rollback a trans
18490 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
184a0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72  qlite3RollbackTr
184b0 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
184c0 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
184d0 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  te3 *db;.  Vdbe 
184e0 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  *v;..  if( pPars
184f0 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72  e==0 || (db=pPar
18500 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62  se->db)==0 || db
18510 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20  ->aDb[0].pBt==0 
18520 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
18530 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
18540 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
18550 6c 65 64 28 29 20 29 20 72 65 74 75 72 6e 3b 0a  led() ) return;.
18560 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
18570 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
18580 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
18590 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30  N, "ROLLBACK", 0
185a0 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  , 0) ) return;..
185b0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
185c0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
185d0 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
185e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
185f0 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
18600 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  1, 1);.  }.}../*
18610 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
18620 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  e TEMP database 
18630 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69  is open and avai
18640 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20  lable for use.  
18650 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75  Return.** the nu
18660 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
18670 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72   Leave any error
18680 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65   messages in the
18690 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
186a0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
186b0 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
186c0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
186d0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
186e0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
186f0 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  if( db->aDb[1].p
18700 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65  Bt==0 && !pParse
18710 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
18720 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
18730 33 42 74 72 65 65 46 61 63 74 6f 72 79 28 64 62  3BtreeFactory(db
18740 2c 20 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45  , 0, 0, MAX_PAGE
18750 53 2c 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  S, &db->aDb[1].p
18760 42 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Bt);.    if( rc!
18770 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18780 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
18790 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61  Msg(pParse, "una
187a0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  ble to open a te
187b0 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
187c0 20 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65   ".        "file
187d0 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d   for storing tem
187e0 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b  porary tables");
187f0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
18800 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65  c = rc;.      re
18810 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
18820 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
18830 26 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  & !db->autoCommi
18840 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
18850 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
18860 6e 54 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b 31  nTrans(db->aDb[1
18870 5d 2e 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20  ].pBt, 1);.     
18880 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18890 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
188a0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
188b0 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f  arse, "unable to
188c0 20 67 65 74 20 61 20 77 72 69 74 65 20 6c 6f 63   get a write loc
188d0 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20 20 20 20  k on ".         
188e0 20 22 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20   "the temporary 
188f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 29 3b  database file");
18900 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
18910 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
18920 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
18930 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
18940 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d  sert( db->aDb[1]
18950 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 7d 0a  .pSchema );.  }.
18960 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
18970 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
18980 42 45 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  BE code that wil
18990 6c 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68  l verify the sch
189a0 65 6d 61 20 63 6f 6f 6b 69 65 20 61 6e 64 20 73  ema cookie and s
189b0 74 61 72 74 0a 2a 2a 20 61 20 72 65 61 64 2d 74  tart.** a read-t
189c0 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 61  ransaction for a
189d0 6c 6c 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73  ll named databas
189e0 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  e files..**.** I
189f0 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
18a00 68 61 74 20 61 6c 6c 20 73 63 68 65 6d 61 20 63  hat all schema c
18a10 6f 6f 6b 69 65 73 20 62 65 20 76 65 72 69 66 69  ookies be verifi
18a20 65 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65  ed and all.** re
18a30 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  ad transactions 
18a40 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72  be started befor
18a50 65 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20  e anything else 
18a60 68 61 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74 68  happens in.** th
18a70 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20  e VDBE program. 
18a80 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e   But this routin
18a90 65 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20  e can be called 
18aa0 61 66 74 65 72 20 6d 75 63 68 20 6f 74 68 65 72  after much other
18ab0 0a 2a 2a 20 63 6f 64 65 20 68 61 73 20 62 65 65  .** code has bee
18ac0 6e 20 67 65 6e 65 72 61 74 65 64 2e 20 20 53 6f  n generated.  So
18ad0 20 68 65 72 65 20 69 73 20 77 68 61 74 20 77 65   here is what we
18ae0 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66   do:.**.** The f
18af0 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72  irst time this r
18b00 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
18b10 2c 20 77 65 20 63 6f 64 65 20 61 6e 20 4f 50 5f  , we code an OP_
18b20 47 6f 74 6f 20 74 68 61 74 0a 2a 2a 20 77 69 6c  Goto that.** wil
18b30 6c 20 6a 75 6d 70 20 74 6f 20 61 20 73 75 62 72  l jump to a subr
18b40 6f 75 74 69 6e 65 20 61 74 20 74 68 65 20 65 6e  outine at the en
18b50 64 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d  d of the program
18b60 2e 20 20 54 68 65 6e 20 77 65 0a 2a 2a 20 72 65  .  Then we.** re
18b70 63 6f 72 64 20 65 76 65 72 79 20 64 61 74 61 62  cord every datab
18b80 61 73 65 20 74 68 61 74 20 6e 65 65 64 73 20 69  ase that needs i
18b90 74 73 20 73 63 68 65 6d 61 20 76 65 72 69 66 69  ts schema verifi
18ba0 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 50 61  ed in the.** pPa
18bb0 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  rse->cookieMask 
18bc0 66 69 65 6c 64 2e 20 20 4c 61 74 65 72 2c 20 61  field.  Later, a
18bd0 66 74 65 72 20 61 6c 6c 20 6f 74 68 65 72 20 63  fter all other c
18be0 6f 64 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ode has been.** 
18bf0 67 65 6e 65 72 61 74 65 64 2c 20 74 68 65 20 73  generated, the s
18c00 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 64  ubroutine that d
18c10 6f 65 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 76  oes the cookie v
18c20 65 72 69 66 69 63 61 74 69 6f 6e 73 20 61 6e 64  erifications and
18c30 0a 2a 2a 20 73 74 61 72 74 73 20 74 68 65 20 74  .** starts the t
18c40 72 61 6e 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c  ransactions will
18c50 20 62 65 20 63 6f 64 65 64 20 61 6e 64 20 74 68   be coded and th
18c60 65 20 4f 50 5f 47 6f 74 6f 20 50 32 20 76 61 6c  e OP_Goto P2 val
18c70 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 61  ue.** will be ma
18c80 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  de to point to t
18c90 68 61 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  hat subroutine. 
18ca0 20 54 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20   The generation 
18cb0 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65  of the.** cookie
18cc0 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75   verification su
18cd0 62 72 6f 75 74 69 6e 65 20 63 6f 64 65 20 68 61  broutine code ha
18ce0 70 70 65 6e 73 20 69 6e 20 73 71 6c 69 74 65 33  ppens in sqlite3
18cf0 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
18d00 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30 20 74  **.** If iDb<0 t
18d10 68 65 6e 20 63 6f 64 65 20 74 68 65 20 4f 50 5f  hen code the OP_
18d20 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27  Goto only - don'
18d30 74 20 73 65 74 20 66 6c 61 67 20 74 6f 20 76 65  t set flag to ve
18d40 72 69 66 79 20 74 68 65 0a 2a 2a 20 73 63 68 65  rify the.** sche
18d50 6d 61 20 6f 6e 20 61 6e 79 20 64 61 74 61 62 61  ma on any databa
18d60 73 65 73 2e 20 20 54 68 69 73 20 63 61 6e 20 62  ses.  This can b
18d70 65 20 75 73 65 64 20 74 6f 20 70 6f 73 69 74 69  e used to positi
18d80 6f 6e 20 74 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a  on the OP_Goto.*
18d90 2a 20 65 61 72 6c 79 20 69 6e 20 74 68 65 20 63  * early in the c
18da0 6f 64 65 2c 20 62 65 66 6f 72 65 20 77 65 20 6b  ode, before we k
18db0 6e 6f 77 20 69 66 20 61 6e 79 20 64 61 74 61 62  now if any datab
18dc0 61 73 65 20 74 61 62 6c 65 73 20 77 69 6c 6c 20  ase tables will 
18dd0 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64  be used..*/.void
18de0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
18df0 66 79 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a  fySchema(Parse *
18e00 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29  pParse, int iDb)
18e10 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
18e20 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
18e30 74 20 6d 61 73 6b 3b 0a 0a 20 20 76 20 3d 20 73  t mask;..  v = s
18e40 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
18e50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
18e60 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  0 ) return;  /* 
18e70 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
18e80 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61  s if there was a
18e90 20 70 72 69 6f 72 20 65 72 72 6f 72 20 2a 2f 0a   prior error */.
18ea0 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
18eb0 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  b;.  if( pParse-
18ec0 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20 29  >cookieGoto==0 )
18ed0 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f  {.    pParse->co
18ee0 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71 6c 69 74  okieGoto = sqlit
18ef0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
18f00 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 2b 31 3b  P_Goto, 0, 0)+1;
18f10 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3e 3d  .  }.  if( iDb>=
18f20 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
18f30 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
18f40 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
18f50 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20  aDb[iDb].pBt!=0 
18f60 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20  || iDb==1 );.   
18f70 20 61 73 73 65 72 74 28 20 69 44 62 3c 4d 41 58   assert( iDb<MAX
18f80 5f 41 54 54 41 43 48 45 44 2b 32 20 29 3b 0a 20  _ATTACHED+2 );. 
18f90 20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62     mask = 1<<iDb
18fa0 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61 72 73  ;.    if( (pPars
18fb0 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20  e->cookieMask & 
18fc0 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
18fd0 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
18fe0 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
18ff0 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b      pParse->cook
19000 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64  ieValue[iDb] = d
19010 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
19020 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b  ema->schema_cook
19030 69 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  ie;.      if( !O
19040 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
19050 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
19060 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44  sqlite3OpenTempD
19070 61 74 61 62 61 73 65 28 70 50 61 72 73 65 29 3b  atabase(pParse);
19080 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19090 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
190a0 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rate VDBE code t
190b0 68 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72  hat prepares for
190c0 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74   doing an operat
190d0 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  ion that.** migh
190e0 74 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74  t change the dat
190f0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abase..**.** Thi
19100 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73  s routine starts
19110 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
19120 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  on if we are not
19130 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a   already within.
19140 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
19150 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72  .  If we are alr
19160 65 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72  eady within a tr
19170 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
19180 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20  a checkpoint.** 
19190 69 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65  is set if the se
191a0 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d  tStatement param
191b0 65 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41  eter is true.  A
191c0 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75   checkpoint shou
191d0 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72  ld.** be set for
191e0 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74   operations that
191f0 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65   might fail (due
19200 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   to a constraint
19210 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  ) part of.** the
19220 20 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64   way through and
19230 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64   which will need
19240 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72   to undo some wr
19250 69 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76  ites without hav
19260 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61  ing to.** rollba
19270 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61  ck the whole tra
19280 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f  nsaction.  For o
19290 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20  perations where 
192a0 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  all constraints.
192b0 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65  ** can be checke
192c0 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  d before any cha
192d0 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
192e0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
192f0 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65  t is never.** ne
19300 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20  cessary to undo 
19310 61 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20  a write and the 
19320 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
19330 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a  d not be set..**
19340 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61 73  .** Only databas
19350 65 20 69 44 62 20 61 6e 64 20 74 68 65 20 74 65  e iDb and the te
19360 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20  mp database are 
19370 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 62 79  made writable by
19380 20 74 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49   this call..** I
19390 66 20 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74  f iDb==0, then t
193a0 68 65 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70  he main and temp
193b0 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 6d   databases are m
193c0 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20 20  ade writable.   
193d0 49 66 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65  If.** iDb==1 the
193e0 6e 20 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70 20  n only the temp 
193f0 64 61 74 61 62 61 73 65 20 69 73 20 6d 61 64 65  database is made
19400 20 77 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69   writable.  If i
19410 44 62 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a  Db>1 then the.**
19420 20 73 70 65 63 69 66 69 65 64 20 61 75 78 69 6c   specified auxil
19430 69 61 72 79 20 64 61 74 61 62 61 73 65 20 61 6e  iary database an
19440 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  d the temp datab
19450 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69  ase are made wri
19460 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
19470 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
19480 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20  Operation(Parse 
19490 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74  *pParse, int set
194a0 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69  Statement, int i
194b0 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
194c0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
194d0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
194e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
194f0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
19500 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
19510 69 44 62 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  iDb);.  pParse->
19520 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c  writeMask |= 1<<
19530 69 44 62 3b 0a 20 20 69 66 28 20 73 65 74 53 74  iDb;.  if( setSt
19540 61 74 65 6d 65 6e 74 20 26 26 20 70 50 61 72 73  atement && pPars
19550 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a  e->nested==0 ){.
19560 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19570 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 61 74 65  ddOp(v, OP_State
19580 6d 65 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a 20  ment, iDb, 0);. 
19590 20 7d 0a 20 20 69 66 28 20 28 4f 4d 49 54 5f 54   }.  if( (OMIT_T
195a0 45 4d 50 44 42 20 7c 7c 20 69 44 62 21 3d 31 29  EMPDB || iDb!=1)
195b0 20 26 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   && pParse->db->
195c0 61 44 62 5b 31 5d 2e 70 42 74 21 3d 30 20 29 7b  aDb[1].pBt!=0 ){
195d0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
195e0 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
195f0 70 50 61 72 73 65 2c 20 73 65 74 53 74 61 74 65  pParse, setState
19600 6d 65 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a  ment, 1);.  }.}.
19610 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
19620 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75 73  see if pIndex us
19630 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  es the collating
19640 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
19650 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
19660 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20   if it does and 
19670 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73  false if it does
19680 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   not..*/.#ifndef
19690 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
196a0 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20  NDEX.static int 
196b0 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63  collationMatch(c
196c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
196d0 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29  , Index *pIndex)
196e0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
196f0 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e  (i=0; i<pIndex->
19700 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
19710 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
19720 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c   = pIndex->azCol
19730 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 3d  l[i];.    if( z=
19740 3d 7a 43 6f 6c 6c 20 7c 7c 20 28 7a 20 26 26 20  =zColl || (z && 
19750 7a 43 6f 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69  zColl && 0==sqli
19760 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43  te3StrICmp(z, zC
19770 6f 6c 6c 29 29 20 29 7b 0a 20 20 20 20 20 20 72  oll)) ){.      r
19780 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
19790 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
197a0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
197b0 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
197c0 69 63 65 73 20 6f 66 20 70 54 61 62 20 74 68 61  ices of pTab tha
197d0 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  t use the collat
197e0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
197f0 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d  ll..** If pColl=
19800 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74  =0 then recomput
19810 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
19820 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65   pTab..*/.#ifnde
19830 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
19840 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69  INDEX.static voi
19850 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50  d reindexTable(P
19860 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
19870 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20  ble *pTab, char 
19880 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20  const *zColl){. 
19890 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
198a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
198b0 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  An index associa
198c0 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f  ted with pTab */
198d0 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70  ..  for(pIndex=p
198e0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e  Tab->pIndex; pIn
198f0 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64  dex; pIndex=pInd
19900 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ex->pNext){.    
19910 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20  if( zColl==0 || 
19920 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a  collationMatch(z
19930 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b  Coll, pIndex) ){
19940 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d  .      int iDb =
19950 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
19960 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
19970 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
19980 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
19990 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
199a0 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
199b0 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
199c0 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
199d0 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29  rse, pIndex, -1)
199e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
199f0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  ndif../*.** Reco
19a00 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  mpute all indice
19a10 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20  s of all tables 
19a20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  in all databases
19a30 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e   where the.** in
19a40 64 69 63 65 73 20 75 73 65 20 74 68 65 20 63 6f  dices use the co
19a50 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
19a60 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c   pColl.  If pCol
19a70 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70  l==0 then recomp
19a80 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63  ute.** all indic
19a90 65 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a  es everywhere..*
19aa0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
19ab0 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
19ac0 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65  atic void reinde
19ad0 78 44 61 74 61 62 61 73 65 73 28 50 61 72 73 65  xDatabases(Parse
19ae0 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 63   *pParse, char c
19af0 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20  onst *zColl){.  
19b00 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
19b10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
19b20 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
19b30 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
19b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b50 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
19b60 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  e index number *
19b70 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
19b80 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
19b90 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
19ba0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
19bb0 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20  HashElem *k;    
19bc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
19bd0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
19be0 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f  tables in pDb */
19bf0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
19c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19c10 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65  * A table in the
19c20 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20   database */..  
19c30 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64  for(iDb=0, pDb=d
19c40 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e  b->aDb; iDb<db->
19c50 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b  nDb; iDb++, pDb+
19c60 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
19c70 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f  pDb!=0 );.    fo
19c80 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(k=sqliteHashFi
19c90 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  rst(&pDb->pSchem
19ca0 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b  a->tblHash);  k;
19cb0 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   k=sqliteHashNex
19cc0 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61  t(k)){.      pTa
19cd0 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69  b = (Table*)sqli
19ce0 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20  teHashData(k);. 
19cf0 20 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c       reindexTabl
19d00 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
19d10 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  zColl);.    }.  
19d20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
19d30 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
19d40 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58 20  for the REINDEX 
19d50 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20  command..**.**  
19d60 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 20        REINDEX   
19d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d80 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a           -- 1.**
19d90 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
19da0 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20   <collation>    
19db0 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a             -- 2.
19dc0 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
19dd0 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f  X  ?<database>.?
19de0 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20  <tablename>  -- 
19df0 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  3.**        REIN
19e00 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  DEX  ?<database>
19e10 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d  .?<indexname>  -
19e20 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31  - 4.**.** Form 1
19e30 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69   causes all indi
19e40 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63  ces in all attac
19e50 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f  hed databases to
19e60 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20   be rebuilt..** 
19e70 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20  Form 2 rebuilds 
19e80 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61  all indices in a
19e90 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74 68 61  ll databases tha
19ea0 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a  t use the named.
19eb0 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  ** collating fun
19ec0 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20  ction.  Forms 3 
19ed0 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74 68  and 4 rebuild th
19ee0 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72  e named index or
19ef0 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20   all.** indices 
19f00 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
19f10 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e  the named table.
19f20 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
19f30 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
19f40 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e  void sqlite3Rein
19f50 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
19f60 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  e, Token *pName1
19f70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29  , Token *pName2)
19f80 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
19f90 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
19fa0 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
19fb0 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e  uence to be rein
19fc0 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a  dexed, or NULL *
19fd0 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  /.  char *z;    
19fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ff0 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62  /* Name of a tab
1a000 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20  le or index */. 
1a010 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1a020 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1a030 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
1a040 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  base */.  Table 
1a050 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
1a060 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
1a070 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1a080 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
1a090 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
1a0a0 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
1a0b0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
1a0c0 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  ab */.  int iDb;
1a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0e0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1a0f0 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
1a100 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1a110 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
1a120 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1a130 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
1a140 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d    Token *pObjNam
1a150 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1a160 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
1a170 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62  le or index to b
1a180 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a  e reindexed */..
1a190 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61    /* Read the da
1a1a0 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
1a1b0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1a1c0 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
1a1d0 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61  r message.  ** a
1a1e0 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73  nd code in pPars
1a1f0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  e and return NUL
1a200 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  L. */.  if( SQLI
1a210 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
1a220 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
1a230 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
1a240 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65    }..  if( pName
1a250 31 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 31 2d 3e  1==0 || pName1->
1a260 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e  z==0 ){.    rein
1a270 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61  dexDatabases(pPa
1a280 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rse, 0);.    ret
1a290 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  urn;.  }else if(
1a2a0 20 70 4e 61 6d 65 32 3d 3d 30 20 7c 7c 20 70 4e   pName2==0 || pN
1a2b0 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  ame2->z==0 ){.  
1a2c0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31    assert( pName1
1a2d0 2d 3e 7a 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  ->z );.    pColl
1a2e0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
1a2f0 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62  llSeq(db, ENC(db
1a300 29 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 31  ), (char*)pName1
1a310 2d 3e 7a 2c 20 70 4e 61 6d 65 31 2d 3e 6e 2c 20  ->z, pName1->n, 
1a320 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  0);.    if( pCol
1a330 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  l ){.      char 
1a340 2a 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 53  *zColl = sqliteS
1a350 74 72 4e 44 75 70 28 28 63 6f 6e 73 74 20 63 68  trNDup((const ch
1a360 61 72 20 2a 29 70 4e 61 6d 65 31 2d 3e 7a 2c 20  ar *)pName1->z, 
1a370 70 4e 61 6d 65 31 2d 3e 6e 29 3b 0a 20 20 20 20  pName1->n);.    
1a380 20 20 69 66 28 20 7a 43 6f 6c 6c 20 29 7b 0a 20    if( zColl ){. 
1a390 20 20 20 20 20 20 20 72 65 69 6e 64 65 78 44 61         reindexDa
1a3a0 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20  tabases(pParse, 
1a3b0 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  zColl);.        
1a3c0 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c 6c  sqliteFree(zColl
1a3d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1a3e0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
1a3f0 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
1a400 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
1a410 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
1a420 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29  ame2, &pObjName)
1a430 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20  ;.  if( iDb<0 ) 
1a440 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71  return;.  z = sq
1a450 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1a460 65 6e 28 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20  en(pObjName);.  
1a470 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
1a480 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62  b].zName;.  pTab
1a490 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
1a4a0 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b  ble(db, z, zDb);
1a4b0 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20  .  if( pTab ){. 
1a4c0 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28     reindexTable(
1a4d0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29  pParse, pTab, 0)
1a4e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
1a4f0 28 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  (z);.    return;
1a500 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20  .  }.  pIndex = 
1a510 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
1a520 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20  (db, z, zDb);.  
1a530 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
1a540 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20   if( pIndex ){. 
1a550 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
1a560 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
1a570 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
1a580 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
1a590 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
1a5a0 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72  ndex, -1);.    r
1a5b0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
1a5c0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1a5d0 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  rse, "unable to 
1a5e0 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a  identify the obj
1a5f0 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65  ect to be reinde
1a600 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  xed");.}.#endif.
1a610 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1a620 64 79 6e 61 6d 69 63 6c 79 20 61 6c 6c 6f 63 61  dynamicly alloca
1a630 74 65 64 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  ted KeyInfo stru
1a640 63 74 75 72 65 20 74 68 61 74 20 63 61 6e 20 62  cture that can b
1a650 65 20 75 73 65 64 0a 2a 2a 20 77 69 74 68 20 4f  e used.** with O
1a660 50 5f 4f 70 65 6e 52 65 61 64 20 6f 72 20 4f 50  P_OpenRead or OP
1a670 5f 4f 70 65 6e 57 72 69 74 65 20 74 6f 20 61 63  _OpenWrite to ac
1a680 63 65 73 73 20 64 61 74 61 62 61 73 65 20 69 6e  cess database in
1a690 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20  dex pIdx..**.** 
1a6a0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61  If successful, a
1a6b0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1a6c0 6e 65 77 20 73 74 72 75 63 74 75 72 65 20 69 73  new structure is
1a6d0 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68   returned. In th
1a6e0 69 73 20 63 61 73 65 0a 2a 2a 20 74 68 65 20 63  is case.** the c
1a6f0 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
1a700 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67  ible for calling
1a710 20 73 71 6c 69 74 65 46 72 65 65 28 29 20 6f 6e   sqliteFree() on
1a720 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 0a 2a   the returned .*
1a730 2a 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 61 6e  * pointer. If an
1a740 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 6f   error occurs (o
1a750 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 6f 72 20  ut of memory or 
1a760 6d 69 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6f  missing collatio
1a770 6e 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65 29 2c  n .** sequence),
1a780 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
1a790 64 20 61 6e 64 20 74 68 65 20 73 74 61 74 65 20  d and the state 
1a7a0 6f 66 20 70 50 61 72 73 65 20 75 70 64 61 74 65  of pParse update
1a7b0 64 20 74 6f 20 72 65 66 6c 65 63 74 0a 2a 2a 20  d to reflect.** 
1a7c0 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 4b 65  the error..*/.Ke
1a7d0 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 49 6e  yInfo *sqlite3In
1a7e0 64 65 78 4b 65 79 69 6e 66 6f 28 50 61 72 73 65  dexKeyinfo(Parse
1a7f0 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
1a800 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b  *pIdx){.  int i;
1a810 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49  .  int nCol = pI
1a820 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69  dx->nColumn;.  i
1a830 6e 74 20 6e 42 79 74 65 73 20 3d 20 73 69 7a 65  nt nBytes = size
1a840 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e  of(KeyInfo) + (n
1a850 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 43 6f  Col-1)*sizeof(Co
1a860 6c 6c 53 65 71 2a 29 20 2b 20 6e 43 6f 6c 3b 0a  llSeq*) + nCol;.
1a870 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20    KeyInfo *pKey 
1a880 3d 20 28 4b 65 79 49 6e 66 6f 20 2a 29 73 71 6c  = (KeyInfo *)sql
1a890 69 74 65 4d 61 6c 6c 6f 63 28 6e 42 79 74 65 73  iteMalloc(nBytes
1a8a0 29 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29  );..  if( pKey )
1a8b0 7b 0a 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72  {.    pKey->aSor
1a8c0 74 4f 72 64 65 72 20 3d 20 28 75 38 20 2a 29 26  tOrder = (u8 *)&
1a8d0 28 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f  (pKey->aColl[nCo
1a8e0 6c 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l]);.    assert(
1a8f0 20 26 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64   &pKey->aSortOrd
1a900 65 72 5b 6e 43 6f 6c 5d 3d 3d 26 28 28 28 75 38  er[nCol]==&(((u8
1a910 20 2a 29 70 4b 65 79 29 5b 6e 42 79 74 65 73 5d   *)pKey)[nBytes]
1a920 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ) );.    for(i=0
1a930 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
1a940 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
1a950 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  l = pIdx->azColl
1a960 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  [i];.      asser
1a970 74 28 20 7a 43 6f 6c 6c 20 29 3b 0a 20 20 20 20  t( zColl );.    
1a980 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d    pKey->aColl[i]
1a990 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
1a9a0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1a9b0 7a 43 6f 6c 6c 2c 20 2d 31 29 3b 0a 20 20 20 20  zColl, -1);.    
1a9c0 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64    pKey->aSortOrd
1a9d0 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53  er[i] = pIdx->aS
1a9e0 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20  ortOrder[i];.   
1a9f0 20 7d 0a 20 20 20 20 70 4b 65 79 2d 3e 6e 46 69   }.    pKey->nFi
1aa00 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 20 20 7d 0a  eld = nCol;.  }.
1aa10 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
1aa20 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Err ){.    sqlit
1aa30 65 46 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20  eFree(pKey);.   
1aa40 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20   pKey = 0;.  }. 
1aa50 20 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a   return pKey;.}.