/ Hex Artifact Content
Login

Artifact 178b24b35ada3688aa63d04cd6a2f972cb481aea:


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 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t.h"../*.** This
02f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
0300: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 53 51  ed when a new SQ
0310: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 62  L statement is b
0320: 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62  eginning to.** b
0330: 65 20 70 61 72 73 65 64 2e 20 20 49 6e 69 74 69  e parsed.  Initi
0340: 61 6c 69 7a 65 20 74 68 65 20 70 50 61 72 73 65  alize the pParse
0350: 20 73 74 72 75 63 74 75 72 65 20 61 73 20 6e 65   structure as ne
0360: 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eded..*/.void sq
0370: 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73 65 28  lite3BeginParse(
0380: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
0390: 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67 29 7b  nt explainFlag){
03a0: 0a 20 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  .  pParse->expla
03b0: 69 6e 20 3d 20 28 75 38 29 65 78 70 6c 61 69 6e  in = (u8)explain
03c0: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
03d0: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  nVar = 0;.}..#if
03e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
03f0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0400: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 4c 6f 63  .** The TableLoc
0410: 6b 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  k structure is o
0420: 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65 20  nly used by the 
0430: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0440: 28 29 20 61 6e 64 0a 2a 2a 20 63 6f 64 65 54 61  () and.** codeTa
0450: 62 6c 65 4c 6f 63 6b 73 28 29 20 66 75 6e 63 74  bleLocks() funct
0460: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ions..*/.struct 
0470: 54 61 62 6c 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  TableLock {.  in
0480: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
0490: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
04a0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
04b0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f  e table to be lo
04c0: 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  cked */.  int iT
04d0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ab;            /
04e0: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
04f0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0500: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
0510: 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20  8 isWriteLock;  
0520: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
0530: 77 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c  write lock.  Fal
0540: 73 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f  se for a read lo
0550: 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ck */.  const ch
0560: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
0570: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
0580: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  e */.};../*.** R
0590: 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
05a0: 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6c  hat we want to l
05b0: 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20 72  ock a table at r
05c0: 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a 2a  un-time.  .**.**
05d0: 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   The table to be
05e0: 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f 74   locked has root
05f0: 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20 69   page iTab and i
0600: 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61 62  s found in datab
0610: 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72 65  ase iDb..** A re
0620: 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c 6f  ad or a write lo
0630: 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e 20  ck can be taken 
0640: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73 57  depending on isW
0650: 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ritelock..**.** 
0660: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
0670: 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66 61  t records the fa
0680: 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ct that the lock
0690: 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54 68   is desired.  Th
06a0: 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61 6b  e.** code to mak
06b0: 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75 72  e the lock occur
06c0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
06d0: 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74 6f   a later call to
06e0: 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  .** codeTableLoc
06f0: 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75 72  ks() which occur
0700: 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  s during sqlite3
0710: 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
0720: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  */.void sqlite3T
0730: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72 73  ableLock(.  Pars
0740: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
0750: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0760: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
0770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
0780: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
0790: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
07a0: 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 20  e table to lock 
07b0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
07c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
07d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
07e0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c  he table to be l
07f0: 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69 73  ocked */.  u8 is
0800: 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f 2a  WriteLock,    /*
0810: 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69 74   True for a writ
0820: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73  e lock */.  cons
0830: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 2f  t char *zName  /
0840: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
0850: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
0860: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
0870: 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
0880: 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
0890: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
08a0: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 3b  i;.  int nBytes;
08b0: 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 3b  .  TableLock *p;
08c0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
08d0: 30 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  0 );..  for(i=0;
08e0: 20 69 3c 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54   i<pToplevel->nT
08f0: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0900: 20 20 20 20 70 20 3d 20 26 70 54 6f 70 6c 65 76      p = &pToplev
0910: 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69  el->aTableLock[i
0920: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 44  ];.    if( p->iD
0930: 62 3d 3d 69 44 62 20 26 26 20 70 2d 3e 69 54 61  b==iDb && p->iTa
0940: 62 3d 3d 69 54 61 62 20 29 7b 0a 20 20 20 20 20  b==iTab ){.     
0950: 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20   p->isWriteLock 
0960: 3d 20 28 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63  = (p->isWriteLoc
0970: 6b 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b  k || isWriteLock
0980: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
0990: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42  .    }.  }..  nB
09a0: 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 54 61  ytes = sizeof(Ta
09b0: 62 6c 65 4c 6f 63 6b 29 20 2a 20 28 70 54 6f 70  bleLock) * (pTop
09c0: 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63  level->nTableLoc
09d0: 6b 2b 31 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  k+1);.  pTopleve
09e0: 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 0a  l->aTableLock =.
09f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52        sqlite3DbR
0a00: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 54 6f  eallocOrFree(pTo
0a10: 70 6c 65 76 65 6c 2d 3e 64 62 2c 20 70 54 6f 70  plevel->db, pTop
0a20: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
0a30: 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  k, nBytes);.  if
0a40: 28 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61  ( pToplevel->aTa
0a50: 62 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  bleLock ){.    p
0a60: 20 3d 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61   = &pToplevel->a
0a70: 54 61 62 6c 65 4c 6f 63 6b 5b 70 54 6f 70 6c 65  TableLock[pTople
0a80: 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b  vel->nTableLock+
0a90: 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d  +];.    p->iDb =
0aa0: 20 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61   iDb;.    p->iTa
0ab0: 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d  b = iTab;.    p-
0ac0: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69  >isWriteLock = i
0ad0: 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20  sWriteLock;.    
0ae0: 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  p->zName = zName
0af0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
0b00: 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65  Toplevel->nTable
0b10: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 70 54  Lock = 0;.    pT
0b20: 6f 70 6c 65 76 65 6c 2d 3e 64 62 2d 3e 6d 61 6c  oplevel->db->mal
0b30: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
0b40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
0b50: 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b   an OP_TableLock
0b60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
0b70: 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b   each table lock
0b80: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 61  ed by the.** sta
0b90: 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75 72  tement (configur
0ba0: 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
0bb0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
0bc0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ))..*/.static vo
0bd0: 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  id codeTableLock
0be0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  s(Parse *pParse)
0bf0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0c00: 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70 56  e *pVdbe; ..  pV
0c10: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dbe = sqlite3Get
0c20: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
0c30: 61 73 73 65 72 74 28 20 70 56 64 62 65 21 3d 30  assert( pVdbe!=0
0c40: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47 65   ); /* sqlite3Ge
0c50: 74 56 64 62 65 20 63 61 6e 6e 6f 74 20 66 61 69  tVdbe cannot fai
0c60: 6c 3a 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  l: VDBE already 
0c70: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20  allocated */..  
0c80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
0c90: 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69  e->nTableLock; i
0ca0: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f  ++){.    TableLo
0cb0: 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d  ck *p = &pParse-
0cc0: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
0cd0: 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e      int p1 = p->
0ce0: 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  iDb;.    sqlite3
0cf0: 56 64 62 65 41 64 64 4f 70 34 28 70 56 64 62 65  VdbeAddOp4(pVdbe
0d00: 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20  , OP_TableLock, 
0d10: 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e  p1, p->iTab, p->
0d20: 69 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20  isWriteLock,.   
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f     p->zName, P4_
0d50: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  STATIC);.  }.}.#
0d60: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63  else.  #define c
0d70: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29  odeTableLocks(x)
0d80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0d90: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0da0: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0db0: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0dc0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0dd0: 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45  arsed and a VDBE
0de0: 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63   program to exec
0df0: 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ute that stateme
0e00: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0e10: 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72  repared.  This r
0e20: 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20  outine puts the 
0e30: 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65  finishing touche
0e40: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  s on the.** VDBE
0e50: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73   program and res
0e60: 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73  ets the pParse s
0e70: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
0e80: 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a   next.** parse..
0e90: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0ea0: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0eb0: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0ec0: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
0ed0: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
0ee0: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
0ef0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69  /.void sqlite3Fi
0f00: 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65  nishCoding(Parse
0f10: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
0f20: 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
0f30: 20 2a 76 3b 0a 0a 20 20 64 62 20 3d 20 70 50 61   *v;..  db = pPa
0f40: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64  rse->db;.  if( d
0f50: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0f60: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
0f70: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29  pParse->nested )
0f80: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
0f90: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
0fa0: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65 67 69  turn;..  /* Begi
0fb0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
0fc0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
0fd0: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
0fe0: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
0ff0: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1000: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1010: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1020: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1030: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1040: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1050: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1060: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
1070: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
1080: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1090: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
10a0: 48 61 6c 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  Halt);..    /* T
10b0: 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b 20 63  he cookie mask c
10c0: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69 74 20  ontains one bit 
10d0: 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73  for each databas
10e0: 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20 20 20  e file open..   
10f0: 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20 66 6f   ** (Bit 0 is fo
1100: 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20 69 73  r main, bit 1 is
1110: 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64 20 73   for temp, and s
1120: 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74 73 20  o forth.)  Bits 
1130: 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 66  are.    ** set f
1140: 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65  or each database
1150: 20 74 68 61 74 20 69 73 20 75 73 65 64 2e 20 20   that is used.  
1160: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1170: 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a 2a 20   start a.    ** 
1180: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 65  transaction on e
1190: 61 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73  ach used databas
11a0: 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66 79 20  e and to verify 
11b0: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
11c0: 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61 63 68  e.    ** on each
11d0: 20 75 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a   used database..
11e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
11f0: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
1200: 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 79 44 62  o>0 ){.      yDb
1210: 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 20 20 20  Mask mask;.     
1220: 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20   int iDb;.      
1230: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
1240: 65 72 65 28 76 2c 20 70 50 61 72 73 65 2d 3e 63  ere(v, pParse->c
1250: 6f 6f 6b 69 65 47 6f 74 6f 2d 31 29 3b 0a 20 20  ookieGoto-1);.  
1260: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 6d      for(iDb=0, m
1270: 61 73 6b 3d 31 3b 20 69 44 62 3c 64 62 2d 3e 6e  ask=1; iDb<db->n
1280: 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44  Db; mask<<=1, iD
1290: 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  b++){.        if
12a0: 28 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65  ( (mask & pParse
12b0: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30  ->cookieMask)==0
12c0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
12d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12e0: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
12f0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1300: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 4f  e3VdbeAddOp2(v,O
1310: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  P_Transaction, i
1320: 44 62 2c 20 28 6d 61 73 6b 20 26 20 70 50 61 72  Db, (mask & pPar
1330: 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d  se->writeMask)!=
1340: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
1350: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
1360: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
1370: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
1380: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
1390: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
13a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13b0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 56 65  eAddOp3(v, OP_Ve
13c0: 72 69 66 79 43 6f 6f 6b 69 65 2c 0a 20 20 20 20  rifyCookie,.    
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 20 20 20 20 69 44 62 2c 20 70 50 61          iDb, pPa
13f0: 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65  rse->cookieValue
1400: 5b 69 44 62 5d 2c 0a 20 20 20 20 20 20 20 20 20  [iDb],.         
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
1430: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
1440: 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  tion);.        }
1450: 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
1460: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1470: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
1480: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  {.        int i;
1490: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
14a0: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61  ; i<pParse->nVta
14b0: 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  bLock; i++){.   
14c0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 76 74 61         char *vta
14d0: 62 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  b = (char *)sqli
14e0: 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c  te3GetVTable(db,
14f0: 20 70 50 61 72 73 65 2d 3e 61 70 56 74 61 62 4c   pParse->apVtabL
1500: 6f 63 6b 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ock[i]);.       
1510: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1520: 64 4f 70 34 28 76 2c 20 4f 50 5f 56 42 65 67 69  dOp4(v, OP_VBegi
1530: 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 76 74 61 62  n, 0, 0, 0, vtab
1540: 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20  , P4_VTAB);.    
1550: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
1560: 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 20  arse->nVtabLock 
1570: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  = 0;.      }.#en
1580: 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  dif..      /* On
1590: 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69  ce all the cooki
15a0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72  es have been ver
15b0: 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61  ified and transa
15c0: 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a  ctions opened, .
15d0: 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20        ** obtain 
15e0: 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62  the required tab
15f0: 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69  le-locks. This i
1600: 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
1610: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73   the .      ** s
1620: 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74  hared-cache feat
1630: 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  ure is enabled..
1640: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
1650: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50  odeTableLocks(pP
1660: 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  arse);..      /*
1670: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20   Initialize any 
1680: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61  AUTOINCREMENT da
1690: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65  ta structures re
16a0: 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  quired..      */
16b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75  .      sqlite3Au
16c0: 74 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e  toincrementBegin
16d0: 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20  (pParse);..     
16e0: 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a 75 6d   /* Finally, jum
16f0: 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65  p back to the be
1700: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 65  ginning of the e
1710: 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65 2e 20  xecutable code. 
1720: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1730: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1740: 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65  _Goto, 0, pParse
1750: 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29 3b 0a 20  ->cookieGoto);. 
1760: 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20     }.  }...  /* 
1770: 47 65 74 20 74 68 65 20 56 44 42 45 20 70 72 6f  Get the VDBE pro
1780: 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72 20 65  gram ready for e
1790: 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20  xecution.  */.  
17a0: 69 66 28 20 76 20 26 26 20 41 4c 57 41 59 53 28  if( v && ALWAYS(
17b0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 29  pParse->nErr==0)
17c0: 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
17d0: 61 69 6c 65 64 20 29 7b 0a 23 69 66 64 65 66 20  ailed ){.#ifdef 
17e0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
17f0: 20 46 49 4c 45 20 2a 74 72 61 63 65 20 3d 20 28   FILE *trace = (
1800: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1810: 54 45 5f 56 64 62 65 54 72 61 63 65 29 21 3d 30  TE_VdbeTrace)!=0
1820: 20 3f 20 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20   ? stdout : 0;. 
1830: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72     sqlite3VdbeTr
1840: 61 63 65 28 76 2c 20 74 72 61 63 65 29 3b 0a 23  ace(v, trace);.#
1850: 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
1860: 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  ( pParse->iCache
1870: 4c 65 76 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20  Level==0 );  /* 
1880: 44 69 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d  Disables and re-
1890: 65 6e 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f  enables match */
18a0: 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75  .    /* A minimu
18b0: 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73 6f 72 20  m of one cursor 
18c0: 69 73 20 72 65 71 75 69 72 65 64 20 69 66 20 61  is required if a
18d0: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 69 73 20  utoincrement is 
18e0: 75 73 65 64 0a 20 20 20 20 2a 20 20 53 65 65 20  used.    *  See 
18f0: 74 69 63 6b 65 74 20 5b 61 36 39 36 33 37 39 63  ticket [a696379c
1900: 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20  1f08866] */.    
1910: 69 66 28 20 70 50 61 72 73 65 2d 3e 70 41 69 6e  if( pParse->pAin
1920: 63 21 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e  c!=0 && pParse->
1930: 6e 54 61 62 3d 3d 30 20 29 20 70 50 61 72 73 65  nTab==0 ) pParse
1940: 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 20 20  ->nTab = 1;.    
1950: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
1960: 65 61 64 79 28 76 2c 20 70 50 61 72 73 65 29 3b  eady(v, pParse);
1970: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
1980: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1990: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61     pParse->colNa
19a0: 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65  mesSet = 0;.  }e
19b0: 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  lse{.    pParse-
19c0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52  >rc = SQLITE_ERR
19d0: 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65  OR;.  }.  pParse
19e0: 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20 70 50  ->nTab = 0;.  pP
19f0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a  arse->nMem = 0;.
1a00: 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d    pParse->nSet =
1a10: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56   0;.  pParse->nV
1a20: 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ar = 0;.  pParse
1a30: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20 30  ->cookieMask = 0
1a40: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  ;.  pParse->cook
1a50: 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f  ieGoto = 0;.}../
1a60: 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70 61 72  *.** Run the par
1a70: 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ser and code gen
1a80: 65 72 61 74 6f 72 20 72 65 63 75 72 73 69 76 65  erator recursive
1a90: 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ly in order to g
1aa0: 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20  enerate.** code 
1ab0: 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74 61 74  for the SQL stat
1ac0: 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f  ement given onto
1ad0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1ae0: 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a  pParse context.*
1af0: 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  * currently unde
1b00: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
1b10: 20 57 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   When the parser
1b20: 20 69 73 20 72 75 6e 20 72 65 63 75 72 73 69 76   is run recursiv
1b30: 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c  ely.** this way,
1b40: 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61   the final OP_Ha
1b50: 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65 6e 64  lt is not append
1b60: 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69 6e 69  ed and other ini
1b70: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61  tialization.** a
1b80: 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  nd finalization 
1b90: 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74 74 65  steps are omitte
1ba0: 64 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20  d because those 
1bb0: 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62 79 20  are handling by 
1bc0: 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74  the.** outermost
1bd0: 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e   parser..**.** N
1be0: 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  ot everything is
1bf0: 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68 69 73   nestable.  This
1c00: 20 66 61 63 69 6c 69 74 79 20 69 73 20 64 65 73   facility is des
1c10: 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69 74 0a  igned to permit.
1c20: 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  ** INSERT, UPDAT
1c30: 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20 6f 70  E, and DELETE op
1c40: 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e 73 74  erations against
1c50: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20   SQLITE_MASTER. 
1c60: 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69 66 20   Use.** care if 
1c70: 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20 74 72  you decide to tr
1c80: 79 20 74 6f 20 75 73 65 20 74 68 69 73 20 72 6f  y to use this ro
1c90: 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f  utine for some o
1ca0: 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a  ther purposes..*
1cb0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4e 65  /.void sqlite3Ne
1cc0: 73 74 65 64 50 61 72 73 65 28 50 61 72 73 65 20  stedParse(Parse 
1cd0: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
1ce0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
1cf0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
1d00: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
1d10: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
1d20: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  = 0;.  sqlite3 *
1d30: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1d40: 0a 23 20 64 65 66 69 6e 65 20 53 41 56 45 5f 53  .# define SAVE_S
1d50: 5a 20 20 28 73 69 7a 65 6f 66 28 50 61 72 73 65  Z  (sizeof(Parse
1d60: 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 50 61 72  ) - offsetof(Par
1d70: 73 65 2c 6e 56 61 72 29 29 0a 20 20 63 68 61 72  se,nVar)).  char
1d80: 20 73 61 76 65 42 75 66 5b 53 41 56 45 5f 53 5a   saveBuf[SAVE_SZ
1d90: 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  ];..  if( pParse
1da0: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
1db0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1dc0: 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20  e->nested<10 ); 
1dd0: 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75   /* Nesting shou
1de0: 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69  ld only be of li
1df0: 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20  mited depth */. 
1e00: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
1e10: 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d  ormat);.  zSql =
1e20: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
1e30: 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  (db, zFormat, ap
1e40: 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
1e50: 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
1e60: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20  {.    return;   
1e70: 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74  /* A malloc must
1e80: 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a   have failed */.
1e90: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65    }.  pParse->ne
1ea0: 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79  sted++;.  memcpy
1eb0: 28 73 61 76 65 42 75 66 2c 20 26 70 50 61 72 73  (saveBuf, &pPars
1ec0: 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45 5f 53 5a  e->nVar, SAVE_SZ
1ed0: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61  );.  memset(&pPa
1ee0: 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c 20 53 41  rse->nVar, 0, SA
1ef0: 56 45 5f 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65  VE_SZ);.  sqlite
1f00: 33 52 75 6e 50 61 72 73 65 72 28 70 50 61 72 73  3RunParser(pPars
1f10: 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72 4d 73  e, zSql, &zErrMs
1f20: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
1f30: 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
1f40: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1f50: 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d  e(db, zSql);.  m
1f60: 65 6d 63 70 79 28 26 70 50 61 72 73 65 2d 3e 6e  emcpy(&pParse->n
1f70: 56 61 72 2c 20 73 61 76 65 42 75 66 2c 20 53 41  Var, saveBuf, SA
1f80: 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73 65  VE_SZ);.  pParse
1f90: 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f  ->nested--;.}../
1fa0: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
1fb0: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
1fc0: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
1fd0: 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
1fe0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c  database.** tabl
1ff0: 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  e given the name
2000: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
2010: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
2020: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
2030: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  ** database cont
2040: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
2050: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
2060: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  f not found..**.
2070: 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20  ** If zDatabase 
2080: 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61  is 0, all databa
2090: 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64  ses are searched
20a0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61   for the table a
20b0: 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  nd the.** first 
20c0: 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 69  matching table i
20d0: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f  s returned.  (No
20e0: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 75   checking for du
20f0: 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a  plicate table.**
2100: 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29   names is done.)
2110: 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64    The search ord
2120: 65 72 20 69 73 20 54 45 4d 50 20 66 69 72 73 74  er is TEMP first
2130: 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65  , then MAIN, the
2140: 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61  n any.** auxilia
2150: 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64  ry databases add
2160: 65 64 20 75 73 69 6e 67 20 74 68 65 20 41 54 54  ed using the ATT
2170: 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  ACH command..**.
2180: 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
2190: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29  te3LocateTable()
21a0: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
21b0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71 6c  te3FindTable(sql
21c0: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
21d0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
21e0: 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61  st char *zDataba
21f0: 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20  se){.  Table *p 
2200: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
2210: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 61 73 73  int nName;.  ass
2220: 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20 29 3b  ert( zName!=0 );
2230: 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  nName = sqlit
2240: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
2250: 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65  );.  /* All mute
2260: 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  xes are required
2270: 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
2280: 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77  ss.  Make sure w
2290: 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a  e hold them. */.
22a0: 20 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62    assert( zDatab
22b0: 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase!=0 || sqlite
22c0: 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
22d0: 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20 66  texes(db) );.  f
22e0: 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42  or(i=OMIT_TEMPDB
22f0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
2300: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28  ){.    int j = (
2310: 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20  i<2) ? i^1 : i; 
2320: 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50    /* Search TEMP
2330: 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a   before MAIN */.
2340: 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73      if( zDatabas
2350: 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  e!=0 && sqlite3S
2360: 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65  trICmp(zDatabase
2370: 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61  , db->aDb[j].zNa
2380: 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  me) ) continue;.
2390: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
23a0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
23b0: 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a  ld(db, j, 0) );.
23c0: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48      p = sqlite3H
23d0: 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62  ashFind(&db->aDb
23e0: 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  [j].pSchema->tbl
23f0: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Hash, zName, nNa
2400: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  me);.    if( p )
2410: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
2420: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
2430: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
2440: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
2450: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
2460: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
2470: 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69  base.** table gi
2480: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
2490: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
24a0: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
24b0: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  name of the.** d
24c0: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
24d0: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
24e0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
24f0: 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c  t found.  Also l
2500: 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  eave an.** error
2510: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
2520: 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
2530: 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
2540: 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
2550: 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74  outine and sqlit
2560: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73  e3FindTable() is
2570: 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f   that this.** ro
2580: 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20  utine leaves an 
2590: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
25a0: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
25b0: 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65   where.** sqlite
25c0: 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65  3FindTable() doe
25d0: 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20  s not..*/.Table 
25e0: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61  *sqlite3LocateTa
25f0: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
2600: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
2610: 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69 63   context in whic
2620: 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f  h to report erro
2630: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  rs */.  int isVi
2640: 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew,            /
2650: 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69 6e  * True if lookin
2660: 67 20 66 6f 72 20 61 20 56 49 45 57 20 72 61 74  g for a VIEW rat
2670: 68 65 72 20 74 68 61 6e 20 61 20 54 41 42 4c 45  her than a TABLE
2680: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2690: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20   *zName,     /* 
26a0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
26b0: 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  e we are looking
26c0: 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   for */.  const 
26d0: 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20 20  char *zDbase    
26e0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
26f0: 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68 74  database.  Might
2700: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   be NULL */.){. 
2710: 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a   Table *p;..  /*
2720: 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
2730: 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
2740: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
2750: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
2760: 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
2770: 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
2780: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
2790: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
27a0: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
27b0: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
27c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
27d0: 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  }..  p = sqlite3
27e0: 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
27f0: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  ->db, zName, zDb
2800: 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ase);.  if( p==0
2810: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
2820: 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69 65  ar *zMsg = isVie
2830: 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65  w ? "no such vie
2840: 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61  w" : "no such ta
2850: 62 6c 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44  ble";.    if( zD
2860: 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71  base ){.      sq
2870: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2880: 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73  arse, "%s: %s.%s
2890: 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c  ", zMsg, zDbase,
28a0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
28b0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
28c0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
28d0: 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67  , "%s: %s", zMsg
28e0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  , zName);.    }.
28f0: 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
2900: 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d  kSchema = 1;.  }
2910: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
2920: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
2930: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
2940: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
2950: 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63  bes .** a partic
2960: 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e  ular index given
2970: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
2980: 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  t index.** and t
2990: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
29a0: 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e  atabase that con
29b0: 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e  tains the index.
29c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
29d0: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
29e0: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
29f0: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
2a00: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
2a10: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62  d for the.** tab
2a20: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  le and the first
2a30: 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20   matching index 
2a40: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
2a50: 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f  o checking.** fo
2a60: 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65  r duplicate inde
2a70: 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  x names is done.
2a80: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
2a90: 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66  der is.** TEMP f
2aa0: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2ab0: 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69   then any auxili
2ac0: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
2ad0: 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ded.** using the
2ae0: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
2af0: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
2b00: 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69  e3FindIndex(sqli
2b10: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
2b20: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
2b30: 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
2b40: 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20  Index *p = 0;.  
2b50: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61  int i;.  int nNa
2b60: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2b70: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 2f  en30(zName);.  /
2b80: 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72  * All mutexes ar
2b90: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  e required for s
2ba0: 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d  chema access.  M
2bb0: 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64  ake sure we hold
2bc0: 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65   them. */.  asse
2bd0: 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73 71  rt( zDb!=0 || sq
2be0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
2bf0: 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b  llMutexes(db) );
2c00: 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45  .  for(i=OMIT_TE
2c10: 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  MPDB; i<db->nDb;
2c20: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
2c30: 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a   = (i<2) ? i^1 :
2c40: 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54   i;  /* Search T
2c50: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
2c60: 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  */.    Schema *p
2c70: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
2c80: 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20  [j].pSchema;.   
2c90: 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d 61   assert( pSchema
2ca0: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20   );.    if( zDb 
2cb0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2cc0: 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a  p(zDb, db->aDb[j
2cd0: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
2ce0: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
2cf0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
2d00: 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30  texHeld(db, j, 0
2d10: 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  ) );.    p = sql
2d20: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 53  ite3HashFind(&pS
2d30: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
2d40: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
2d50: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
2d60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
2d70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61  ;.}../*.** Recla
2d80: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73  im the memory us
2d90: 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a  ed by an index.*
2da0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
2db0: 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  eeIndex(sqlite3 
2dc0: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a  *db, Index *p){.
2dd0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2de0: 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71  MIT_ANALYZE.  sq
2df0: 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78  lite3DeleteIndex
2e00: 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a  Samples(db, p);.
2e10: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
2e20: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 43  DbFree(db, p->zC
2e30: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
2e40: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
2e50: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  }../*.** For the
2e60: 20 69 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49   index called zI
2e70: 64 78 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20  dxName which is 
2e80: 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74  found in the dat
2e90: 61 62 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e  abase iDb,.** un
2ea0: 6c 69 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20  like that index 
2eb0: 66 72 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74  from its Table t
2ec0: 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69  hen remove the i
2ed0: 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  ndex from.** the
2ee0: 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
2ef0: 65 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d  e and free all m
2f00: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
2f10: 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
2f20: 69 74 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ith the index..*
2f30: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  /.void sqlite3Un
2f40: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64  linkAndDeleteInd
2f50: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ex(sqlite3 *db, 
2f60: 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63  int iDb, const c
2f70: 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a  har *zIdxName){.
2f80: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
2f90: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 48 61  .  int len;.  Ha
2fa0: 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73  sh *pHash;..  as
2fb0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
2fc0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
2fd0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48   iDb, 0) );.  pH
2fe0: 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  ash = &db->aDb[i
2ff0: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db].pSchema->idx
3000: 48 61 73 68 3b 0a 20 20 6c 65 6e 20 3d 20 73 71  Hash;.  len = sq
3010: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49  lite3Strlen30(zI
3020: 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65  dxName);.  pInde
3030: 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  x = sqlite3HashI
3040: 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64  nsert(pHash, zId
3050: 78 4e 61 6d 65 2c 20 6c 65 6e 2c 20 30 29 3b 0a  xName, len, 0);.
3060: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e    if( ALWAYS(pIn
3070: 64 65 78 29 20 29 7b 0a 20 20 20 20 69 66 28 20  dex) ){.    if( 
3080: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
3090: 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29  pIndex==pIndex )
30a0: 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
30b0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d  pTable->pIndex =
30c0: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
30d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30e0: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20   Index *p;.     
30f0: 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f   /* Justificatio
3100: 6e 20 6f 66 20 41 4c 57 41 59 53 28 29 3b 20 20  n of ALWAYS();  
3110: 54 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62  The index must b
3120: 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  e on the list of
3130: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 65  .      ** indice
3140: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 20 3d 20  s. */.      p = 
3150: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
3160: 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68  pIndex;.      wh
3170: 69 6c 65 28 20 41 4c 57 41 59 53 28 70 29 20 26  ile( ALWAYS(p) &
3180: 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64  & p->pNext!=pInd
3190: 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  ex ){ p = p->pNe
31a0: 78 74 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20  xt; }.      if( 
31b0: 41 4c 57 41 59 53 28 70 20 26 26 20 70 2d 3e 70  ALWAYS(p && p->p
31c0: 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29 20 29 7b  Next==pIndex) ){
31d0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78  .        p->pNex
31e0: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
31f0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
3200: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 64  .    freeIndex(d
3210: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
3220: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
3230: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
3240: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  ges;.}../*.** Lo
3250: 6f 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c  ok through the l
3260: 69 73 74 20 6f 66 20 6f 70 65 6e 20 64 61 74 61  ist of open data
3270: 62 61 73 65 20 66 69 6c 65 73 20 69 6e 20 64 62  base files in db
3280: 2d 3e 61 44 62 5b 5d 20 61 6e 64 20 69 66 0a 2a  ->aDb[] and if.*
3290: 2a 20 61 6e 79 20 68 61 76 65 20 62 65 65 6e 20  * any have been 
32a0: 63 6c 6f 73 65 64 2c 20 72 65 6d 6f 76 65 20 74  closed, remove t
32b0: 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 6c 69 73  hem from the lis
32c0: 74 2e 20 20 52 65 61 6c 6c 6f 63 61 74 65 20 74  t.  Reallocate t
32d0: 68 65 0a 2a 2a 20 64 62 2d 3e 61 44 62 5b 5d 20  he.** db->aDb[] 
32e0: 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 20 73  structure to a s
32f0: 6d 61 6c 6c 65 72 20 73 69 7a 65 2c 20 69 66 20  maller size, if 
3300: 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  possible..**.** 
3310: 45 6e 74 72 79 20 30 20 28 74 68 65 20 22 6d 61  Entry 0 (the "ma
3320: 69 6e 22 20 64 61 74 61 62 61 73 65 29 20 61 6e  in" database) an
3330: 64 20 65 6e 74 72 79 20 31 20 28 74 68 65 20 22  d entry 1 (the "
3340: 74 65 6d 70 22 20 64 61 74 61 62 61 73 65 29 0a  temp" database).
3350: 2a 2a 20 61 72 65 20 6e 65 76 65 72 20 63 61 6e  ** are never can
3360: 64 69 64 61 74 65 73 20 66 6f 72 20 62 65 69 6e  didates for bein
3370: 67 20 63 6f 6c 6c 61 70 73 65 64 2e 0a 2a 2f 0a  g collapsed..*/.
3380: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 6c  void sqlite3Coll
3390: 61 70 73 65 44 61 74 61 62 61 73 65 41 72 72 61  apseDatabaseArra
33a0: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  y(sqlite3 *db){.
33b0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f    int i, j;.  fo
33c0: 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e  r(i=j=2; i<db->n
33d0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  Db; i++){.    st
33e0: 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26  ruct Db *pDb = &
33f0: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
3400: 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20  if( pDb->pBt==0 
3410: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
3420: 44 62 46 72 65 65 28 64 62 2c 20 70 44 62 2d 3e  DbFree(db, pDb->
3430: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 44  zName);.      pD
3440: 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  b->zName = 0;.  
3450: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
3460: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20    }.    if( j<i 
3470: 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ){.      db->aDb
3480: 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  [j] = db->aDb[i]
3490: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b  ;.    }.    j++;
34a0: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64  .  }.  memset(&d
34b0: 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64  b->aDb[j], 0, (d
34c0: 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66  b->nDb-j)*sizeof
34d0: 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20  (db->aDb[j]));. 
34e0: 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20   db->nDb = j;.  
34f0: 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26  if( db->nDb<=2 &
3500: 26 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61  & db->aDb!=db->a
3510: 44 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20  DbStatic ){.    
3520: 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74  memcpy(db->aDbSt
3530: 61 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32  atic, db->aDb, 2
3540: 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b  *sizeof(db->aDb[
3550: 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  0]));.    sqlite
3560: 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e  3DbFree(db, db->
3570: 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44  aDb);.    db->aD
3580: 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69  b = db->aDbStati
3590: 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c;.  }.}../*.** 
35a0: 52 65 73 65 74 20 74 68 65 20 73 63 68 65 6d 61  Reset the schema
35b0: 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
35c0: 65 20 61 74 20 69 6e 64 65 78 20 69 44 62 2e 20  e at index iDb. 
35d0: 20 41 6c 73 6f 20 72 65 73 65 74 20 74 68 65 0a   Also reset the.
35e0: 2a 2a 20 54 45 4d 50 20 73 63 68 65 6d 61 2e 0a  ** TEMP schema..
35f0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
3600: 65 73 65 74 4f 6e 65 53 63 68 65 6d 61 28 73 71  esetOneSchema(sq
3610: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
3620: 44 62 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 0a  Db){.  Db *pDb;.
3630: 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62    assert( iDb<db
3640: 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 43  ->nDb );..  /* C
3650: 61 73 65 20 31 3a 20 20 52 65 73 65 74 20 74 68  ase 1:  Reset th
3660: 65 20 73 69 6e 67 6c 65 20 73 63 68 65 6d 61 20  e single schema 
3670: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 69 44  identified by iD
3680: 62 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62  b */.  pDb = &db
3690: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 61 73  ->aDb[iDb];.  as
36a0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
36b0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
36c0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 61 73   iDb, 0) );.  as
36d0: 73 65 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65  sert( pDb->pSche
36e0: 6d 61 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  ma!=0 );.  sqlit
36f0: 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44  e3SchemaClear(pD
3700: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 20 20  b->pSchema);..  
3710: 2f 2a 20 49 66 20 61 6e 79 20 64 61 74 61 62 61  /* If any databa
3720: 73 65 20 6f 74 68 65 72 20 74 68 61 6e 20 54 45  se other than TE
3730: 4d 50 20 69 73 20 72 65 73 65 74 2c 20 74 68 65  MP is reset, the
3740: 6e 20 61 6c 73 6f 20 72 65 73 65 74 20 54 45 4d  n also reset TEM
3750: 50 0a 20 20 2a 2a 20 73 69 6e 63 65 20 54 45 4d  P.  ** since TEM
3760: 50 20 6d 69 67 68 74 20 62 65 20 68 6f 6c 64 69  P might be holdi
3770: 6e 67 20 74 72 69 67 67 65 72 73 20 74 68 61 74  ng triggers that
3780: 20 72 65 66 65 72 65 6e 63 65 20 74 61 62 6c 65   reference table
3790: 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74  s in the.  ** ot
37a0: 68 65 72 20 64 61 74 61 62 61 73 65 2e 0a 20 20  her database..  
37b0: 2a 2f 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20  */.  if( iDb!=1 
37c0: 29 7b 0a 20 20 20 20 70 44 62 20 3d 20 26 64 62  ){.    pDb = &db
37d0: 2d 3e 61 44 62 5b 31 5d 3b 0a 20 20 20 20 61 73  ->aDb[1];.    as
37e0: 73 65 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65  sert( pDb->pSche
37f0: 6d 61 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  ma!=0 );.    sql
3800: 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28  ite3SchemaClear(
3810: 70 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pDb->pSchema);. 
3820: 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a   }.  return;.}..
3830: 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20  /*.** Erase all 
3840: 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69  schema informati
3850: 6f 6e 20 66 72 6f 6d 20 61 6c 6c 20 61 74 74 61  on from all atta
3860: 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 28  ched databases (
3870: 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 22 6d 61  including.** "ma
3880: 69 6e 22 20 61 6e 64 20 22 74 65 6d 70 22 29 20  in" and "temp") 
3890: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74  for a single dat
38a0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
38b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
38c0: 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73  3ResetAllSchemas
38d0: 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 73 71 6c  OfConnection(sql
38e0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
38f0: 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   i;.  sqlite3Btr
3900: 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
3910: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
3920: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
3930: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
3940: 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
3950: 44 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  Db->pSchema ){. 
3960: 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65       sqlite3Sche
3970: 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63  maClear(pDb->pSc
3980: 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  hema);.    }.  }
3990: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
39a0: 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  ~SQLITE_InternCh
39b0: 61 6e 67 65 73 3b 0a 20 20 73 71 6c 69 74 65 33  anges;.  sqlite3
39c0: 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64  VtabUnlockList(d
39d0: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  b);.  sqlite3Btr
39e0: 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a  eeLeaveAll(db);.
39f0: 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73    sqlite3Collaps
3a00: 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28 64  eDatabaseArray(d
3a10: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  b);.}../*.** Thi
3a20: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
3a30: 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69  led when a commi
3a40: 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69  t occurs..*/.voi
3a50: 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49  d sqlite3CommitI
3a60: 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73  nternalChanges(s
3a70: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64  qlite3 *db){.  d
3a80: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
3a90: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
3aa0: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  s;.}../*.** Dele
3ab0: 74 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  te memory alloca
3ac0: 74 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ted for the colu
3ad0: 6d 6e 20 6e 61 6d 65 73 20 6f 66 20 61 20 74 61  mn names of a ta
3ae0: 62 6c 65 20 6f 72 20 76 69 65 77 20 28 74 68 65  ble or view (the
3af0: 0a 2a 2a 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d  .** Table.aCol[]
3b00: 20 61 72 72 61 79 29 2e 0a 2a 2f 0a 73 74 61 74   array)..*/.stat
3b10: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 44 65  ic void sqliteDe
3b20: 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  leteColumnNames(
3b30: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62  sqlite3 *db, Tab
3b40: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69  le *pTable){.  i
3b50: 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  nt i;.  Column *
3b60: 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  pCol;.  assert( 
3b70: 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69  pTable!=0 );.  i
3b80: 66 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c  f( (pCol = pTabl
3b90: 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20  e->aCol)!=0 ){. 
3ba0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
3bb0: 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c  able->nCol; i++,
3bc0: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
3bd0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3be0: 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCol->zName);.
3bf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
3c00: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c  rDelete(db, pCol
3c10: 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->pDflt);.      
3c20: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3c30: 2c 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a  , pCol->zDflt);.
3c40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
3c50: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54  ree(db, pCol->zT
3c60: 79 70 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ype);.      sqli
3c70: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43  te3DbFree(db, pC
3c80: 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  ol->zColl);.    
3c90: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
3ca0: 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  ree(db, pTable->
3cb0: 61 43 6f 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  aCol);.  }.}../*
3cc0: 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d  .** Remove the m
3cd0: 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63  emory data struc
3ce0: 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64  tures associated
3cf0: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a   with the given.
3d00: 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68  ** Table.  No ch
3d10: 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74  anges are made t
3d20: 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72  o disk by this r
3d30: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
3d40: 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20  is routine just 
3d50: 64 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61  deletes the data
3d60: 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20   structure.  It 
3d70: 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a  does not unlink.
3d80: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74  ** the table dat
3d90: 61 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d  a structure from
3da0: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e   the hash table.
3db0: 20 20 42 75 74 20 69 74 20 64 6f 65 73 20 64 65    But it does de
3dc0: 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20  stroy.** memory 
3dd0: 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 74 68  structures of th
3de0: 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f  e indices and fo
3df0: 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63  reign keys assoc
3e00: 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74  iated with .** t
3e10: 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
3e20: 54 68 65 20 64 62 20 70 61 72 61 6d 65 74 65 72  The db parameter
3e30: 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49   is optional.  I
3e40: 74 20 69 73 20 6e 65 65 64 65 64 20 69 66 20 74  t is needed if t
3e50: 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20  he Table object 
3e60: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f  .** contains loo
3e70: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 20 20  kaside memory.  
3e80: 28 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 69  (Table objects i
3e90: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 64 6f 20  n the schema do 
3ea0: 6e 6f 74 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61  not use.** looka
3eb0: 73 69 64 65 20 6d 65 6d 6f 72 79 2c 20 62 75 74  side memory, but
3ec0: 20 73 6f 6d 65 20 65 70 68 65 6d 65 72 61 6c 20   some ephemeral 
3ed0: 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 64 6f  Table objects do
3ee0: 2e 29 20 20 4f 72 20 74 68 65 0a 2a 2a 20 64 62  .)  Or the.** db
3ef0: 20 70 61 72 61 6d 65 74 65 72 20 63 61 6e 20 62   parameter can b
3f00: 65 20 75 73 65 64 20 77 69 74 68 20 64 62 2d 3e  e used with db->
3f10: 70 6e 42 79 74 65 73 46 72 65 65 64 20 74 6f 20  pnBytesFreed to 
3f20: 6d 65 61 73 75 72 65 20 74 68 65 20 6d 65 6d 6f  measure the memo
3f30: 72 79 0a 2a 2a 20 75 73 65 64 20 62 79 20 74 68  ry.** used by th
3f40: 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a  e Table object..
3f50: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
3f60: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
3f70: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
3f80: 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20  Table){.  Index 
3f90: 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b  *pIndex, *pNext;
3fa0: 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74  .  TESTONLY( int
3fb0: 20 6e 4c 6f 6f 6b 61 73 69 64 65 3b 20 29 20 2f   nLookaside; ) /
3fc0: 2a 20 55 73 65 64 20 74 6f 20 76 65 72 69 66 79  * Used to verify
3fd0: 20 6c 6f 6f 6b 61 73 69 64 65 20 6e 6f 74 20 75   lookaside not u
3fe0: 73 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 2a  sed for schema *
3ff0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 54  /..  assert( !pT
4000: 61 62 6c 65 20 7c 7c 20 70 54 61 62 6c 65 2d 3e  able || pTable->
4010: 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  nRef>0 );..  /* 
4020: 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
4030: 65 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68  e table until th
4040: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
4050: 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20  t reaches zero. 
4060: 2a 2f 0a 20 20 69 66 28 20 21 70 54 61 62 6c 65  */.  if( !pTable
4070: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
4080: 20 28 28 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e   ((!db || db->pn
4090: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26  BytesFreed==0) &
40a0: 26 20 28 2d 2d 70 54 61 62 6c 65 2d 3e 6e 52 65  & (--pTable->nRe
40b0: 66 29 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  f)>0) ) return;.
40c0: 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65  .  /* Record the
40d0: 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74   number of outst
40e0: 61 6e 64 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65  anding lookaside
40f0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e 20   allocations in 
4100: 73 63 68 65 6d 61 20 54 61 62 6c 65 73 0a 20 20  schema Tables.  
4110: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e  ** prior to doin
4120: 67 20 61 6e 79 20 66 72 65 65 28 29 20 6f 70 65  g any free() ope
4130: 72 61 74 69 6f 6e 73 2e 20 20 53 69 6e 63 65 20  rations.  Since 
4140: 73 63 68 65 6d 61 20 54 61 62 6c 65 73 20 64 6f  schema Tables do
4150: 20 6e 6f 74 20 75 73 65 0a 20 20 2a 2a 20 6c 6f   not use.  ** lo
4160: 6f 6b 61 73 69 64 65 2c 20 74 68 69 73 20 6e 75  okaside, this nu
4170: 6d 62 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20  mber should not 
4180: 63 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 54 45 53  change. */.  TES
4190: 54 4f 4e 4c 59 28 20 6e 4c 6f 6f 6b 61 73 69 64  TONLY( nLookasid
41a0: 65 20 3d 20 28 64 62 20 26 26 20 28 70 54 61 62  e = (db && (pTab
41b0: 6c 65 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  le->tabFlags & T
41c0: 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 29  F_Ephemeral)==0)
41d0: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
41f0: 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20 3a  lookaside.nOut :
4200: 20 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65   0 );..  /* Dele
4210: 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61  te all indices a
4220: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
4230: 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  his table. */.  
4240: 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61  for(pIndex = pTa
4250: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e  ble->pIndex; pIn
4260: 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78  dex; pIndex=pNex
4270: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
4280: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
4290: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65     assert( pInde
42a0: 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  x->pSchema==pTab
42b0: 6c 65 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20  le->pSchema );. 
42c0: 20 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62     if( !db || db
42d0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
42e0: 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  0 ){.      char 
42f0: 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e 64 65 78 2d  *zName = pIndex-
4300: 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20 20 20 20 54  >zName; .      T
4310: 45 53 54 4f 4e 4c 59 20 28 20 49 6e 64 65 78 20  ESTONLY ( Index 
4320: 2a 70 4f 6c 64 20 3d 20 29 20 73 71 6c 69 74 65  *pOld = ) sqlite
4330: 33 48 61 73 68 49 6e 73 65 72 74 28 0a 09 20 20  3HashInsert(..  
4340: 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61  &pIndex->pSchema
4350: 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65  ->idxHash, zName
4360: 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
4370: 30 28 7a 4e 61 6d 65 29 2c 20 30 0a 20 20 20 20  0(zName), 0.    
4380: 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
4390: 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69  t( db==0 || sqli
43a0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
43b0: 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78  ld(db, 0, pIndex
43c0: 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
43d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64      assert( pOld
43e0: 3d 3d 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c 64  ==pIndex || pOld
43f0: 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ==0 );.    }.   
4400: 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70   freeIndex(db, p
4410: 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Index);.  }..  /
4420: 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 66 6f 72  * Delete any for
4430: 65 69 67 6e 20 6b 65 79 73 20 61 74 74 61 63 68  eign keys attach
4440: 65 64 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  ed to this table
4450: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46 6b  . */.  sqlite3Fk
4460: 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c  Delete(db, pTabl
4470: 65 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  e);..  /* Delete
4480: 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
4490: 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  ture itself..  *
44a0: 2f 0a 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65  /.  sqliteDelete
44b0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20  ColumnNames(db, 
44c0: 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74  pTable);.  sqlit
44d0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
44e0: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  ble->zName);.  s
44f0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4500: 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66   pTable->zColAff
4510: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
4520: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61  ctDelete(db, pTa
4530: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 23  ble->pSelect);.#
4540: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4550: 49 54 5f 43 48 45 43 4b 0a 20 20 73 71 6c 69 74  IT_CHECK.  sqlit
4560: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
4570: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68  (db, pTable->pCh
4580: 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  eck);.#endif.#if
4590: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
45a0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
45b0: 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61 72  sqlite3VtabClear
45c0: 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 23 65  (db, pTable);.#e
45d0: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62  ndif.  sqlite3Db
45e0: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 29  Free(db, pTable)
45f0: 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  ;..  /* Verify t
4600: 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73 69 64 65  hat no lookaside
4610: 20 6d 65 6d 6f 72 79 20 77 61 73 20 75 73 65 64   memory was used
4620: 20 62 79 20 73 63 68 65 6d 61 20 74 61 62 6c 65   by schema table
4630: 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  s */.  assert( n
4640: 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30 20 7c 7c 20  Lookaside==0 || 
4650: 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 64 62 2d 3e  nLookaside==db->
4660: 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20 29  lookaside.nOut )
4670: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  ;.}../*.** Unlin
4680: 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c  k the given tabl
4690: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
46a0: 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64  tables and the d
46b0: 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62  elete the.** tab
46c0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74  le structure wit
46d0: 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65  h all its indice
46e0: 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65  s and foreign ke
46f0: 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ys..*/.void sqli
4700: 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
4710: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
4720: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f  *db, int iDb, co
4730: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61  nst char *zTabNa
4740: 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  me){.  Table *p;
4750: 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61  .  Db *pDb;..  a
4760: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
4770: 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
4780: 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
4790: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54 61  );.  assert( zTa
47a0: 62 4e 61 6d 65 20 29 3b 0a 20 20 61 73 73 65 72  bName );.  asser
47b0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
47c0: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
47d0: 62 2c 20 30 29 20 29 3b 0a 20 20 74 65 73 74 63  b, 0) );.  testc
47e0: 61 73 65 28 20 7a 54 61 62 4e 61 6d 65 5b 30 5d  ase( zTabName[0]
47f0: 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a 65 72 6f 2d  ==0 );  /* Zero-
4800: 6c 65 6e 67 74 68 20 74 61 62 6c 65 20 6e 61 6d  length table nam
4810: 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 2a  es are allowed *
4820: 2f 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  /.  pDb = &db->a
4830: 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73  Db[iDb];.  p = s
4840: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
4850: 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  (&pDb->pSchema->
4860: 74 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61 6d  tblHash, zTabNam
4870: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
4880: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
4890: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 61 62 4e  e3Strlen30(zTabN
48a0: 61 6d 65 29 2c 30 29 3b 0a 20 20 73 71 6c 69 74  ame),0);.  sqlit
48b0: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
48c0: 2c 20 70 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  , p);.  db->flag
48d0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
48e0: 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a  rnChanges;.}../*
48f0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65  .** Given a toke
4900: 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72 69  n, return a stri
4910: 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73  ng that consists
4920: 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66 20   of the text of 
4930: 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 2e 20 20  that.** token.  
4940: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
4950: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
4960: 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64  g.** is obtained
4970: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
4980: 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65  oc() and must be
4990: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
49a0: 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
49b0: 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 71 75 6f  n..**.** Any quo
49c0: 74 61 74 69 6f 6e 20 6d 61 72 6b 73 20 28 65 78  tation marks (ex
49d0: 3a 20 20 22 6e 61 6d 65 22 2c 20 27 6e 61 6d 65  :  "name", 'name
49e0: 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72 20 60 6e  ', [name], or `n
49f0: 61 6d 65 60 29 20 74 68 61 74 0a 2a 2a 20 73 75  ame`) that.** su
4a00: 72 72 6f 75 6e 64 20 74 68 65 20 62 6f 64 79 20  rround the body 
4a10: 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 61 72 65  of the token are
4a20: 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20   removed..**.** 
4a30: 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74 65 6e  Tokens are often
4a40: 20 6a 75 73 74 20 70 6f 69 6e 74 65 72 73 20 69   just pointers i
4a50: 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nto the original
4a60: 20 53 51 4c 20 74 65 78 74 20 61 6e 64 20 73 6f   SQL text and so
4a70: 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30 30  .** are not \000
4a80: 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20   terminated and 
4a90: 61 72 65 20 6e 6f 74 20 70 65 72 73 69 73 74 65  are not persiste
4aa0: 6e 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65  nt.  The returne
4ab0: 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c  d string.** is \
4ac0: 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61  000 terminated a
4ad0: 6e 64 20 69 73 20 70 65 72 73 69 73 74 65 6e 74  nd is persistent
4ae0: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
4af0: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
4b00: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b  sqlite3 *db, Tok
4b10: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68  en *pName){.  ch
4b20: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28  ar *zName;.  if(
4b30: 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e   pName ){.    zN
4b40: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
4b50: 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72  trNDup(db, (char
4b60: 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  *)pName->z, pNam
4b70: 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  e->n);.    sqlit
4b80: 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
4b90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
4ba0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Name = 0;.  }.  
4bb0: 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a  return zName;.}.
4bc0: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  ./*.** Open the 
4bd0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
4be0: 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64 61  ble stored in da
4bf0: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69 44  tabase number iD
4c00: 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67  b for.** writing
4c10: 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6f  . The table is o
4c20: 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72 73  pened using curs
4c30: 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  or 0..*/.void sq
4c40: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
4c50: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 2c 20 69  able(Parse *p, i
4c60: 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20  nt iDb){.  Vdbe 
4c70: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
4c80: 64 62 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  dbe(p);.  sqlite
4c90: 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 44  3TableLock(p, iD
4ca0: 62 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  b, MASTER_ROOT, 
4cb0: 31 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  1, SCHEMA_TABLE(
4cc0: 69 44 62 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  iDb));.  sqlite3
4cd0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
4ce0: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d  _OpenWrite, 0, M
4cf0: 41 53 54 45 52 5f 52 4f 4f 54 2c 20 69 44 62 29  ASTER_ROOT, iDb)
4d00: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
4d10: 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
4d20: 63 68 61 72 20 2a 29 35 2c 20 50 34 5f 49 4e 54  char *)5, P4_INT
4d30: 33 32 29 3b 20 20 2f 2a 20 35 20 63 6f 6c 75 6d  32);  /* 5 colum
4d40: 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28  n table */.  if(
4d50: 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20   p->nTab==0 ){. 
4d60: 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a     p->nTab = 1;.
4d70: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72    }.}../*.** Par
4d80: 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69  ameter zName poi
4d90: 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72  nts to a nul-ter
4da0: 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72 20 63  minated buffer c
4db0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61  ontaining the na
4dc0: 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61 62  me.** of a datab
4dd0: 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65  ase ("main", "te
4de0: 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20  mp" or the name 
4df0: 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  of an attached d
4e00: 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  b). This.** func
4e10: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
4e20: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61   index of the na
4e30: 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20  med database in 
4e40: 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a  db->aDb[], or.**
4e50: 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64   -1 if the named
4e60: 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f   db cannot be fo
4e70: 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  und..*/.int sqli
4e80: 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73 71  te3FindDbName(sq
4e90: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
4ea0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
4eb0: 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20   int i = -1;    
4ec0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
4ed0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28   number */.  if(
4ee0: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44 62   zName ){.    Db
4ef0: 20 2a 70 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e   *pDb;.    int n
4f00: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
4f10: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66  30(zName);.    f
4f20: 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29  or(i=(db->nDb-1)
4f30: 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69  , pDb=&db->aDb[i
4f40: 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44  ]; i>=0; i--, pD
4f50: 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20  b--){.      if( 
4f60: 28 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c  (!OMIT_TEMPDB ||
4f70: 20 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d 73 71   i!=1 ) && n==sq
4f80: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44  lite3Strlen30(pD
4f90: 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20  b->zName) && .  
4fa0: 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74          0==sqlit
4fb0: 65 33 53 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a  e3StrICmp(pDb->z
4fc0: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  Name, zName) ){.
4fd0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4fe0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
4ff0: 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a  .  return i;.}..
5000: 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20  /*.** The token 
5010: 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20  *pName contains 
5020: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61  the name of a da
5030: 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20 22  tabase (either "
5040: 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d  main" or.** "tem
5050: 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f  p" or the name o
5060: 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62  f an attached db
5070: 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ). This routine 
5080: 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69  returns the.** i
5090: 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65  ndex of the name
50a0: 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62  d database in db
50b0: 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69  ->aDb[], or -1 i
50c0: 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a  f the named db .
50d0: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  ** does not exis
50e0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
50f0: 33 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20  3FindDb(sqlite3 
5100: 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  *db, Token *pNam
5110: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5130: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
5140: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f  tabase number */
5150: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  .  char *zName; 
5160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5170: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
5180: 77 65 20 61 72 65 20 73 65 61 72 63 68 69 6e 67  we are searching
5190: 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20   for */.  zName 
51a0: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
51b0: 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65  mToken(db, pName
51c0: 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74 65 33  );.  i = sqlite3
51d0: 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a  FindDbName(db, z
51e0: 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
51f0: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
5200: 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
5210: 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f  ../* The table o
5220: 72 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65  r view or trigge
5230: 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65 64  r name is passed
5240: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
5250: 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70   via tokens.** p
5260: 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32  Name1 and pName2
5270: 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e  . If the table n
5280: 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75  ame was fully qu
5290: 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61  alified, for exa
52a0: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41  mple:.**.** CREA
52b0: 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79  TE TABLE xxx.yyy
52c0: 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54   (...);.** .** T
52d0: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
52e0: 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70  t to "xxx" and p
52f0: 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20  Name2 "yyy". On 
5300: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69  the other hand i
5310: 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e  f.** the table n
5320: 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79  ame is not fully
5330: 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e   qualified, i.e.
5340: 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54  :.**.** CREATE T
5350: 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a  ABLE yyy(...);.*
5360: 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31  *.** Then pName1
5370: 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22   is set to "yyy"
5380: 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22   and pName2 is "
5390: 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  "..**.** This ro
53a0: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 2a  utine sets the *
53b0: 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72  ppUnqual pointer
53c0: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
53d0: 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f   token (pName1 o
53e0: 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61  r.** pName2) tha
53f0: 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71  t stores the unq
5400: 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e  ualified table n
5410: 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78 20  ame.  The index 
5420: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
5430: 73 65 20 22 78 78 78 22 20 69 73 20 72 65 74 75  se "xxx" is retu
5440: 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
5450: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
5460: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
5470: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  ,      /* Parsin
5480: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
5490: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
54a0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
54b0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78  ,      /* The "x
54c0: 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  xx" in the name 
54d0: 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78 78  "xxx.yyy" or "xx
54e0: 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  x" */.  Token *p
54f0: 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54  Name2,      /* T
5500: 68 65 20 22 79 79 79 22 20 69 6e 20 74 68 65 20  he "yyy" in the 
5510: 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 2a  name "xxx.yyy" *
5520: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71  /.  Token **pUnq
5530: 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ual     /* Write
5540: 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64   the unqualified
5550: 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65 72   object name her
5560: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44  e */.){.  int iD
5570: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
5580: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
5590: 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62  e holding the ob
55a0: 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
55b0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
55c0: 64 62 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41 59  db;..  if( ALWAY
55d0: 53 28 70 4e 61 6d 65 32 21 3d 30 29 20 26 26 20  S(pName2!=0) && 
55e0: 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20  pName2->n>0 ){. 
55f0: 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e     if( db->init.
5600: 62 75 73 79 20 29 20 7b 0a 20 20 20 20 20 20 73  busy ) {.      s
5610: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
5620: 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74 20  Parse, "corrupt 
5630: 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20  database");.    
5640: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
5650: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  ;.      return -
5660: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 55  1;.    }.    *pU
5670: 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a  nqual = pName2;.
5680: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
5690: 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d  3FindDb(db, pNam
56a0: 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  e1);.    if( iDb
56b0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  <0 ){.      sqli
56c0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
56d0: 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74  se, "unknown dat
56e0: 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65  abase %T", pName
56f0: 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  1);.      pParse
5700: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
5710: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
5720: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
5730: 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69  sert( db->init.i
5740: 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69  Db==0 || db->ini
5750: 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44  t.busy );.    iD
5760: 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  b = db->init.iDb
5770: 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d  ;.    *pUnqual =
5780: 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72   pName1;.  }.  r
5790: 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a  eturn iDb;.}../*
57a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
57b0: 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65 63   is used to chec
57c0: 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38 20 73  k if the UTF-8 s
57d0: 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61  tring zName is a
57e0: 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c   legal.** unqual
57f0: 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61  ified name for a
5800: 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65   new schema obje
5810: 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78  ct (table, index
5820: 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69  , view or.** tri
5830: 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73  gger). All names
5840: 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70   are legal excep
5850: 74 20 74 68 6f 73 65 20 74 68 61 74 20 62 65 67  t those that beg
5860: 69 6e 20 77 69 74 68 20 74 68 65 20 73 74 72 69  in with the stri
5870: 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20  ng.** "sqlite_" 
5880: 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72  (in upper, lower
5890: 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e   or mixed case).
58a0: 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66   This portion of
58b0: 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a   the namespace.*
58c0: 2a 20 69 73 20 72 65 73 65 72 76 65 64 20 66 6f  * is reserved fo
58d0: 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a  r internal use..
58e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68  */.int sqlite3Ch
58f0: 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61  eckObjectName(Pa
5900: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
5910: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
5920: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
5930: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
5940: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
5950: 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  =0 .          &&
5960: 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c   (pParse->db->fl
5970: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69  ags & SQLITE_Wri
5980: 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20  teSchema)==0.   
5990: 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c         && 0==sql
59a0: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61  ite3StrNICmp(zNa
59b0: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
59c0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
59d0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
59e0: 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65   "object name re
59f0: 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72  served for inter
5a00: 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e  nal use: %s", zN
5a10: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
5a20: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
5a30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
5a40: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
5a50: 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69  Begin constructi
5a60: 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72  ng a new table r
5a70: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e  epresentation in
5a80: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
5a90: 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f  s.** the first o
5aa0: 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e  f several action
5ab0: 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67   routines that g
5ac0: 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73  et called in res
5ad0: 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52  ponse.** to a CR
5ae0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
5af0: 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63  ment.  In partic
5b00: 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69  ular, this routi
5b10: 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  ne is called.** 
5b20: 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b  after seeing tok
5b30: 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64  ens "CREATE" and
5b40: 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65   "TABLE" and the
5b50: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65   table name. The
5b60: 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20   isTemp.** flag 
5b70: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74  is true if the t
5b80: 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73  able should be s
5b90: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75 78  tored in the aux
5ba0: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 0a  iliary database.
5bb0: 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  ** file instead 
5bc0: 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  of in the main d
5bd0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
5be0: 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  his is normally 
5bf0: 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e  the case.** when
5c00: 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22   the "TEMP" or "
5c10: 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f  TEMPORARY" keywo
5c20: 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74  rd occurs in bet
5c30: 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61  ween.** CREATE a
5c40: 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20  nd TABLE..**.** 
5c50: 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65  The new table re
5c60: 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69  cord is initiali
5c70: 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70  zed and put in p
5c80: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
5c90: 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20  ..** As more of 
5ca0: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
5cb0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61   statement is pa
5cc0: 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c  rsed, additional
5cd0: 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69   action.** routi
5ce0: 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  nes will be call
5cf0: 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69  ed to add more i
5d00: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
5d10: 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74  is record..** At
5d20: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
5d30: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
5d40: 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69  tement, the sqli
5d50: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f  te3EndTable() ro
5d60: 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
5d70: 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  ed to complete t
5d80: 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  he construction 
5d90: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
5da0: 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64   record..*/.void
5db0: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
5dc0: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
5dd0: 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72  rse,   /* Parser
5de0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
5df0: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f  ken *pName1,   /
5e00: 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20  * First part of 
5e10: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
5e20: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f  table or view */
5e30: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
5e40: 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61  ,   /* Second pa
5e50: 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f  rt of the name o
5e60: 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  f the table or v
5e70: 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  iew */.  int isT
5e80: 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  emp,      /* Tru
5e90: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 54  e if this is a T
5ea0: 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  EMP table */.  i
5eb0: 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20 20 20  nt isView,      
5ec0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
5ed0: 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 69  is a VIEW */.  i
5ee0: 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20 20  nt isVirtual,   
5ef0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
5f00: 69 73 20 61 20 56 49 52 54 55 41 4c 20 74 61 62  is a VIRTUAL tab
5f10: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72  le */.  int noEr
5f20: 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  r        /* Do n
5f30: 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65 20  othing if table 
5f40: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
5f50: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
5f60: 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  able;.  char *zN
5f70: 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20  ame = 0; /* The 
5f80: 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20  name of the new 
5f90: 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  table */.  sqlit
5fa0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
5fb0: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  >db;.  Vdbe *v;.
5fc0: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
5fd0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
5fe0: 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65 20  umber to create 
5ff0: 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a  the table in */.
6000: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20    Token *pName; 
6010: 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65     /* Unqualifie
6020: 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  d name of the ta
6030: 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f  ble to create */
6040: 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  ..  /* The table
6050: 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f   or view name to
6060: 20 63 72 65 61 74 65 20 69 73 20 70 61 73 73 65   create is passe
6070: 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  d to this routin
6080: 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a  e via tokens.  *
6090: 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61  * pName1 and pNa
60a0: 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c  me2. If the tabl
60b0: 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79  e name was fully
60c0: 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20   qualified, for 
60d0: 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  example:.  **.  
60e0: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
60f0: 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20  xxx.yyy (...);. 
6100: 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70   ** .  ** Then p
6110: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
6120: 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32  "xxx" and pName2
6130: 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f   "yyy". On the o
6140: 74 68 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a  ther hand if.  *
6150: 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  * the table name
6160: 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75   is not fully qu
6170: 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20  alified, i.e.:. 
6180: 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20   **.  ** CREATE 
6190: 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a  TABLE yyy(...);.
61a0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70    **.  ** Then p
61b0: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
61c0: 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32  "yyy" and pName2
61d0: 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a   is ""..  **.  *
61e0: 2a 20 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77  * The call below
61f0: 20 73 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20   sets the pName 
6200: 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74  pointer to point
6210: 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70   at the token (p
6220: 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e  Name1 or.  ** pN
6230: 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65  ame2) that store
6240: 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65  s the unqualifie
6250: 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68  d table name. Th
6260: 65 20 76 61 72 69 61 62 6c 65 20 69 44 62 20 69  e variable iDb i
6270: 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68  s.  ** set to th
6280: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64  e index of the d
6290: 61 74 61 62 61 73 65 20 74 68 61 74 20 74 68 65  atabase that the
62a0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69   table or view i
62b0: 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65  s to be.  ** cre
62c0: 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ated in..  */.  
62d0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
62e0: 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
62f0: 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
6300: 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20   &pName);.  if( 
6310: 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  iDb<0 ) return;.
6320: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
6330: 44 42 20 26 26 20 69 73 54 65 6d 70 20 26 26 20  DB && isTemp && 
6340: 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69  pName2->n>0 && i
6350: 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20  Db!=1 ){.    /* 
6360: 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 74 65  If creating a te
6370: 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61  mp table, the na
6380: 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75  me may not be qu
6390: 61 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 20  alified. Unless 
63a0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
63b0: 62 61 73 65 20 6e 61 6d 65 20 69 73 20 22 74 65  base name is "te
63c0: 6d 70 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f 0a  mp" anyway.  */.
63d0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
63e0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 65 6d  Msg(pParse, "tem
63f0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e 61 6d  porary table nam
6400: 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61 6c  e must be unqual
6410: 69 66 69 65 64 22 29 3b 0a 20 20 20 20 72 65 74  ified");.    ret
6420: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  urn;.  }.  if( !
6430: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
6440: 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31 3b  sTemp ) iDb = 1;
6450: 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d  ..  pParse->sNam
6460: 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b  eToken = *pName;
6470: 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
6480: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
6490: 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  db, pName);.  if
64a0: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
64b0: 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  urn;.  if( SQLIT
64c0: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65  E_OK!=sqlite3Che
64d0: 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61  ckObjectName(pPa
64e0: 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  rse, zName) ){. 
64f0: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
6500: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ble_error;.  }. 
6510: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44   if( db->init.iD
6520: 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20  b==1 ) isTemp = 
6530: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
6540: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
6550: 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 28  TION.  assert( (
6560: 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69 73 54  isTemp & 1)==isT
6570: 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69  emp );.  {.    i
6580: 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 68 61  nt code;.    cha
6590: 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
65a0: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
65b0: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
65c0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
65d0: 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48  LITE_INSERT, SCH
65e0: 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70  EMA_TABLE(isTemp
65f0: 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  ), 0, zDb) ){.  
6600: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
6610: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
6620: 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  }.    if( isView
6630: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f   ){.      if( !O
6640: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73  MIT_TEMPDB && is
6650: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
6660: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
6670: 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a  EATE_TEMP_VIEW;.
6680: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6690: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
66a0: 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a  TE_CREATE_VIEW;.
66b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
66c0: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  e{.      if( !OM
66d0: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54  IT_TEMPDB && isT
66e0: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63  emp ){.        c
66f0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
6700: 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a  ATE_TEMP_TABLE;.
6710: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6720: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
6730: 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b  TE_CREATE_TABLE;
6740: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6750: 20 20 20 69 66 28 20 21 69 73 56 69 72 74 75 61     if( !isVirtua
6760: 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75 74 68  l && sqlite3Auth
6770: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
6780: 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  de, zName, 0, zD
6790: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
67a0: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
67b0: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  or;.    }.  }.#e
67c0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ndif..  /* Make 
67d0: 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61 62  sure the new tab
67e0: 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74  le name does not
67f0: 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e   collide with an
6800: 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69   existing.  ** i
6810: 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61  ndex or table na
6820: 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  me in the same d
6830: 61 74 61 62 61 73 65 2e 20 20 49 73 73 75 65 20  atabase.  Issue 
6840: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
6850: 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73   if.  ** it does
6860: 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20  . The exception 
6870: 69 73 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  is if the statem
6880: 65 6e 74 20 62 65 69 6e 67 20 70 61 72 73 65 64  ent being parsed
6890: 20 77 61 73 20 70 61 73 73 65 64 0a 20 20 2a 2a   was passed.  **
68a0: 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 64   to an sqlite3_d
68b0: 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20 63 61  eclare_vtab() ca
68c0: 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ll. In that case
68d0: 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e   only the column
68e0: 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20   names.  ** and 
68f0: 74 79 70 65 73 20 77 69 6c 6c 20 62 65 20 75 73  types will be us
6900: 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20  ed, so there is 
6910: 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74 20  no need to test 
6920: 66 6f 72 20 6e 61 6d 65 73 70 61 63 65 0a 20 20  for namespace.  
6930: 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20  ** collisions.. 
6940: 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44 45   */.  if( !IN_DE
6950: 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20  CLARE_VTAB ){.  
6960: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
6970: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
6980: 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
6990: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
69a0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
69b0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  {.      goto beg
69c0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
69d0: 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 6c 65      }.    pTable
69e0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
69f0: 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  ble(db, zName, z
6a00: 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  Db);.    if( pTa
6a10: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ble ){.      if(
6a20: 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20   !noErr ){.     
6a30: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
6a40: 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
6a50: 65 20 25 54 20 61 6c 72 65 61 64 79 20 65 78 69  e %T already exi
6a60: 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  sts", pName);.  
6a70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6a80: 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e     assert( !db->
6a90: 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20  init.busy );.   
6aa0: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
6ab0: 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
6ac0: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
6ad0: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65   }.      goto be
6ae0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6af0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
6b00: 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
6b10: 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 21  db, zName, zDb)!
6b20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
6b30: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
6b40: 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  se, "there is al
6b50: 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e  ready an index n
6b60: 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29  amed %s", zName)
6b70: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  ;.      goto beg
6b80: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
6b90: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54 61      }.  }..  pTa
6ba0: 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ble = sqlite3DbM
6bb0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
6bc0: 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20  zeof(Table));.  
6bd0: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b  if( pTable==0 ){
6be0: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
6bf0: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 70  ailed = 1;.    p
6c00: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
6c10: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50  TE_NOMEM;.    pP
6c20: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
6c30: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
6c40: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  le_error;.  }.  
6c50: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20  pTable->zName = 
6c60: 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d  zName;.  pTable-
6c70: 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70  >iPKey = -1;.  p
6c80: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d  Table->pSchema =
6c90: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
6ca0: 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d  chema;.  pTable-
6cb0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61  >nRef = 1;.  pTa
6cc0: 62 6c 65 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 31  ble->nRowEst = 1
6cd0: 30 30 30 30 30 30 3b 0a 20 20 61 73 73 65 72 74  000000;.  assert
6ce0: 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ( pParse->pNewTa
6cf0: 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70 50 61 72  ble==0 );.  pPar
6d00: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
6d10: 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66  pTable;..  /* If
6d20: 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61 67   this is the mag
6d30: 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  ic sqlite_sequen
6d40: 63 65 20 74 61 62 6c 65 20 75 73 65 64 20 62 79  ce table used by
6d50: 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a   autoincrement,.
6d60: 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72 64    ** then record
6d70: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
6d80: 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  is table in the 
6d90: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74  main database st
6da0: 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20  ructure.  ** so 
6db0: 74 68 61 74 20 49 4e 53 45 52 54 20 63 61 6e 20  that INSERT can 
6dc0: 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 65  find the table e
6dd0: 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e  asily..  */.#ifn
6de0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6df0: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
6e00: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65 73  if( !pParse->nes
6e10: 74 65 64 20 26 26 20 73 74 72 63 6d 70 28 7a 4e  ted && strcmp(zN
6e20: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71  ame, "sqlite_seq
6e30: 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20  uence")==0 ){.  
6e40: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6e50: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
6e60: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
6e70: 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68      pTable->pSch
6e80: 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d 20 70  ema->pSeqTab = p
6e90: 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69  Table;.  }.#endi
6ea0: 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  f..  /* Begin ge
6eb0: 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64  nerating the cod
6ec0: 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65  e that will inse
6ed0: 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63  rt the table rec
6ee0: 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68  ord into.  ** th
6ef0: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
6f00: 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20  table.  Note in 
6f10: 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20  particular that 
6f20: 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64  we must go ahead
6f30: 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61  .  ** and alloca
6f40: 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  te the record nu
6f50: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
6f60: 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42  le entry now.  B
6f70: 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50  efore any.  ** P
6f80: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
6f90: 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72  IQUE keywords ar
6fa0: 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65  e parsed.  Those
6fb0: 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63   keywords will c
6fc0: 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65  ause.  ** indice
6fd0: 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  s to be created 
6fe0: 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65  and the table re
6ff0: 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62  cord must come b
7000: 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20  efore the .  ** 
7010: 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c  indices.  Hence,
7020: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
7030: 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
7040: 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74   must be allocat
7050: 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a  ed.  ** now..  *
7060: 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
7070: 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20 73  t.busy && (v = s
7080: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
7090: 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20  arse))!=0 ){.   
70a0: 20 69 6e 74 20 6a 31 3b 0a 20 20 20 20 69 6e 74   int j1;.    int
70b0: 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20   fileFormat;.   
70c0: 20 69 6e 74 20 72 65 67 31 2c 20 72 65 67 32 2c   int reg1, reg2,
70d0: 20 72 65 67 33 3b 0a 20 20 20 20 73 71 6c 69 74   reg3;.    sqlit
70e0: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
70f0: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
7100: 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
7110: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
7120: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
7130: 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20   isVirtual ){.  
7140: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7150: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67  ddOp0(v, OP_VBeg
7160: 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  in);.    }.#endi
7170: 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  f..    /* If the
7180: 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64   file format and
7190: 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65   encoding in the
71a0: 20 64 61 74 61 62 61 73 65 20 68 61 76 65 20 6e   database have n
71b0: 6f 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20  ot been set, .  
71c0: 20 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f    ** set them no
71d0: 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  w..    */.    re
71e0: 67 31 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67  g1 = pParse->reg
71f0: 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65  Rowid = ++pParse
7200: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 32  ->nMem;.    reg2
7210: 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f   = pParse->regRo
7220: 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ot = ++pParse->n
7230: 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d 20  Mem;.    reg3 = 
7240: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
7250: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7260: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 64  ddOp3(v, OP_Read
7270: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65 67  Cookie, iDb, reg
7280: 33 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f  3, BTREE_FILE_FO
7290: 52 4d 41 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  RMAT);.    sqlit
72a0: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
72b0: 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 6a 31 20  v, iDb);.    j1 
72c0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
72d0: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op1(v, OP_If, re
72e0: 67 33 29 3b 0a 20 20 20 20 66 69 6c 65 46 6f 72  g3);.    fileFor
72f0: 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  mat = (db->flags
7300: 20 26 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79   & SQLITE_Legacy
7310: 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a 20 20  FileFmt)!=0 ?.  
7320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7330: 31 20 3a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46  1 : SQLITE_MAX_F
7340: 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20 20 20  ILE_FORMAT;.    
7350: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7360: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
7370: 20 66 69 6c 65 46 6f 72 6d 61 74 2c 20 72 65 67   fileFormat, reg
7380: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
7390: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
73a0: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
73b0: 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41  BTREE_FILE_FORMA
73c0: 54 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71  T, reg3);.    sq
73d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
73e0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 45  v, OP_Integer, E
73f0: 4e 43 28 64 62 29 2c 20 72 65 67 33 29 3b 0a 20  NC(db), reg3);. 
7400: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7410: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f  dOp3(v, OP_SetCo
7420: 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45  okie, iDb, BTREE
7430: 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e 47 2c 20  _TEXT_ENCODING, 
7440: 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74  reg3);.    sqlit
7450: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
7460: 2c 20 6a 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  , j1);..    /* T
7470: 68 69 73 20 6a 75 73 74 20 63 72 65 61 74 65 73  his just creates
7480: 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20   a place-holder 
7490: 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 73 71  record in the sq
74a0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
74b0: 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  e..    ** The re
74c0: 63 6f 72 64 20 63 72 65 61 74 65 64 20 64 6f 65  cord created doe
74d0: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  s not contain an
74e0: 79 74 68 69 6e 67 20 79 65 74 2e 20 20 49 74 20  ything yet.  It 
74f0: 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64  will be replaced
7500: 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 72  .    ** by the r
7510: 65 61 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f 64  eal entry in cod
7520: 65 20 67 65 6e 65 72 61 74 65 64 20 61 74 20 73  e generated at s
7530: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29  qlite3EndTable()
7540: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
7550: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68  The rowid for th
7560: 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6c  e new entry is l
7570: 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  eft in register 
7580: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64  pParse->regRowid
7590: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 6f  ..    ** The roo
75a0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
75b0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 69   the new table i
75c0: 73 20 6c 65 66 74 20 69 6e 20 72 65 67 20 70 50  s left in reg pP
75d0: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20  arse->regRoot.. 
75e0: 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20     ** The rowid 
75f0: 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  and root page nu
7600: 6d 62 65 72 20 76 61 6c 75 65 73 20 61 72 65 20  mber values are 
7610: 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 63 6f  needed by the co
7620: 64 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 73  de that.    ** s
7630: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 20 77  qlite3EndTable w
7640: 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20 20  ill generate..  
7650: 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
7660: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
7670: 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  EW) || !defined(
7680: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
7690: 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 69 66  UALTABLE).    if
76a0: 28 20 69 73 56 69 65 77 20 7c 7c 20 69 73 56 69  ( isView || isVi
76b0: 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73  rtual ){.      s
76c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
76d0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
76e0: 30 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 65  0, reg2);.    }e
76f0: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b  lse.#endif.    {
7700: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7710: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
7720: 72 65 61 74 65 54 61 62 6c 65 2c 20 69 44 62 2c  reateTable, iDb,
7730: 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 0a 20 20   reg2);.    }.  
7740: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73    sqlite3OpenMas
7750: 74 65 72 54 61 62 6c 65 28 70 50 61 72 73 65 2c  terTable(pParse,
7760: 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
7770: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7780: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20  OP_NewRowid, 0, 
7790: 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  reg1);.    sqlit
77a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
77b0: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 33  OP_Null, 0, reg3
77c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
77d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
77e0: 6e 73 65 72 74 2c 20 30 2c 20 72 65 67 33 2c 20  nsert, 0, reg3, 
77f0: 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  reg1);.    sqlit
7800: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
7810: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
7820: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7830: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6c  eAddOp0(v, OP_Cl
7840: 6f 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ose);.  }..  /* 
7850: 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f  Normal (non-erro
7860: 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20  r) return. */.  
7870: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66  return;..  /* If
7880: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
7890: 2c 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20 2a  , we jump here *
78a0: 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  /.begin_table_er
78b0: 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62  ror:.  sqlite3Db
78c0: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
78d0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
78e0: 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 69  .** This macro i
78f0: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72  s used to compar
7900: 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 69 6e  e two strings in
7910: 20 61 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74   a case-insensit
7920: 69 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a 2a 20 49  ive manner..** I
7930: 74 20 69 73 20 73 6c 69 67 68 74 6c 79 20 66 61  t is slightly fa
7940: 73 74 65 72 20 74 68 61 6e 20 63 61 6c 6c 69 6e  ster than callin
7950: 67 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  g sqlite3StrICmp
7960: 28 29 20 64 69 72 65 63 74 6c 79 2c 20 62 75 74  () directly, but
7970: 0a 2a 2a 20 70 72 6f 64 75 63 65 73 20 6c 61 72  .** produces lar
7980: 67 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ger code..**.** 
7990: 57 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 6d 61  WARNING: This ma
79a0: 63 72 6f 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61  cro is not compa
79b0: 74 69 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  tible with the s
79c0: 74 72 63 6d 70 28 29 20 66 61 6d 69 6c 79 2e 20  trcmp() family. 
79d0: 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74 72  It.** returns tr
79e0: 75 65 20 69 66 20 74 68 65 20 74 77 6f 20 73 74  ue if the two st
79f0: 72 69 6e 67 73 20 61 72 65 20 65 71 75 61 6c 2c  rings are equal,
7a00: 20 6f 74 68 65 72 77 69 73 65 20 66 61 6c 73 65   otherwise false
7a10: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 52  ..*/.#define STR
7a20: 49 43 4d 50 28 78 2c 20 79 29 20 28 5c 0a 73 71  ICMP(x, y) (\.sq
7a30: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
7a40: 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61  r[*(unsigned cha
7a50: 72 20 2a 29 28 78 29 5d 3d 3d 20 20 20 5c 0a 73  r *)(x)]==   \.s
7a60: 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
7a70: 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68  er[*(unsigned ch
7a80: 61 72 20 2a 29 28 79 29 5d 20 20 20 20 20 5c 0a  ar *)(y)]     \.
7a90: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
7aa0: 70 28 28 78 29 2b 31 2c 28 79 29 2b 31 29 3d 3d  p((x)+1,(y)+1)==
7ab0: 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  0 )../*.** Add a
7ac0: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74   new column to t
7ad0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
7ae0: 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
7af0: 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cted..**.** The 
7b00: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
7b10: 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66  s routine once f
7b20: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64  or each column d
7b30: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e  eclaration.** in
7b40: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
7b50: 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69  statement.  sqli
7b60: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20  te3StartTable() 
7b70: 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66  gets called.** f
7b80: 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e  irst to get thin
7b90: 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20  gs going.  Then 
7ba0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
7bb0: 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a  called for each.
7bc0: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f  ** column..*/.vo
7bd0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
7be0: 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  umn(Parse *pPars
7bf0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  e, Token *pName)
7c00: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
7c10: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
7c20: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
7c30: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
7c40: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
7c50: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
7c60: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
7c70: 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 53 51 4c   return;.#if SQL
7c80: 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20  ITE_MAX_COLUMN. 
7c90: 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64   if( p->nCol+1>d
7ca0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
7cb0: 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29  _LIMIT_COLUMN] )
7cc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
7cd0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
7ce0: 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
7cf0: 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65  on %s", p->zName
7d00: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
7d10: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a 20 3d 20   }.#endif.  z = 
7d20: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
7d30: 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
7d40: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
7d50: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
7d60: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
7d70: 7b 0a 20 20 20 20 69 66 28 20 53 54 52 49 43 4d  {.    if( STRICM
7d80: 50 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  P(z, p->aCol[i].
7d90: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
7da0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
7db0: 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61  pParse, "duplica
7dc0: 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20  te column name: 
7dd0: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73  %s", z);.      s
7de0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7df0: 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   z);.      retur
7e00: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  n;.    }.  }.  i
7e10: 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78  f( (p->nCol & 0x
7e20: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c  7)==0 ){.    Col
7e30: 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61  umn *aNew;.    a
7e40: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
7e50: 65 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f  ealloc(db,p->aCo
7e60: 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69  l,(p->nCol+8)*si
7e70: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
7e80: 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d  );.    if( aNew=
7e90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
7ea0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
7eb0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
7ec0: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f      }.    p->aCo
7ed0: 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20  l = aNew;.  }.  
7ee0: 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b  pCol = &p->aCol[
7ef0: 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73  p->nCol];.  mems
7f00: 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65  et(pCol, 0, size
7f10: 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b  of(p->aCol[0]));
7f20: 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d  .  pCol->zName =
7f30: 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68   z;. .  /* If th
7f40: 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20 73  ere is no type s
7f50: 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e  pecified, column
7f60: 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61 75  s have the defau
7f70: 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a  lt affinity.  **
7f80: 20 27 4e 4f 4e 45 27 2e 20 49 66 20 74 68 65 72   'NONE'. If ther
7f90: 65 20 69 73 20 61 20 74 79 70 65 20 73 70 65 63  e is a type spec
7fa0: 69 66 69 65 64 2c 20 74 68 65 6e 20 73 71 6c 69  ified, then sqli
7fb0: 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  te3AddColumnType
7fc0: 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  () will.  ** be 
7fd0: 63 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20 73  called next to s
7fe0: 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  et pCol->affinit
7ff0: 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a  y correctly..  *
8000: 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  /.  pCol->affini
8010: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
8020: 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b  NONE;.  p->nCol+
8030: 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  +;.}../*.** This
8040: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
8050: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
8060: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
8070: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
8080: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
8090: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20  E statement.  A 
80a0: 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74  "NOT NULL" const
80b0: 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65  raint has.** bee
80c0: 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75  n seen on a colu
80d0: 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  mn.  This routin
80e0: 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75  e sets the notNu
80f0: 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68  ll flag on.** th
8100: 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  e column current
8110: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
8120: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
8130: 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c  qlite3AddNotNull
8140: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8150: 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20  int onError){.  
8160: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 70 20 3d 20  Table *p;.  p = 
8170: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
8180: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  e;.  if( p==0 ||
8190: 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31   NEVER(p->nCol<1
81a0: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d  ) ) return;.  p-
81b0: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d  >aCol[p->nCol-1]
81c0: 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f  .notNull = (u8)o
81d0: 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nError;.}../*.**
81e0: 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e   Scan the column
81f0: 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65   type name zType
8200: 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20   (length nType) 
8210: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a  and return the.*
8220: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66 66  * associated aff
8230: 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a  inity type..**.*
8240: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
8250: 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65 70  oes a case-indep
8260: 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f 66  endent search of
8270: 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 0a   zType for the .
8280: 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e  ** substrings in
8290: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
82a0: 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20  able. If one of 
82b0: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69  the substrings i
82c0: 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20  s.** found, the 
82d0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 66  corresponding af
82e0: 66 69 6e 69 74 79 20 69 73 20 72 65 74 75 72 6e  finity is return
82f0: 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f 6e  ed. If zType con
8300: 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68  tains.** more th
8310: 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  an one of the su
8320: 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69 65  bstrings, entrie
8330: 73 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f 70  s toward the top
8340: 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c   of .** the tabl
8350: 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79 2e  e take priority.
8360: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
8370: 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42 49   zType is 'BLOBI
8380: 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  NT', .** SQLITE_
8390: 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20 72  AFF_INTEGER is r
83a0: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  eturned..**.** S
83b0: 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20 41  ubstring     | A
83c0: 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d  ffinity.** -----
83d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
83e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27  -----------.** '
83f0: 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20 53  INT'         | S
8400: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
8410: 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20 20  R.** 'CHAR'     
8420: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
8430: 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20  TEXT.** 'CLOB'  
8440: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
8450: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58 54  FF_TEXT.** 'TEXT
8460: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
8470: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42  E_AFF_TEXT.** 'B
8480: 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOB'        | SQ
8490: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a 2a  LITE_AFF_NONE.**
84a0: 20 27 52 45 41 4c 27 20 20 20 20 20 20 20 20 7c   'REAL'        |
84b0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
84c0: 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20 20  .** 'FLOA'      
84d0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52    | SQLITE_AFF_R
84e0: 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20  EAL.** 'DOUB'   
84f0: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
8500: 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20  F_REAL.**.** If 
8510: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73  none of the subs
8520: 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61 62  trings in the ab
8530: 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20 66 6f  ove table are fo
8540: 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  und,.** SQLITE_A
8550: 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72 65  FF_NUMERIC is re
8560: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20  turned..*/.char 
8570: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
8580: 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ype(const char *
8590: 7a 49 6e 29 7b 0a 20 20 75 33 32 20 68 20 3d 20  zIn){.  u32 h = 
85a0: 30 3b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20  0;.  char aff = 
85b0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
85c0: 49 43 3b 0a 0a 20 20 69 66 28 20 7a 49 6e 20 29  IC;..  if( zIn )
85d0: 20 77 68 69 6c 65 28 20 7a 49 6e 5b 30 5d 20 29   while( zIn[0] )
85e0: 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c 38 29  {.    h = (h<<8)
85f0: 20 2b 20 73 71 6c 69 74 65 33 55 70 70 65 72 54   + sqlite3UpperT
8600: 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e 29 26 30 78  oLower[(*zIn)&0x
8610: 66 66 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a  ff];.    zIn++;.
8620: 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27      if( h==(('c'
8630: 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b  <<24)+('h'<<16)+
8640: 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b  ('a'<<8)+'r') ){
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8660: 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66  CHAR */.      af
8670: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
8680: 45 58 54 3b 20 0a 20 20 20 20 7d 65 6c 73 65 20  EXT; .    }else 
8690: 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34  if( h==(('c'<<24
86a0: 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27  )+('l'<<16)+('o'
86b0: 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20  <<8)+'b') ){    
86c0: 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20     /* CLOB */.  
86d0: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
86e0: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d  _AFF_TEXT;.    }
86f0: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74  else if( h==(('t
8700: 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29  '<<24)+('e'<<16)
8710: 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29  +('x'<<8)+'t') )
8720: 7b 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20  {       /* TEXT 
8730: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
8740: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
8750: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
8760: 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('b'<<24)+('l'
8770: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
8780: 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b')          /* 
8790: 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20  BLOB */.        
87a0: 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f  && (aff==SQLITE_
87b0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61  AFF_NUMERIC || a
87c0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ff==SQLITE_AFF_R
87d0: 45 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 61 66  EAL) ){.      af
87e0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  f = SQLITE_AFF_N
87f0: 4f 4e 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ONE;.#ifndef SQL
8800: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
8810: 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73  G_POINT.    }els
8820: 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c  e if( h==(('r'<<
8830: 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27  24)+('e'<<16)+('
8840: 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20 20  a'<<8)+'l')     
8850: 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a       /* REAL */.
8860: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
8870: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
8880: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
8890: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
88a0: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  L;.    }else if(
88b0: 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28   h==(('f'<<24)+(
88c0: 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38  'l'<<16)+('o'<<8
88d0: 29 2b 27 61 27 29 20 20 20 20 20 20 20 20 20 20  )+'a')          
88e0: 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20  /* FLOA */.     
88f0: 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54     && aff==SQLIT
8900: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b  E_AFF_NUMERIC ){
8910: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
8920: 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20  ITE_AFF_REAL;.  
8930: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
8940: 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c  ('d'<<24)+('o'<<
8950: 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27  16)+('u'<<8)+'b'
8960: 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 4f  )          /* DO
8970: 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26  UB */.        &&
8980: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
8990: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
89a0: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
89b0: 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a  FF_REAL;.#endif.
89c0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 68      }else if( (h
89d0: 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28 28  &0x00FFFFFF)==((
89e0: 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38  'i'<<16)+('n'<<8
89f0: 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a 20  )+'t') ){    /* 
8a00: 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  INT */.      aff
8a10: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   = SQLITE_AFF_IN
8a20: 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65  TEGER;.      bre
8a30: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
8a40: 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a   return aff;.}..
8a50: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
8a60: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
8a70: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
8a80: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
8a90: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
8aa0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
8ab0: 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72  ement.  The pFir
8ac0: 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20  st token is the 
8ad0: 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69  first.** token i
8ae0: 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f  n the sequence o
8af0: 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65  f tokens that de
8b00: 73 63 72 69 62 65 20 74 68 65 20 74 79 70 65 20  scribe the type 
8b10: 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e  of the.** column
8b20: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
8b30: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
8b40: 20 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61   pLast is the la
8b50: 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74  st token.** in t
8b60: 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73  he sequence.  Us
8b70: 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  e this informati
8b80: 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  on to construct 
8b90: 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74  a string.** that
8ba0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79   contains the ty
8bb0: 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  pename of the co
8bc0: 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74  lumn and store t
8bd0: 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e  hat string.** in
8be0: 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64   zType..*/ .void
8bf0: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
8c00: 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  nType(Parse *pPa
8c10: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70  rse, Token *pTyp
8c20: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
8c30: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
8c40: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
8c50: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
8c60: 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d  p==0 || NEVER(p-
8c70: 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74 75 72  >nCol<1) ) retur
8c80: 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e  n;.  pCol = &p->
8c90: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 3b  aCol[p->nCol-1];
8ca0: 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d  .  assert( pCol-
8cb0: 3e 7a 54 79 70 65 3d 3d 30 20 29 3b 0a 20 20 70  >zType==0 );.  p
8cc0: 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c  Col->zType = sql
8cd0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
8ce0: 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  n(pParse->db, pT
8cf0: 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66  ype);.  pCol->af
8d00: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
8d10: 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 43 6f  AffinityType(pCo
8d20: 6c 2d 3e 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a  l->zType);.}../*
8d30: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
8d40: 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  on is the defaul
8d50: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
8d60: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
8d70: 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66  ded column.** of
8d80: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
8d90: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
8da0: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44  ruction..**.** D
8db0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70  efault value exp
8dc0: 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65  ressions must be
8dd0: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73   constant.  Rais
8de0: 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69  e an exception i
8df0: 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74  f this.** is not
8e00: 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a   the case..**.**
8e10: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
8e20: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
8e30: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
8e40: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
8e50: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
8e60: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
8e70: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8e80: 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65  3AddDefaultValue
8e90: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8ea0: 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e 29  ExprSpan *pSpan)
8eb0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
8ec0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
8ed0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
8ee0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20  arse->db;.  p = 
8ef0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
8f00: 65 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29 7b  e;.  if( p!=0 ){
8f10: 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d  .    pCol = &(p-
8f20: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d  >aCol[p->nCol-1]
8f30: 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  );.    if( !sqli
8f40: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
8f50: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 53 70 61  tOrFunction(pSpa
8f60: 6e 2d 3e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  n->pExpr) ){.   
8f70: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8f80: 73 67 28 70 50 61 72 73 65 2c 20 22 64 65 66 61  sg(pParse, "defa
8f90: 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c  ult value of col
8fa0: 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20  umn [%s] is not 
8fb0: 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20  constant",.     
8fc0: 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65       pCol->zName
8fd0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
8fe0: 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66      /* A copy of
8ff0: 20 70 45 78 70 72 20 69 73 20 75 73 65 64 20 69   pExpr is used i
9000: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 6f 72  nstead of the or
9010: 69 67 69 6e 61 6c 2c 20 61 73 20 70 45 78 70 72  iginal, as pExpr
9020: 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
9030: 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 70  ** tokens that p
9040: 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 74 69 6c 65  oint to volatile
9050: 20 6d 65 6d 6f 72 79 2e 20 54 68 65 20 27 73 70   memory. The 'sp
9060: 61 6e 27 20 6f 66 20 74 68 65 20 65 78 70 72 65  an' of the expre
9070: 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69  ssion.      ** i
9080: 73 20 72 65 71 75 69 72 65 64 20 62 79 20 70 72  s required by pr
9090: 61 67 6d 61 20 74 61 62 6c 65 5f 69 6e 66 6f 2e  agma table_info.
90a0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
90b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
90c0: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c  e(db, pCol->pDfl
90d0: 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e  t);.      pCol->
90e0: 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 45  pDflt = sqlite3E
90f0: 78 70 72 44 75 70 28 64 62 2c 20 70 53 70 61 6e  xprDup(db, pSpan
9100: 2d 3e 70 45 78 70 72 2c 20 45 58 50 52 44 55 50  ->pExpr, EXPRDUP
9110: 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20 20  _REDUCE);.      
9120: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
9130: 2c 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a  , pCol->zDflt);.
9140: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 44 66 6c        pCol->zDfl
9150: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  t = sqlite3DbStr
9160: 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29  NDup(db, (char*)
9170: 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20  pSpan->zStart,. 
9180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91a0: 20 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d      (int)(pSpan-
91b0: 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a  >zEnd - pSpan->z
91c0: 53 74 61 72 74 29 29 3b 0a 20 20 20 20 7d 0a 20  Start));.    }. 
91d0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
91e0: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 70 61 6e  Delete(db, pSpan
91f0: 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  ->pExpr);.}../*.
9200: 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68 65  ** Designate the
9210: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72   PRIMARY KEY for
9220: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69   the table.  pLi
9230: 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  st is a list of 
9240: 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c  names .** of col
9250: 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74  umns that form t
9260: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  he primary key. 
9270: 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c   If pList is NUL
9280: 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d  L, then the.** m
9290: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
92a0: 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ed column of the
92b0: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70 72   table is the pr
92c0: 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  imary key..**.**
92d0: 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76   A table can hav
92e0: 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72  e at most one pr
92f0: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74  imary key.  If t
9300: 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  he table already
9310: 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72   has.** a primar
9320: 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20  y key (and this 
9330: 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72  is the second pr
9340: 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20  imary key) then 
9350: 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72  create an.** err
9360: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  or..**.** If the
9370: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20   PRIMARY KEY is 
9380: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  on a single colu
9390: 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79 70  mn whose datatyp
93a0: 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a  e is INTEGER,.**
93b0: 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72   then we will tr
93c0: 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f  y to use that co
93d0: 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 69  lumn as the rowi
93e0: 64 2e 20 20 53 65 74 20 74 68 65 20 54 61 62 6c  d.  Set the Tabl
93f0: 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64  e.iPKey.** field
9400: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e   of the table un
9410: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
9420: 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78   to be the index
9430: 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47   of the.** INTEG
9440: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ER PRIMARY KEY c
9450: 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50  olumn.  Table.iP
9460: 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31  Key is set to -1
9470: 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   if there is.** 
9480: 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  no INTEGER PRIMA
9490: 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66  RY KEY..**.** If
94a0: 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20   the key is not 
94b0: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
94c0: 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65  RY KEY, then cre
94d0: 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20  ate a unique.** 
94e0: 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65  index for the ke
94f0: 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20  y.  No index is 
9500: 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45  created for INTE
9510: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73  GER PRIMARY KEYs
9520: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9530: 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 0a  3AddPrimaryKey(.
9540: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
9550: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
9560: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
9570: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a  List *pList,  /*
9580: 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20 6e   List of field n
9590: 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65 78  ames to be index
95a0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  ed */.  int onEr
95b0: 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68 61  ror,      /* Wha
95c0: 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20 75  t to do with a u
95d0: 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69  niqueness confli
95e0: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f  ct */.  int auto
95f0: 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  Inc,      /* Tru
9600: 65 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e 43  e if the AUTOINC
9610: 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20 69  REMENT keyword i
9620: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
9630: 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20 20  nt sortOrder    
9640: 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53   /* SQLITE_SO_AS
9650: 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f 44  C or SQLITE_SO_D
9660: 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ESC */.){.  Tabl
9670: 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65  e *pTab = pParse
9680: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63  ->pNewTable;.  c
9690: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  har *zType = 0;.
96a0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c    int iCol = -1,
96b0: 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   i;.  if( pTab==
96c0: 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f  0 || IN_DECLARE_
96d0: 56 54 41 42 20 29 20 67 6f 74 6f 20 70 72 69 6d  VTAB ) goto prim
96e0: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20  ary_key_exit;.  
96f0: 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61  if( pTab->tabFla
9700: 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61  gs & TF_HasPrima
9710: 72 79 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c  ryKey ){.    sql
9720: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
9730: 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61 62  rse, .      "tab
9740: 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f  le \"%s\" has mo
9750: 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d  re than one prim
9760: 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e  ary key", pTab->
9770: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
9780: 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69   primary_key_exi
9790: 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 74  t;.  }.  pTab->t
97a0: 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61  abFlags |= TF_Ha
97b0: 73 50 72 69 6d 61 72 79 4b 65 79 3b 0a 20 20 69  sPrimaryKey;.  i
97c0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
97d0: 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     iCol = pTab->
97e0: 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54  nCol - 1;.    pT
97f0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69  ab->aCol[iCol].i
9800: 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20  sPrimKey = 1;.  
9810: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
9820: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
9830: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
9840: 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c  for(iCol=0; iCol
9850: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f  <pTab->nCol; iCo
9860: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  l++){.        if
9870: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
9880: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
9890: 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  me, pTab->aCol[i
98a0: 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  Col].zName)==0 )
98b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  {.          brea
98c0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
98d0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
98e0: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  Col<pTab->nCol )
98f0: 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  {.        pTab->
9900: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69  aCol[iCol].isPri
9910: 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  mKey = 1;.      
9920: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
9930: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29  pList->nExpr>1 )
9940: 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a   iCol = -1;.  }.
9950: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26    if( iCol>=0 &&
9960: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
9970: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
9980: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
9990: 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66  .zType;.  }.  if
99a0: 28 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69 74  ( zType && sqlit
99b0: 65 33 53 74 72 49 43 6d 70 28 7a 54 79 70 65 2c  e3StrICmp(zType,
99c0: 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20   "INTEGER")==0. 
99d0: 20 20 20 20 20 20 20 26 26 20 73 6f 72 74 4f 72         && sortOr
99e0: 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41  der==SQLITE_SO_A
99f0: 53 43 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  SC ){.    pTab->
9a00: 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20  iPKey = iCol;.  
9a10: 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20    pTab->keyConf 
9a20: 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20  = (u8)onError;. 
9a30: 20 20 20 61 73 73 65 72 74 28 20 61 75 74 6f 49     assert( autoI
9a40: 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63  nc==0 || autoInc
9a50: 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 61 62 2d  ==1 );.    pTab-
9a60: 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 61 75 74  >tabFlags |= aut
9a70: 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72  oInc*TF_Autoincr
9a80: 65 6d 65 6e 74 3b 0a 20 20 7d 65 6c 73 65 20 69  ement;.  }else i
9a90: 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69  f( autoInc ){.#i
9aa0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9ab0: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
9ac0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
9ad0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41 55 54  Msg(pParse, "AUT
9ae0: 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e  OINCREMENT is on
9af0: 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e  ly allowed on an
9b00: 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45 47   ".       "INTEG
9b10: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 29  ER PRIMARY KEY")
9b20: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
9b30: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a  {.    Index *p;.
9b40: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 43      p = sqlite3C
9b50: 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73  reateIndex(pPars
9b60: 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73  e, 0, 0, 0, pLis
9b70: 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30  t, onError, 0, 0
9b80: 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20 30 29 3b  , sortOrder, 0);
9b90: 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
9ba0: 20 20 20 20 70 2d 3e 61 75 74 6f 49 6e 64 65 78      p->autoIndex
9bb0: 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 2;.    }.    
9bc0: 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pList = 0;.  }..
9bd0: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
9be0: 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  :.  sqlite3ExprL
9bf0: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
9c00: 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  ->db, pList);.  
9c10: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
9c20: 20 41 64 64 20 61 20 6e 65 77 20 43 48 45 43 4b   Add a new CHECK
9c30: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 74   constraint to t
9c40: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
9c50: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
9c60: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
9c70: 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f  qlite3AddCheckCo
9c80: 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
9c90: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
9ca0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
9cb0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 68 65   */.  Expr *pChe
9cc0: 63 6b 45 78 70 72 20 20 2f 2a 20 54 68 65 20 63  ckExpr  /* The c
9cd0: 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 20  heck expression 
9ce0: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
9cf0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
9d00: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
9d10: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
9d20: 65 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26 26  e;.  if( pTab &&
9d30: 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41   !IN_DECLARE_VTA
9d40: 42 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 70  B ){.    pTab->p
9d50: 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  Check = sqlite3E
9d60: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
9d70: 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65  arse, pTab->pChe
9d80: 63 6b 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b  ck, pCheckExpr);
9d90: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
9da0: 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e  >constraintName.
9db0: 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  n ){.      sqlit
9dc0: 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d  e3ExprListSetNam
9dd0: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  e(pParse, pTab->
9de0: 70 43 68 65 63 6b 2c 20 26 70 50 61 72 73 65 2d  pCheck, &pParse-
9df0: 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2c  >constraintName,
9e00: 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   1);.    }.  }el
9e10: 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
9e20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
9e30: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
9e40: 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 7d  pCheckExpr);.  }
9e50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
9e60: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  e collation func
9e70: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
9e80: 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64   recently parsed
9e90: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a   table column.**
9ea0: 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20   to the CollSeq 
9eb0: 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  given..*/.void s
9ec0: 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65  qlite3AddCollate
9ed0: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
9ee0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  se, Token *pToke
9ef0: 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  n){.  Table *p;.
9f00: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
9f10: 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *zColl;         
9f20: 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65 64       /* Dequoted
9f30: 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69   name of collati
9f40: 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20  on sequence */. 
9f50: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
9f60: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
9f70: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
9f80: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
9f90: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62 20  p->nCol-1;.  db 
9fa0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
9fb0: 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e  zColl = sqlite3N
9fc0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
9fd0: 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20   pToken);.  if( 
9fe0: 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b  !zColl ) return;
9ff0: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c  ..  if( sqlite3L
a000: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
a010: 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20  rse, zColl) ){. 
a020: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
a030: 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a      p->aCol[i].z
a040: 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20  Coll = zColl;.  
a050: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
a060: 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65  olumn is declare
a070: 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49  d as "<name> PRI
a080: 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45  MARY KEY COLLATE
a090: 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a   <type>",.    **
a0a0: 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d   then an index m
a0b0: 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72 65  ay have been cre
a0c0: 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c  ated on this col
a0d0: 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20  umn before the. 
a0e0: 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20     ** collation 
a0f0: 74 79 70 65 20 77 61 73 20 61 64 64 65 64 2e 20  type was added. 
a100: 43 6f 72 72 65 63 74 20 74 68 69 73 20 69 66 20  Correct this if 
a110: 69 74 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  it is the case..
a120: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
a130: 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70  Idx=p->pIndex; p
a140: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
a150: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
a160: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
a170: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
a180: 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
a190: 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20  mn[0]==i ){.    
a1a0: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
a1b0: 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d  [0] = p->aCol[i]
a1c0: 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  .zColl;.      }.
a1d0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
a1e0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
a1f0: 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, zColl);.  }
a200: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
a210: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
a220: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
a230: 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62  quence for datab
a240: 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a  ase native text.
a250: 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e  ** encoding iden
a260: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73 74  tified by the st
a270: 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67  ring zName, leng
a280: 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  th nName..**.** 
a290: 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
a2a0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
a2b0: 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  nce is not avail
a2c0: 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61  able, or not ava
a2d0: 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65  ilable.** in the
a2e0: 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65   database native
a2f0: 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63   encoding, the c
a300: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
a310: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a   is invoked to.*
a320: 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49 66  * request it. If
a330: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
a340: 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20  actory does not 
a350: 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73 65  supply such a se
a360: 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74  quence,.** and t
a370: 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20 61  he sequence is a
a380: 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74  vailable in anot
a390: 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  her text encodin
a3a0: 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a  g, then that is.
a3b0: 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  ** returned inst
a3c0: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ead..**.** If no
a3d0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
a3e0: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
a3f0: 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61  tions sequence a
a400: 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72  re available, or
a410: 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f  .** another erro
a420: 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
a430: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61  s returned and a
a440: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
a450: 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
a460: 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  pParse..**.** Th
a470: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
a480: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
a490: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
a4a0: 71 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69  q().  This routi
a4b0: 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68  ne.** invokes th
a4c0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
a4d0: 6f 72 79 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ory if the named
a4e0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f   collation canno
a4f0: 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e  t be found.** an
a500: 64 20 67 65 6e 65 72 61 74 65 73 20 61 6e 20 65  d generates an e
a510: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2a  rror message..**
a520: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71  .** See also: sq
a530: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
a540: 28 29 2c 20 73 71 6c 69 74 65 33 47 65 74 43 6f  (), sqlite3GetCo
a550: 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53  llSeq().*/.CollS
a560: 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74  eq *sqlite3Locat
a570: 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  eCollSeq(Parse *
a580: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
a590: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71  ar *zName){.  sq
a5a0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
a5b0: 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63  se->db;.  u8 enc
a5c0: 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75 38   = ENC(db);.  u8
a5d0: 20 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d 3e   initbusy = db->
a5e0: 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c  init.busy;.  Col
a5f0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20  lSeq *pColl;..  
a600: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
a610: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65  indCollSeq(db, e
a620: 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69 6e 69 74 62  nc, zName, initb
a630: 75 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69  usy);.  if( !ini
a640: 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c  tbusy && (!pColl
a650: 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70   || !pColl->xCmp
a660: 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  ) ){.    pColl =
a670: 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53   sqlite3GetCollS
a680: 65 71 28 64 62 2c 20 65 6e 63 2c 20 70 43 6f 6c  eq(db, enc, pCol
a690: 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  l, zName);.    i
a6a0: 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
a6b0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
a6c0: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
a6d0: 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  uch collation se
a6e0: 71 75 65 6e 63 65 3a 20 25 73 22 2c 20 7a 4e 61  quence: %s", zNa
a6f0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  me);.    }.  }..
a700: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
a710: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
a720: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
a730: 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  l increment the 
a740: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a  schema cookie..*
a750: 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20  *.** The schema 
a760: 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74  cookie is used t
a770: 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e  o determine when
a780: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
a790: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
a7a0: 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20  changes.  After 
a7b0: 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e  each schema chan
a7c0: 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76  ge, the cookie v
a7d0: 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e  alue.** changes.
a7e0: 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73    When a process
a7f0: 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68 65   first reads the
a800: 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72   schema it recor
a810: 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65  ds the.** cookie
a820: 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20 77  .  Thereafter, w
a830: 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20  henever it goes 
a840: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
a850: 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68  tabase,.** it ch
a860: 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20  ecks the cookie 
a870: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
a880: 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20   schema has not 
a890: 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65  changed.** since
a8a0: 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65 61   it was last rea
a8b0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c  d..**.** This pl
a8c0: 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65  an is not comple
a8d0: 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f  tely bullet-proo
a8e0: 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62  f.  It is possib
a8f0: 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63  le for.** the sc
a900: 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d  hema to change m
a910: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e  ultiple times an
a920: 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65  d for the cookie
a930: 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61   to be.** set ba
a940: 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75  ck to prior valu
a950: 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20 63  e.  But schema c
a960: 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65  hanges are infre
a970: 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65  quent.** and the
a980: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
a990: 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65  hitting the same
a9a0: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73   cookie value is
a9b0: 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63   only.** 1 chanc
a9c0: 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77  e in 2^32.  So w
a9d0: 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68  e're safe enough
a9e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a9f0: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61  3ChangeCookie(Pa
aa00: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
aa10: 20 69 44 62 29 7b 0a 20 20 69 6e 74 20 72 31 20   iDb){.  int r1 
aa20: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
aa30: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
aa40: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
aa50: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
aa60: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
aa70: 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  be;.  assert( sq
aa80: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
aa90: 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
aaa0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
aab0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
aac0: 74 65 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b 69  teger, db->aDb[i
aad0: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68  Db].pSchema->sch
aae0: 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 72 31  ema_cookie+1, r1
aaf0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
ab00: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74  AddOp3(v, OP_Set
ab10: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52  Cookie, iDb, BTR
ab20: 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f  EE_SCHEMA_VERSIO
ab30: 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  N, r1);.  sqlite
ab40: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
ab50: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a  pParse, r1);.}..
ab60: 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68  /*.** Measure th
ab70: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
ab80: 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f  acters needed to
ab90: 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   output the give
aba0: 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e  n.** identifier.
abb0: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74    The number ret
abc0: 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61  urned includes a
abd0: 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a  ny quotes used.*
abe0: 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69  * but does not i
abf0: 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20  nclude the null 
ac00: 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a  terminator..**.*
ac10: 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 20 69  * The estimate i
ac20: 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20  s conservative. 
ac30: 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72   It might be lar
ac40: 67 65 72 20 74 68 61 74 20 77 68 61 74 20 69 73  ger that what is
ac50: 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65  .** really neede
ac60: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
ac70: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e   identLength(con
ac80: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
ac90: 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b  nt n;.  for(n=0;
aca0: 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a   *z; n++, z++){.
acb0: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20      if( *z=='"' 
acc0: 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20  ){ n++; }.  }.  
acd0: 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a  return n + 2;.}.
ace0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ./*.** The first
acf0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
ad00: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75  pointer to an ou
ad10: 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 65  tput buffer. The
ad20: 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61   second .** para
ad30: 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
ad40: 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  er to an integer
ad50: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
ad60: 68 65 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20  he offset at.** 
ad70: 77 68 69 63 68 20 74 6f 20 77 72 69 74 65 20 69  which to write i
ad80: 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62  nto the output b
ad90: 75 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63  uffer. This func
ada0: 74 69 6f 6e 20 63 6f 70 69 65 73 20 74 68 65 0a  tion copies the.
adb0: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  ** nul-terminate
adc0: 64 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64  d string pointed
add0: 20 74 6f 20 62 79 20 74 68 65 20 74 68 69 72 64   to by the third
ade0: 20 70 61 72 61 6d 65 74 65 72 2c 20 7a 53 69 67   parameter, zSig
adf0: 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20  nedIdent,.** to 
ae00: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 66  the specified of
ae10: 66 73 65 74 20 69 6e 20 74 68 65 20 62 75 66 66  fset in the buff
ae20: 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 2a  er and updates *
ae30: 70 49 64 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a  pIdx to refer.**
ae40: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
ae50: 74 65 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  te after the las
ae60: 74 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 62  t byte written b
ae70: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
ae80: 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 73  .** .** If the s
ae90: 74 72 69 6e 67 20 7a 53 69 67 6e 65 64 49 64 65  tring zSignedIde
aea0: 6e 74 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69  nt consists enti
aeb0: 72 65 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75  rely of alpha-nu
aec0: 6d 65 72 69 63 0a 2a 2a 20 63 68 61 72 61 63 74  meric.** charact
aed0: 65 72 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65  ers, does not be
aee0: 67 69 6e 20 77 69 74 68 20 61 20 64 69 67 69 74  gin with a digit
aef0: 20 61 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20 53   and is not an S
af00: 51 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74  QL keyword,.** t
af10: 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64  hen it is copied
af20: 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62   to the output b
af30: 75 66 66 65 72 20 65 78 61 63 74 6c 79 20 61 73  uffer exactly as
af40: 20 69 74 20 69 73 2e 20 4f 74 68 65 72 77 69 73   it is. Otherwis
af50: 65 2c 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f 74  e,.** it is quot
af60: 65 64 20 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d  ed using double-
af70: 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  quotes..*/.stati
af80: 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28  c void identPut(
af90: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49  char *z, int *pI
afa0: 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65  dx, char *zSigne
afb0: 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67  dIdent){.  unsig
afc0: 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74  ned char *zIdent
afd0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
afe0: 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b  r*)zSignedIdent;
aff0: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65  .  int i, j, nee
b000: 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70  dQuote;.  i = *p
b010: 49 64 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b  Idx;..  for(j=0;
b020: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
b030: 7b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  {.    if( !sqlit
b040: 65 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74  e3Isalnum(zIdent
b050: 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a  [j]) && zIdent[j
b060: 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a  ]!='_' ) break;.
b070: 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20    }.  needQuote 
b080: 3d 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  = sqlite3Isdigit
b090: 28 7a 49 64 65 6e 74 5b 30 5d 29 20 7c 7c 20 73  (zIdent[0]) || s
b0a0: 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64  qlite3KeywordCod
b0b0: 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b  e(zIdent, j)!=TK
b0c0: 5f 49 44 3b 0a 20 20 69 66 28 20 21 6e 65 65 64  _ID;.  if( !need
b0d0: 51 75 6f 74 65 20 29 7b 0a 20 20 20 20 6e 65 65  Quote ){.    nee
b0e0: 64 51 75 6f 74 65 20 3d 20 7a 49 64 65 6e 74 5b  dQuote = zIdent[
b0f0: 6a 5d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e  j];.  }..  if( n
b100: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b  eedQuote ) z[i++
b110: 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a  ] = '"';.  for(j
b120: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
b130: 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20  ++){.    z[i++] 
b140: 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20  = zIdent[j];.   
b150: 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d   if( zIdent[j]==
b160: 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  '"' ) z[i++] = '
b170: 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65  "';.  }.  if( ne
b180: 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d  edQuote ) z[i++]
b190: 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d   = '"';.  z[i] =
b1a0: 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b   0;.  *pIdx = i;
b1b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
b1c0: 74 65 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  te a CREATE TABL
b1d0: 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72  E statement appr
b1e0: 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20  opriate for the 
b1f0: 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20  given.** table. 
b200: 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20   Memory to hold 
b210: 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  the text of the 
b220: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74  statement is obt
b230: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71  ained.** from sq
b240: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
b250: 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
b260: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
b270: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
b280: 63 20 63 68 61 72 20 2a 63 72 65 61 74 65 54 61  c char *createTa
b290: 62 6c 65 53 74 6d 74 28 73 71 6c 69 74 65 33 20  bleStmt(sqlite3 
b2a0: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a  *db, Table *p){.
b2b0: 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20    int i, k, n;. 
b2c0: 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20   char *zStmt;.  
b2d0: 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65  char *zSep, *zSe
b2e0: 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c  p2, *zEnd;.  Col
b2f0: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d  umn *pCol;.  n =
b300: 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d   0;.  for(pCol =
b310: 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69   p->aCol, i=0; i
b320: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  <p->nCol; i++, p
b330: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d  Col++){.    n +=
b340: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f   identLength(pCo
b350: 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a 20  l->zName) + 5;. 
b360: 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c   }.  n += identL
b370: 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b  ength(p->zName);
b380: 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 20 0a  .  if( n<50 ){ .
b390: 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20      zSep = "";. 
b3a0: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a     zSep2 = ",";.
b3b0: 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a      zEnd = ")";.
b3c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65    }else{.    zSe
b3d0: 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20  p = "\n  ";.    
b3e0: 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b  zSep2 = ",\n  ";
b3f0: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29  .    zEnd = "\n)
b400: 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35  ";.  }.  n += 35
b410: 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20   + 6*p->nCol;.  
b420: 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 44  zStmt = sqlite3D
b430: 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 29  bMallocRaw(0, n)
b440: 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30  ;.  if( zStmt==0
b450: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c   ){.    db->mall
b460: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
b470: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
b480: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
b490: 74 66 28 6e 2c 20 7a 53 74 6d 74 2c 20 22 43 52  tf(n, zStmt, "CR
b4a0: 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20  EATE TABLE ");. 
b4b0: 20 6b 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   k = sqlite3Strl
b4c0: 65 6e 33 30 28 7a 53 74 6d 74 29 3b 0a 20 20 69  en30(zStmt);.  i
b4d0: 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26  dentPut(zStmt, &
b4e0: 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  k, p->zName);.  
b4f0: 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27  zStmt[k++] = '('
b500: 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e  ;.  for(pCol=p->
b510: 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e  aCol, i=0; i<p->
b520: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
b530: 2b 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  +){.    static c
b540: 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73  onst char * cons
b550: 74 20 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a 20  t azType[] = {. 
b560: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
b570: 5f 41 46 46 5f 54 45 58 54 20 20 20 20 2a 2f 20  _AFF_TEXT    */ 
b580: 22 20 54 45 58 54 22 2c 0a 20 20 20 20 20 20 20  " TEXT",.       
b590: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e   /* SQLITE_AFF_N
b5a0: 4f 4e 45 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20  ONE    */ "",.  
b5b0: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
b5c0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 2a 2f 20 22  AFF_NUMERIC */ "
b5d0: 20 4e 55 4d 22 2c 0a 20 20 20 20 20 20 20 20 2f   NUM",.        /
b5e0: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  * SQLITE_AFF_INT
b5f0: 45 47 45 52 20 2a 2f 20 22 20 49 4e 54 22 2c 0a  EGER */ " INT",.
b600: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
b610: 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 2a 2f  E_AFF_REAL    */
b620: 20 22 20 52 45 41 4c 22 0a 20 20 20 20 7d 3b 0a   " REAL".    };.
b630: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
b640: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
b650: 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  pe;..    sqlite3
b660: 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26  _snprintf(n-k, &
b670: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b  zStmt[k], zSep);
b680: 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65  .    k += sqlite
b690: 33 53 74 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74  3Strlen30(&zStmt
b6a0: 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d  [k]);.    zSep =
b6b0: 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e   zSep2;.    iden
b6c0: 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20  tPut(zStmt, &k, 
b6d0: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
b6e0: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
b6f0: 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f  affinity-SQLITE_
b700: 41 46 46 5f 54 45 58 54 20 3e 3d 20 30 20 29 3b  AFF_TEXT >= 0 );
b710: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f  .    assert( pCo
b720: 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49  l->affinity-SQLI
b730: 54 45 5f 41 46 46 5f 54 45 58 54 20 3c 20 41 72  TE_AFF_TEXT < Ar
b740: 72 61 79 53 69 7a 65 28 61 7a 54 79 70 65 29 20  raySize(azType) 
b750: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
b760: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
b770: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
b780: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
b790: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
b7a0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
b7b0: 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  E );.    testcas
b7c0: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
b7d0: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  y==SQLITE_AFF_NU
b7e0: 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 74 65 73  MERIC );.    tes
b7f0: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
b800: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
b810: 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20  F_INTEGER );.   
b820: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
b830: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
b840: 45 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20  E_AFF_REAL );.  
b850: 20 20 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 61    .    zType = a
b860: 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69  zType[pCol->affi
b870: 6e 69 74 79 20 2d 20 53 51 4c 49 54 45 5f 41 46  nity - SQLITE_AF
b880: 46 5f 54 45 58 54 5d 3b 0a 20 20 20 20 6c 65 6e  F_TEXT];.    len
b890: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
b8a0: 33 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 61  30(zType);.    a
b8b0: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66  ssert( pCol->aff
b8c0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
b8d0: 46 5f 4e 4f 4e 45 20 0a 20 20 20 20 20 20 20 20  F_NONE .        
b8e0: 20 20 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66      || pCol->aff
b8f0: 69 6e 69 74 79 3d 3d 73 71 6c 69 74 65 33 41 66  inity==sqlite3Af
b900: 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65  finityType(zType
b910: 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) );.    memcpy(
b920: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65  &zStmt[k], zType
b930: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d  , len);.    k +=
b940: 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74   len;.    assert
b950: 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20  ( k<=n );.  }.  
b960: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
b970: 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c  (n-k, &zStmt[k],
b980: 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20   "%s", zEnd);.  
b990: 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a  return zStmt;.}.
b9a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
b9b0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
b9c0: 20 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61   report the fina
b9d0: 6c 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69  l ")" that termi
b9e0: 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54  nates.** a CREAT
b9f0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
ba00: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62  t..**.** The tab
ba10: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
ba20: 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72  t other action r
ba30: 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65  outines have bee
ba40: 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73  n building.** is
ba50: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
ba60: 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c  ternal hash tabl
ba70: 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20  es, assuming no 
ba80: 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f  errors have.** o
ba90: 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  ccurred..**.** A
baa0: 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
bab0: 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e  table is made in
bac0: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
bad0: 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73  e on disk, unles
bae0: 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74  s.** this is a t
baf0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
bb00: 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  r db->init.busy=
bb10: 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e  =1.  When db->in
bb20: 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74  it.busy==1.** it
bb30: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
bb40: 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  ading the sqlite
bb50: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65  _master table be
bb60: 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a  cause we just.**
bb70: 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68   connected to th
bb80: 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65  e database or be
bb90: 63 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65  cause the sqlite
bba0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61  _master table ha
bbb0: 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68  s.** recently ch
bbc0: 61 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e  anged, so the en
bbd0: 74 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62  try for this tab
bbe0: 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
bbf0: 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69  s in.** the sqli
bc00: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
bc10: 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74    We do not want
bc20: 20 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67   to create it ag
bc30: 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ain..**.** If th
bc40: 65 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65  e pSelect argume
bc50: 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nt is not NULL, 
bc60: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
bc70: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61  is routine.** wa
bc80: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
bc90: 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72  te a table gener
bca0: 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20  ated from a .** 
bcb0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e  "CREATE TABLE ..
bcc0: 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22  . AS SELECT ..."
bcd0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
bce0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66   column names of
bcf0: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c  .** the new tabl
bd00: 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65  e will match the
bd10: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
bd20: 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f  he SELECT..*/.vo
bd30: 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  id sqlite3EndTab
bd40: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
bd50: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
bd60: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
bd70: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73  /.  Token *pCons
bd80: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
bd90: 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74  he ',' token aft
bda0: 65 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  er the last colu
bdb0: 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f  mn defn. */.  To
bdc0: 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20  ken *pEnd,      
bdd0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6e        /* The fin
bde0: 61 6c 20 27 29 27 20 74 6f 6b 65 6e 20 69 6e 20  al ')' token in 
bdf0: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
be00: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
be10: 65 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a  elect         /*
be20: 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22   Select from a "
be30: 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45  CREATE ... AS SE
be40: 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61  LECT" */.){.  Ta
be50: 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  ble *p;.  sqlite
be60: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
be70: 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
be80: 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26    if( (pEnd==0 &
be90: 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c  & pSelect==0) ||
bea0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
beb0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d ){.    return;
bec0: 0a 20 20 7d 0a 20 20 70 20 3d 20 70 50 61 72 73  .  }.  p = pPars
bed0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
bee0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
bef0: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64  n;..  assert( !d
bf00: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
bf10: 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 69  !pSelect );..  i
bf20: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
bf30: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d  maToIndex(db, p-
bf40: 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e  >pSchema);..#ifn
bf50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
bf60: 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c  CHECK.  /* Resol
bf70: 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20  ve names in all 
bf80: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
bf90: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20   expressions..  
bfa0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43 68 65  */.  if( p->pChe
bfb0: 63 6b 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  ck ){.    SrcLis
bfc0: 74 20 73 53 72 63 3b 20 20 20 20 20 20 20 20 20  t sSrc;         
bfd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b            /* Fak
bfe0: 65 20 53 72 63 4c 69 73 74 20 66 6f 72 20 70 50  e SrcList for pP
bff0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
c000: 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
c010: 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20  xt sNC;         
c020: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63         /* Name c
c030: 6f 6e 74 65 78 74 20 66 6f 72 20 70 50 61 72 73  ontext for pPars
c040: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a  e->pNewTable */.
c050: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
c060: 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
c070: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
c080: 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ll CHECK constra
c090: 69 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ints */.    int 
c0a0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
c0b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
c0c0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
c0d0: 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c      memset(&sNC,
c0e0: 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
c0f0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 53  ;.    memset(&sS
c100: 72 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53  rc, 0, sizeof(sS
c110: 72 63 29 29 3b 0a 20 20 20 20 73 53 72 63 2e 6e  rc));.    sSrc.n
c120: 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 73 53 72  Src = 1;.    sSr
c130: 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 70  c.a[0].zName = p
c140: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 53 72  ->zName;.    sSr
c150: 63 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70 3b  c.a[0].pTab = p;
c160: 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 69  .    sSrc.a[0].i
c170: 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 20  Cursor = -1;.   
c180: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
c190: 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53  arse;.    sNC.pS
c1a0: 72 63 4c 69 73 74 20 3d 20 26 73 53 72 63 3b 0a  rcList = &sSrc;.
c1b0: 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20      sNC.ncFlags 
c1c0: 3d 20 4e 43 5f 49 73 43 68 65 63 6b 3b 0a 20 20  = NC_IsCheck;.  
c1d0: 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e 70 43 68    pList = p->pCh
c1e0: 65 63 6b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  eck;.    for(i=0
c1f0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
c200: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
c210: 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  ( sqlite3Resolve
c220: 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20  ExprNames(&sNC, 
c230: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
c240: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  r) ){.        re
c250: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
c260: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
c270: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
c280: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f  E_OMIT_CHECK) */
c290: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  ..  /* If the db
c2a0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31  ->init.busy is 1
c2b0: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
c2c0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c   reading the SQL
c2d0: 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73   off the.  ** "s
c2e0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72  qlite_master" or
c2f0: 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61   "sqlite_temp_ma
c300: 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74  ster" table on t
c310: 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f  he disk..  ** So
c320: 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f   do not write to
c330: 20 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e   the disk again.
c340: 20 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f    Extract the ro
c350: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  ot page number. 
c360: 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c   ** for the tabl
c370: 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69  e from the db->i
c380: 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c  nit.newTnum fiel
c390: 64 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e 75  d.  (The page nu
c3a0: 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  mber.  ** should
c3b0: 20 68 61 76 65 20 62 65 65 6e 20 70 75 74 20 74   have been put t
c3c0: 68 65 72 65 20 62 79 20 74 68 65 20 73 71 6c 69  here by the sqli
c3d0: 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65  teOpenCb routine
c3e0: 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  .).  */.  if( db
c3f0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
c400: 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d     p->tnum = db-
c410: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
c420: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20   }..  /* If not 
c430: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68  initializing, th
c440: 65 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f  en create a reco
c450: 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  rd for the new t
c460: 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65  able.  ** in the
c470: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
c480: 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61  able of the data
c490: 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  base..  **.  ** 
c4a0: 49 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  If this is a TEM
c4b0: 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72  PORARY table, wr
c4c0: 69 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e  ite the entry in
c4d0: 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  to the auxiliary
c4e0: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65  .  ** file inste
c4f0: 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d  ad of into the m
c500: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
c510: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64  e..  */.  if( !d
c520: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
c530: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56      int n;.    V
c540: 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72  dbe *v;.    char
c550: 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22   *zType;    /* "
c560: 76 69 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22  view" or "table"
c570: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54   */.    char *zT
c580: 79 70 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57  ype2;   /* "VIEW
c590: 22 20 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a  " or "TABLE" */.
c5a0: 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b      char *zStmt;
c5b0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74      /* Text of t
c5c0: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
c5d0: 6f 72 20 43 52 45 41 54 45 20 56 49 45 57 20 73  or CREATE VIEW s
c5e0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20  tatement */..   
c5f0: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
c600: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
c610: 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
c620: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20   ) return;..    
c630: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c640: 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  1(v, OP_Close, 0
c650: 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20  );..    /* .    
c660: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54  ** Initialize zT
c670: 79 70 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ype for the new 
c680: 76 69 65 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20  view or table.. 
c690: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
c6a0: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
c6b0: 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61       /* A regula
c6c0: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  r table */.     
c6d0: 20 7a 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22   zType = "table"
c6e0: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d  ;.      zType2 =
c6f0: 20 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65   "TABLE";.#ifnde
c700: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
c710: 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  EW.    }else{.  
c720: 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f      /* A view */
c730: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
c740: 76 69 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79  view";.      zTy
c750: 70 65 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65  pe2 = "VIEW";.#e
c760: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
c770: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
c780: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 20  CREATE TABLE xx 
c790: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65  AS SELECT ..., e
c7a0: 78 65 63 75 74 65 20 74 68 65 20 53 45 4c 45 43  xecute the SELEC
c7b0: 54 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65  T.    ** stateme
c7c0: 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  nt to populate t
c7d0: 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68  he new table. Th
c7e0: 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  e root-page numb
c7f0: 65 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a  er for the.    *
c800: 2a 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 69  * new table is i
c810: 6e 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73  n register pPars
c820: 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20  e->regRoot..    
c830: 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74  **.    ** Once t
c840: 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65  he SELECT has be
c850: 65 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69  en coded by sqli
c860: 74 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20  te3Select(), it 
c870: 69 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73  is in a.    ** s
c880: 75 69 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f  uitable state to
c890: 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 20 63   query for the c
c8a0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20  olumn names and 
c8b0: 74 79 70 65 73 20 74 6f 20 62 65 20 75 73 65 64  types to be used
c8c0: 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e  .    ** by the n
c8d0: 65 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  ew table..    **
c8e0: 0a 20 20 20 20 2a 2a 20 41 20 73 68 61 72 65 64  .    ** A shared
c8f0: 2d 63 61 63 68 65 20 77 72 69 74 65 2d 6c 6f 63  -cache write-loc
c900: 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  k is not require
c910: 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  d to write to th
c920: 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20 20  e new table,.   
c930: 20 2a 2a 20 61 73 20 61 20 73 63 68 65 6d 61 2d   ** as a schema-
c940: 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76 65 20 61  lock must have a
c950: 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 62 74 61  lready been obta
c960: 69 6e 65 64 20 74 6f 20 63 72 65 61 74 65 20 69  ined to create i
c970: 74 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20  t. Since.    ** 
c980: 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78  a schema-lock ex
c990: 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72  cludes all other
c9a0: 20 64 61 74 61 62 61 73 65 20 75 73 65 72 73 2c   database users,
c9b0: 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20   the write-lock 
c9c0: 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20  would.    ** be 
c9d0: 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a  redundant..    *
c9e0: 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  /.    if( pSelec
c9f0: 74 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63  t ){.      Selec
ca00: 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20  tDest dest;.    
ca10: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
ca20: 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
ca30: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29  pParse->nTab==1)
ca40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ca50: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
ca60: 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 70 50  OpenWrite, 1, pP
ca70: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69  arse->regRoot, i
ca80: 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
ca90: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
caa0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 1);.      pPar
cab0: 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20  se->nTab = 2;.  
cac0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
cad0: 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
cae0: 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 29 3b 0a   SRT_Table, 1);.
caf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
cb00: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
cb10: 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  ect, &dest);.   
cb20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cb30: 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
cb40: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
cb50: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
cb60: 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54  ){.        pSelT
cb70: 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
cb80: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
cb90: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a  arse, pSelect);.
cba0: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65 6c          if( pSel
cbb0: 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Tab==0 ) return;
cbc0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
cbd0: 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20   p->aCol==0 );. 
cbe0: 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d         p->nCol =
cbf0: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
cc00: 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20          p->aCol 
cc10: 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
cc20: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
cc30: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
cc40: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
cc50: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  l = 0;.        s
cc60: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
cc70: 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a  e(db, pSelTab);.
cc80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
cc90: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
cca0: 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
ccb0: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 73 74  of the CREATE st
ccc0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
ccd0: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
cce0: 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61      zStmt = crea
ccf0: 74 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20  teTableStmt(db, 
cd00: 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
cd10: 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70       n = (int)(p
cd20: 45 6e 64 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d  End->z - pParse-
cd30: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b  >sNameToken.z) +
cd40: 20 31 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   1;.      zStmt 
cd50: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
cd60: 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  (db, .          
cd70: 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22  "CREATE %s %.*s"
cd80: 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61  , zType2, n, pPa
cd90: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
cda0: 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  z.      );.    }
cdb0: 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20  ..    /* A slot 
cdc0: 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68  for the record h
cdd0: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
cde0: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65  allocated in the
cdf0: 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f   .    ** SQLITE_
ce00: 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57  MASTER table.  W
ce10: 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75  e just need to u
ce20: 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20  pdate that slot 
ce30: 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20  with all.    ** 
ce40: 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
ce50: 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e  we've collected.
ce60: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
ce70: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
ce80: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50  Parse,.      "UP
ce90: 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20  DATE %Q.%s ".   
cea0: 20 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d        "SET type=
ceb0: 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74  '%s', name=%Q, t
cec0: 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74  bl_name=%Q, root
ced0: 70 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51  page=#%d, sql=%Q
cee0: 20 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45   ".       "WHERE
cef0: 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20   rowid=#%d",.   
cf00: 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
cf10: 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
cf20: 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20  BLE(iDb),.      
cf30: 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zType,.      p->
cf40: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zName,.      p->
cf50: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 50 61  zName,.      pPa
cf60: 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20  rse->regRoot,.  
cf70: 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20      zStmt,.     
cf80: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69   pParse->regRowi
cf90: 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  d.    );.    sql
cfa0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
cfb0: 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
cfc0: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
cfd0: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69  Parse, iDb);..#i
cfe0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cff0: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
d000: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
d010: 73 65 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  see if we need t
d020: 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69  o create an sqli
d030: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
d040: 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65  e for.    ** kee
d050: 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75  ping track of au
d060: 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73  toincrement keys
d070: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
d080: 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54   p->tabFlags & T
d090: 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  F_Autoincrement 
d0a0: 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62  ){.      Db *pDb
d0b0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
d0c0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d0d0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
d0e0: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
d0f0: 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  0) );.      if( 
d100: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53  pDb->pSchema->pS
d110: 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20  eqTab==0 ){.    
d120: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
d130: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
d140: 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
d150: 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65   TABLE %Q.sqlite
d160: 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73  _sequence(name,s
d170: 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  eq)",.          
d180: 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  pDb->zName.     
d190: 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
d1a0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
d1b0: 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65 72 79  /* Reparse every
d1c0: 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20  thing to update 
d1d0: 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74  our internal dat
d1e0: 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a  a structures */.
d1f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d200: 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28  ddParseSchemaOp(
d210: 76 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20  v, iDb,.        
d220: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
d230: 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e  rintf(db, "tbl_n
d240: 61 6d 65 3d 27 25 71 27 22 2c 20 70 2d 3e 7a 4e  ame='%q'", p->zN
d250: 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  ame));.  }...  /
d260: 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20  * Add the table 
d270: 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  to the in-memory
d280: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
d290: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
d2a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
d2b0: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
d2c0: 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20   Table *pOld;.  
d2d0: 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d    Schema *pSchem
d2e0: 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a  a = p->pSchema;.
d2f0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
d300: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
d310: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
d320: 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c  ;.    pOld = sql
d330: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
d340: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
d350: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  , p->zName,.    
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d370: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d380: 53 74 72 6c 65 6e 33 30 28 70 2d 3e 7a 4e 61 6d  Strlen30(p->zNam
d390: 65 29 2c 70 29 3b 0a 20 20 20 20 69 66 28 20 70  e),p);.    if( p
d3a0: 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Old ){.      ass
d3b0: 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20  ert( p==pOld ); 
d3c0: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
d3d0: 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69  have failed insi
d3e0: 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20  de HashInsert() 
d3f0: 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  */.      db->mal
d400: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
d410: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
d420: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70   }.    pParse->p
d430: 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  NewTable = 0;.  
d440: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
d450: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
d460: 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ges;..#ifndef SQ
d470: 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54  LITE_OMIT_ALTERT
d480: 41 42 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d  ABLE.    if( !p-
d490: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
d4a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
d4b0: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
d4c0: 72 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d  r *)pParse->sNam
d4d0: 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20  eToken.z;.      
d4e0: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20  int nName;.     
d4f0: 20 61 73 73 65 72 74 28 20 21 70 53 65 6c 65 63   assert( !pSelec
d500: 74 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45  t && pCons && pE
d510: 6e 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nd );.      if( 
d520: 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  pCons->z==0 ){. 
d530: 20 20 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70         pCons = p
d540: 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  End;.      }.   
d550: 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29     nName = (int)
d560: 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70  ((const char *)p
d570: 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29  Cons->z - zName)
d580: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f  ;.      p->addCo
d590: 6c 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73  lOffset = 13 + s
d5a0: 71 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c 65  qlite3Utf8CharLe
d5b0: 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  n(zName, nName);
d5c0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
d5d0: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
d5e0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
d5f0: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
d600: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
d610: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72  e in order to cr
d620: 65 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a  eate a new VIEW.
d630: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
d640: 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72  reateView(.  Par
d650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d660: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
d670: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
d680: 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f  n *pBegin,     /
d690: 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
d6a0: 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74  en that begins t
d6b0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
d6c0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
d6d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65       /* The toke
d6e0: 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  n that holds the
d6f0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65   name of the vie
d700: 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  w */.  Token *pN
d710: 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame2,     /* The
d720: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
d730: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
d740: 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65  e view */.  Sele
d750: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f  ct *pSelect,   /
d760: 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65  * A SELECT state
d770: 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62  ment that will b
d780: 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69  ecome the new vi
d790: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  ew */.  int isTe
d7a0: 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 52  mp,        /* TR
d7b0: 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41  UE for a TEMPORA
d7c0: 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  RY view */.  int
d7d0: 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20 20   noErr          
d7e0: 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72 72 6f  /* Suppress erro
d7f0: 72 20 6d 65 73 73 61 67 65 73 20 69 66 20 56 49  r messages if VI
d800: 45 57 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  EW already exist
d810: 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  s */.){.  Table 
d820: 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63  *p;.  int n;.  c
d830: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
d840: 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62  Token sEnd;.  Db
d850: 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f  Fixer sFix;.  To
d860: 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a  ken *pName = 0;.
d870: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c    int iDb;.  sql
d880: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
d890: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50  e->db;..  if( pP
d8a0: 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a  arse->nVar>0 ){.
d8b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
d8c0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70 61 72  Msg(pParse, "par
d8d0: 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20  ameters are not 
d8e0: 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73  allowed in views
d8f0: 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  ");.    sqlite3S
d900: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
d910: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
d920: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
d930: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50  te3StartTable(pP
d940: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
d950: 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c  ame2, isTemp, 1,
d960: 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20   0, noErr);.  p 
d970: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
d980: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
d990: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
d9a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
d9b0: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
d9c0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74  Select);.    ret
d9d0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
d9e0: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
d9f0: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
da00: 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
da10: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
da20: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
da30: 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 69  p->pSchema);.  i
da40: 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  f( sqlite3FixIni
da50: 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
da60: 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e   iDb, "view", pN
da70: 61 6d 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69  ame).    && sqli
da80: 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46  te3FixSelect(&sF
da90: 69 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29  ix, pSelect).  )
daa0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
dab0: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
dac0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
dad0: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  rn;.  }..  /* Ma
dae0: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
daf0: 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73   entire SELECT s
db00: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
db10: 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
db20: 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66    ** This will f
db30: 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70  orce all the Exp
db40: 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73  r.token.z values
db50: 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
db60: 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
db70: 64 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f  d rather than po
db80: 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74  int to the input
db90: 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20   string - which 
dba0: 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20  means that.  ** 
dbb0: 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73  they will persis
dbc0: 74 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72  t after the curr
dbd0: 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ent sqlite3_exec
dbe0: 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e  () call returns.
dbf0: 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65  .  */.  p->pSele
dc00: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
dc10: 63 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63  ctDup(db, pSelec
dc20: 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  t, EXPRDUP_REDUC
dc30: 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  E);.  sqlite3Sel
dc40: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
dc50: 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 64 62  elect);.  if( db
dc60: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
dc70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
dc80: 7d 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  }.  if( !db->ini
dc90: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71  t.busy ){.    sq
dca0: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
dcb0: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
dcc0: 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  p);.  }..  /* Lo
dcd0: 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20  cate the end of 
dce0: 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20  the CREATE VIEW 
dcf0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65  statement.  Make
dd00: 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20   sEnd point to. 
dd10: 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a   ** the end..  *
dd20: 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73  /.  sEnd = pPars
dd30: 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20  e->sLastToken;. 
dd40: 20 69 66 28 20 41 4c 57 41 59 53 28 73 45 6e 64   if( ALWAYS(sEnd
dd50: 2e 7a 5b 30 5d 21 3d 30 29 20 26 26 20 73 45 6e  .z[0]!=0) && sEn
dd60: 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20  d.z[0]!=';' ){. 
dd70: 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e     sEnd.z += sEn
dd80: 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e  d.n;.  }.  sEnd.
dd90: 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e  n = 0;.  n = (in
dda0: 74 29 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67  t)(sEnd.z - pBeg
ddb0: 69 6e 2d 3e 7a 29 3b 0a 20 20 7a 20 3d 20 70 42  in->z);.  z = pB
ddc0: 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65  egin->z;.  while
ddd0: 28 20 41 4c 57 41 59 53 28 6e 3e 30 29 20 26 26  ( ALWAYS(n>0) &&
dde0: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
ddf0: 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20  z[n-1]) ){ n--; 
de00: 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b  }.  sEnd.z = &z[
de10: 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d  n-1];.  sEnd.n =
de20: 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71   1;..  /* Use sq
de30: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
de40: 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20  to add the view 
de50: 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  to the SQLITE_MA
de60: 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20  STER table */.  
de70: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
de80: 70 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64  pParse, 0, &sEnd
de90: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  , 0);.  return;.
dea0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
deb0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
dec0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
ded0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
dee0: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
def0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
df00: 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ABLE)./*.** The 
df10: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
df20: 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79  pTable is really
df30: 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69   a VIEW.  Fill i
df40: 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a  n the names of.*
df50: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  * the columns of
df60: 20 74 68 65 20 76 69 65 77 20 69 6e 20 74 68 65   the view in the
df70: 20 70 54 61 62 6c 65 20 73 74 72 75 63 74 75 72   pTable structur
df80: 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  e.  Return the n
df90: 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f  umber.** of erro
dfa0: 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  rs.  If an error
dfb0: 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61   is seen leave a
dfc0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
dfd0: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
dfe0: 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
dff0: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
e000: 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ames(Parse *pPar
e010: 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  se, Table *pTabl
e020: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65  e){.  Table *pSe
e030: 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b  lTab;   /* A fak
e040: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69  e table from whi
e050: 63 68 20 77 65 20 67 65 74 20 74 68 65 20 72 65  ch we get the re
e060: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65  sult set */.  Se
e070: 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20  lect *pSel;     
e080: 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53  /* Copy of the S
e090: 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65  ELECT that imple
e0a0: 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a  ments the view *
e0b0: 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  /.  int nErr = 0
e0c0: 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
e0d0: 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e  of errors encoun
e0e0: 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  tered */.  int n
e0f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
e100: 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64  Temporarily hold
e110: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
e120: 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64  cursors assigned
e130: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
e140: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
e150: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
e160: 6e 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c  nection for mall
e170: 6f 63 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  oc errors */.  i
e180: 6e 74 20 28 2a 78 41 75 74 68 29 28 76 6f 69 64  nt (*xAuth)(void
e190: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72  *,int,const char
e1a0: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  *,const char*,co
e1b0: 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20  nst char*,const 
e1c0: 63 68 61 72 2a 29 3b 0a 0a 20 20 61 73 73 65 72  char*);..  asser
e1d0: 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69  t( pTable );..#i
e1e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e1f0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
e200: 20 69 66 28 20 73 71 6c 69 74 65 33 56 74 61 62   if( sqlite3Vtab
e210: 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61 72  CallConnect(pPar
e220: 73 65 2c 20 70 54 61 62 6c 65 29 20 29 7b 0a 20  se, pTable) ){. 
e230: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e240: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
e250: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
e260: 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  le) ) return 0;.
e270: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
e280: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
e290: 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65  .  /* A positive
e2a0: 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20   nCol means the 
e2b0: 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f  columns names fo
e2c0: 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a  r this view are.
e2d0: 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f    ** already kno
e2e0: 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  wn..  */.  if( p
e2f0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20  Table->nCol>0 ) 
e300: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
e310: 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20  A negative nCol 
e320: 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72  is a special mar
e330: 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ker meaning that
e340: 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c   we are currentl
e350: 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f  y.  ** trying to
e360: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c   compute the col
e370: 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77  umn names.  If w
e380: 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75  e enter this rou
e390: 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61  tine with.  ** a
e3a0: 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20   negative nCol, 
e3b0: 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20  it means two or 
e3c0: 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20  more views form 
e3d0: 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69  a loop, like thi
e3e0: 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
e3f0: 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65   CREATE VIEW one
e400: 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
e410: 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20  M two;.  **     
e420: 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20  CREATE VIEW two 
e430: 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
e440: 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20   one;.  **.  ** 
e450: 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 65 72  Actually, the er
e460: 72 6f 72 20 61 62 6f 76 65 20 69 73 20 6e 6f 77  ror above is now
e470: 20 63 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f   caught prior to
e480: 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 70   reaching this p
e490: 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20 74  oint..  ** But t
e4a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
e4b0: 74 20 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f 72  t is still impor
e4c0: 74 61 6e 74 20 61 73 20 69 74 20 64 6f 65 73 20  tant as it does 
e4d0: 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e 20  come up.  ** in 
e4e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20  the following:. 
e4f0: 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43 52   ** .  **     CR
e500: 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e  EATE TABLE main.
e510: 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20 20  ex1(a);.  **    
e520: 20 43 52 45 41 54 45 20 54 45 4d 50 20 56 49 45   CREATE TEMP VIE
e530: 57 20 65 78 31 20 41 53 20 53 45 4c 45 43 54 20  W ex1 AS SELECT 
e540: 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a  a FROM ex1;.  **
e550: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
e560: 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20 2a  OM temp.ex1;.  *
e570: 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
e580: 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71  nCol<0 ){.    sq
e590: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
e5a0: 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20 69  arse, "view %s i
e5b0: 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66  s circularly def
e5c0: 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  ined", pTable->z
e5d0: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
e5e0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 1;.  }.  asser
e5f0: 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e  t( pTable->nCol>
e600: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  =0 );..  /* If w
e610: 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
e620: 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64  it means we need
e630: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
e640: 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a  table names..  *
e650: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
e660: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52  call to sqlite3R
e670: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
e680: 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61  () will expand a
e690: 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d  ny.  ** "*" elem
e6a0: 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73 75  ents in the resu
e6b0: 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65 20 76  lts set of the v
e6c0: 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73  iew and will ass
e6d0: 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a  ign cursors.  **
e6e0: 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73   to the elements
e6f0: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
e700: 75 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20  use.  But we do 
e710: 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20 63  not want these c
e720: 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62  hanges.  ** to b
e730: 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f  e permanent.  So
e740: 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e   the computation
e750: 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f   is done on a co
e760: 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
e770: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
e780: 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
e790: 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73   view..  */.  as
e7a0: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53  sert( pTable->pS
e7b0: 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20  elect );.  pSel 
e7c0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
e7d0: 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70  up(db, pTable->p
e7e0: 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66  Select, 0);.  if
e7f0: 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 75 38  ( pSel ){.    u8
e800: 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65   enableLookaside
e810: 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65   = db->lookaside
e820: 2e 62 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 6e  .bEnabled;.    n
e830: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
e840: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  .    sqlite3SrcL
e850: 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
e860: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70  (pParse, pSel->p
e870: 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62 6c 65  Src);.    pTable
e880: 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20  ->nCol = -1;.   
e890: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
e8a0: 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 23 69 66  Enabled = 0;.#if
e8b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e8c0: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
e8d0: 20 20 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78     xAuth = db->x
e8e0: 41 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41  Auth;.    db->xA
e8f0: 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 70 53 65  uth = 0;.    pSe
e900: 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65  lTab = sqlite3Re
e910: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
e920: 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20  pParse, pSel);. 
e930: 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78     db->xAuth = x
e940: 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Auth;.#else.    
e950: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
e960: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
e970: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29  ct(pParse, pSel)
e980: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 62 2d  ;.#endif.    db-
e990: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
e9a0: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 4c 6f 6f 6b  led = enableLook
e9b0: 61 73 69 64 65 3b 0a 20 20 20 20 70 50 61 72 73  aside;.    pPars
e9c0: 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20  e->nTab = n;.   
e9d0: 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a   if( pSelTab ){.
e9e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
e9f0: 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  able->aCol==0 );
ea00: 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  .      pTable->n
ea10: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e  Col = pSelTab->n
ea20: 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61 62 6c  Col;.      pTabl
ea30: 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->aCol = pSelTa
ea40: 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70  b->aCol;.      p
ea50: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30  SelTab->nCol = 0
ea60: 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d  ;.      pSelTab-
ea70: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >aCol = 0;.     
ea80: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
ea90: 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29  ble(db, pSelTab)
eaa0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
eab0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
eac0: 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 54  exHeld(db, 0, pT
ead0: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29 20 29  able->pSchema) )
eae0: 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  ;.      pTable->
eaf0: 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73 20 7c  pSchema->flags |
eb00: 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  = DB_UnresetView
eb10: 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  s;.    }else{.  
eb20: 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
eb30: 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45 72 72   = 0;.      nErr
eb40: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ++;.    }.    sq
eb50: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
eb60: 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20 7d  e(db, pSel);.  }
eb70: 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72   else {.    nErr
eb80: 2b 2b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ++;.  }.#endif /
eb90: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
eba0: 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e  EW */.  return n
ebb0: 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20  Err;  .}.#endif 
ebc0: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
ebd0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
ebe0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
ebf0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
ec00: 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  LE) */..#ifndef 
ec10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
ec20: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
ec30: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72   column names fr
ec40: 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e  om every VIEW in
ec50: 20 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a   database idx..*
ec60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
ec70: 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
ec80: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
ec90: 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c  t idx){.  HashEl
eca0: 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72 74 28  em *i;.  assert(
ecb0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
ecc0: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 64 78 2c  texHeld(db, idx,
ecd0: 20 30 29 20 29 3b 0a 20 20 69 66 28 20 21 44 62   0) );.  if( !Db
ece0: 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20  HasProperty(db, 
ecf0: 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56  idx, DB_UnresetV
ed00: 69 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a  iews) ) return;.
ed10: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
ed20: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62  shFirst(&db->aDb
ed30: 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74  [idx].pSchema->t
ed40: 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c  blHash); i;i=sql
ed50: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
ed60: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
ed70: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
ed80: 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54  a(i);.    if( pT
ed90: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
eda0: 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74       sqliteDelet
edb0: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c  eColumnNames(db,
edc0: 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54   pTab);.      pT
edd0: 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
ede0: 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d      pTab->nCol =
edf0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
ee00: 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  DbClearProperty(
ee10: 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
ee20: 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c  setViews);.}.#el
ee30: 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69  se.# define sqli
ee40: 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41  teViewResetAll(A
ee50: 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ,B).#endif /* SQ
ee60: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
ee70: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /../*.** This fu
ee80: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
ee90: 20 62 79 20 74 68 65 20 56 44 42 45 20 74 6f 20   by the VDBE to 
eea0: 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72  adjust the inter
eeb0: 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73  nal schema.** us
eec0: 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65  ed by SQLite whe
eed0: 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  n the btree laye
eee0: 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20  r moves a table 
eef0: 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a  root page. The.*
ef00: 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61  * root-page of a
ef10: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
ef20: 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 20  in database iDb 
ef30: 68 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d  has changed from
ef40: 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f   iFrom.** to iTo
ef50: 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23  ..**.** Ticket #
ef60: 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d 62 6f  1728:  The symbo
ef70: 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 73 74  l table might st
ef80: 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f  ill contain info
ef90: 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61  rmation.** on ta
efa0: 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69  bles and/or indi
efb0: 63 65 73 20 74 68 61 74 20 61 72 65 20 74 68 65  ces that are the
efc0: 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e   process of bein
efd0: 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66  g deleted..** If
efe0: 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b 79   you are unlucky
eff0: 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 64  , one of those d
f000: 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 20 6f  eleted indices o
f010: 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a  r tables might.*
f020: 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  * have the same 
f030: 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 20  rootpage number 
f040: 61 73 20 74 68 65 20 72 65 61 6c 20 74 61 62 6c  as the real tabl
f050: 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74 20  e or index that 
f060: 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65  is.** being move
f070: 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74  d.  So we cannot
f080: 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e 67 20   stop searching 
f090: 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20  after the first 
f0a0: 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61 75 73  match .** becaus
f0b0: 65 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  e the first matc
f0c0: 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72 20 6f  h might be for o
f0d0: 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65 74 65  ne of the delete
f0e0: 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20  d indices.** or 
f0f0: 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74  tables and not t
f100: 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 74  he table/index t
f110: 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20  hat is actually 
f120: 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20  being moved..** 
f130: 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65  We must continue
f140: 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61   looping until a
f150: 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e  ll tables and in
f160: 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f  dices with.** ro
f170: 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61  otpage==iFrom ha
f180: 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65  ve been converte
f190: 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f 6f 74  d to have a root
f1a0: 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69  page of iTo.** i
f1b0: 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 65  n order to be ce
f1c0: 72 74 61 69 6e 20 74 68 61 74 20 77 65 20 67 6f  rtain that we go
f1d0: 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e 65 2e  t the right one.
f1e0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
f1f0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
f200: 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  UM.void sqlite3R
f210: 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 73 71 6c  ootPageMoved(sql
f220: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
f230: 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  b, int iFrom, in
f240: 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c  t iTo){.  HashEl
f250: 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73  em *pElem;.  Has
f260: 68 20 2a 70 48 61 73 68 3b 0a 20 20 44 62 20 2a  h *pHash;.  Db *
f270: 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pDb;..  assert( 
f280: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
f290: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
f2a0: 30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64  0) );.  pDb = &d
f2b0: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70  b->aDb[iDb];.  p
f2c0: 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63  Hash = &pDb->pSc
f2d0: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20  hema->tblHash;. 
f2e0: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
f2f0: 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68  eHashFirst(pHash
f300: 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
f310: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
f320: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c  Elem)){.    Tabl
f330: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
f340: 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
f350: 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74  .    if( pTab->t
f360: 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  num==iFrom ){.  
f370: 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d      pTab->tnum =
f380: 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   iTo;.    }.  }.
f390: 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e    pHash = &pDb->
f3a0: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
f3b0: 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
f3c0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48  liteHashFirst(pH
f3d0: 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
f3e0: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
f3f0: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49  t(pElem)){.    I
f400: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c  ndex *pIdx = sql
f410: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
f420: 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  m);.    if( pIdx
f430: 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b  ->tnum==iFrom ){
f440: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75  .      pIdx->tnu
f450: 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20  m = iTo;.    }. 
f460: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
f470: 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f  ** Write code to
f480: 20 65 72 61 73 65 20 74 68 65 20 74 61 62 6c 65   erase the table
f490: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
f4a0: 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61  iTable from data
f4b0: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73  base iDb..** Als
f4c0: 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20  o write code to 
f4d0: 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69 74  modify the sqlit
f4e0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e_master table a
f4f0: 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  nd internal sche
f500: 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d  ma.** if a root-
f510: 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20  page of another 
f520: 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
f530: 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65  y the btree-laye
f540: 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73  r whilst.** eras
f550: 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69 73  ing iTable (this
f560: 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
f570: 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
f580: 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73  database)..*/ .s
f590: 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
f5a0: 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65  oyRootPage(Parse
f5b0: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54   *pParse, int iT
f5c0: 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  able, int iDb){.
f5d0: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
f5e0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
f5f0: 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73  e);.  int r1 = s
f600: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
f610: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
f620: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
f630: 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61   OP_Destroy, iTa
f640: 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20  ble, r1, iDb);. 
f650: 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
f660: 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65  (pParse);.#ifnde
f670: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
f680: 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50  TOVACUUM.  /* OP
f690: 5f 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20  _Destroy stores 
f6a0: 61 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31  an in integer r1
f6b0: 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65  . If this intege
f6c0: 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  r.  ** is non-ze
f6d0: 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ro, then it is t
f6e0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
f6f0: 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d  ber of a table m
f700: 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63  oved to.  ** loc
f710: 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68  ation iTable. Th
f720: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
f730: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71   modifies the sq
f740: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
f750: 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63  e to.  ** reflec
f760: 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a  t this..  **.  *
f770: 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20  * The "#NNN" in 
f780: 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70 65  the SQL is a spe
f790: 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68  cial constant th
f7a0: 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65  at means whateve
f7b0: 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20  r value.  ** is 
f7c0: 69 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e  in register NNN.
f7d0: 20 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72 75    See grammar ru
f7e0: 6c 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  les associated w
f7f0: 69 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49 53  ith the TK_REGIS
f800: 54 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66  TER.  ** token f
f810: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
f820: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  formation..  */.
f830: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
f840: 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
f850: 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73     "UPDATE %Q.%s
f860: 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64   SET rootpage=%d
f870: 20 57 48 45 52 45 20 23 25 64 20 41 4e 44 20 72   WHERE #%d AND r
f880: 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20  ootpage=#%d",.  
f890: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61     pParse->db->a
f8a0: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
f8b0: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
f8c0: 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 72 31  , iTable, r1, r1
f8d0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
f8e0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
f8f0: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d  g(pParse, r1);.}
f900: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44  ../*.** Write VD
f910: 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65  BE code to erase
f920: 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20   table pTab and 
f930: 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69  all associated i
f940: 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a  ndices on disk..
f950: 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74  ** Code to updat
f960: 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  e the sqlite_mas
f970: 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69  ter tables and i
f980: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64  nternal schema d
f990: 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e  efinitions.** in
f9a0: 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67   case a root-pag
f9b0: 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61  e belonging to a
f9c0: 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20  nother table is 
f9d0: 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72  moved by the btr
f9e0: 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61  ee layer.** is a
f9f0: 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73 20  lso added (this 
fa00: 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20  can happen with 
fa10: 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
fa20: 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61  atabase)..*/.sta
fa30: 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79  tic void destroy
fa40: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
fa50: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
fa60: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
fa70: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
fa80: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
fa90: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
faa0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
fab0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
fac0: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 64  b->pSchema);.  d
fad0: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
fae0: 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75  Parse, pTab->tnu
faf0: 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28 70  m, iDb);.  for(p
fb00: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
fb10: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
fb20: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64  x->pNext){.    d
fb30: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
fb40: 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75  Parse, pIdx->tnu
fb50: 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c  m, iDb);.  }.#el
fb60: 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  se.  /* If the d
fb70: 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20 61  atabase may be a
fb80: 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62  uto-vacuum capab
fb90: 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d  le (if SQLITE_OM
fba0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
fbb0: 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  ** is not define
fbc0: 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69  d), then it is i
fbd0: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c  mportant to call
fbe0: 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74   OP_Destroy on t
fbf0: 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e  he.  ** table an
fc00: 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67  d index root-pag
fc10: 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61  es in order, sta
fc20: 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e  rting with the n
fc30: 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a  umerically .  **
fc40: 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
fc50: 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20  ge number. This 
fc60: 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
fc70: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74  none of the root
fc80: 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62  -pages.  ** to b
fc90: 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20 72  e destroyed is r
fca0: 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65  elocated by an e
fcb0: 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f  arlier OP_Destro
fcc0: 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20  y. i.e. if the. 
fcd0: 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65   ** following we
fce0: 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20  re coded:.  **. 
fcf0: 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34   ** OP_Destroy 4
fd00: 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a   0.  ** ....  **
fd10: 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a   OP_Destroy 5 0.
fd20: 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f    **.  ** and ro
fd30: 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65 6e  ot page 5 happen
fd40: 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72  ed to be the lar
fd50: 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
fd60: 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a  umber in the.  *
fd70: 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  * database, then
fd80: 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75   root page 5 wou
fd90: 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70  ld be moved to p
fda0: 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20 20  age 4 by the .  
fdb0: 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34  ** "OP_Destroy 4
fdc0: 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20   0" opcode. The 
fdd0: 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44  subsequent "OP_D
fde0: 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c  estroy 5 0" woul
fdf0: 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65  d hit.  ** a fre
fe00: 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a  e-list page..  *
fe10: 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
fe20: 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74  Tab->tnum;.  int
fe30: 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b   iDestroyed = 0;
fe40: 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ..  while( 1 ){.
fe50: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
fe60: 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73  .    int iLarges
fe70: 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  t = 0;..    if( 
fe80: 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c  iDestroyed==0 ||
fe90: 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64   iTab<iDestroyed
fea0: 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65   ){.      iLarge
feb0: 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d  st = iTab;.    }
fec0: 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
fed0: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
fee0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
fef0: 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  xt){.      int i
ff00: 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d  Idx = pIdx->tnum
ff10: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
ff20: 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  pIdx->pSchema==p
ff30: 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
ff40: 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73 74        if( (iDest
ff50: 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64  royed==0 || (iId
ff60: 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20 26  x<iDestroyed)) &
ff70: 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20  & iIdx>iLargest 
ff80: 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67  ){.        iLarg
ff90: 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20  est = iIdx;.    
ffa0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
ffb0: 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b  ( iLargest==0 ){
ffc0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
ffd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ffe0: 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
fff0: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
10000 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
10010 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
10020 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
10030 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73  (pParse, iLarges
10040 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69  t, iDb);.      i
10050 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72  Destroyed = iLar
10060 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  gest;.    }.  }.
10070 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
10080 52 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66  Remove entries f
10090 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73  rom the sqlite_s
100a0 74 61 74 4e 20 74 61 62 6c 65 73 20 28 66 6f 72  tatN tables (for
100b0 20 4e 20 69 6e 20 28 31 2c 32 2c 33 29 29 0a 2a   N in (1,2,3)).*
100c0 2a 20 61 66 74 65 72 20 61 20 44 52 4f 50 20 49  * after a DROP I
100d0 4e 44 45 58 20 6f 72 20 44 52 4f 50 20 54 41 42  NDEX or DROP TAB
100e0 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73  LE command..*/.s
100f0 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
10100 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65  e3ClearStatTable
10110 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
10120 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
10130 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
10140 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
10150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10160 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6e  * The database n
10170 75 6d 62 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  umber */.  const
10180 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20 20   char *zType,   
10190 20 20 2f 2a 20 22 69 64 78 22 20 6f 72 20 22 74    /* "idx" or "t
101a0 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  bl" */.  const c
101b0 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20  har *zName      
101c0 2f 2a 20 4e 61 6d 65 20 6f 66 20 69 6e 64 65 78  /* Name of index
101d0 20 6f 72 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a   or table */.){.
101e0 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
101f0 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d   char *zDbName =
10200 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
10210 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 66  [iDb].zName;.  f
10220 6f 72 28 69 3d 31 3b 20 69 3c 3d 33 3b 20 69 2b  or(i=1; i<=3; i+
10230 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 61  +){.    char zTa
10240 62 5b 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74  b[24];.    sqlit
10250 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
10260 6f 66 28 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73  of(zTab),zTab,"s
10270 71 6c 69 74 65 5f 73 74 61 74 25 64 22 2c 69 29  qlite_stat%d",i)
10280 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
10290 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
102a0 65 2d 3e 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62  e->db, zTab, zDb
102b0 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73  Name) ){.      s
102c0 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
102d0 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
102e0 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
102f0 51 2e 25 73 20 57 48 45 52 45 20 25 73 3d 25 51  Q.%s WHERE %s=%Q
10300 22 2c 0a 20 20 20 20 20 20 20 20 7a 44 62 4e 61  ",.        zDbNa
10310 6d 65 2c 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c  me, zTab, zType,
10320 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a   zName.      );.
10330 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
10340 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
10350 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65   to drop a table
10360 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
10370 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 50  3CodeDropTable(P
10380 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
10390 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69  ble *pTab, int i
103a0 44 62 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b  Db, int isView){
103b0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
103c0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
103d0 73 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67 65  se->db;.  Trigge
103e0 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 44  r *pTrigger;.  D
103f0 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
10400 62 5b 69 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73  b[iDb];..  v = s
10410 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
10420 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
10430 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74   v!=0 );.  sqlit
10440 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
10450 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
10460 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
10470 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
10480 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49  UALTABLE.  if( I
10490 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
104a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
104b0 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42  eAddOp0(v, OP_VB
104c0 65 67 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  egin);.  }.#endi
104d0 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  f..  /* Drop all
104e0 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69   triggers associ
104f0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
10500 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
10510 64 2e 20 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20  d. Code.  ** is 
10520 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d  generated to rem
10530 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d  ove entries from
10540 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61   sqlite_master a
10550 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74  nd/or.  ** sqlit
10560 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66  e_temp_master if
10570 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a   required..  */.
10580 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c    pTrigger = sql
10590 69 74 65 33 54 72 69 67 67 65 72 4c 69 73 74 28  ite3TriggerList(
105a0 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
105b0 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72   while( pTrigger
105c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
105d0 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d  pTrigger->pSchem
105e0 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
105f0 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 70 54 72   || .        pTr
10600 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d  igger->pSchema==
10610 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
10620 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ma );.    sqlite
10630 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28  3DropTriggerPtr(
10640 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72  pParse, pTrigger
10650 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 20  );.    pTrigger 
10660 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78  = pTrigger->pNex
10670 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  t;.  }..#ifndef 
10680 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
10690 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52  INCREMENT.  /* R
106a0 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65  emove any entrie
106b0 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  s of the sqlite_
106c0 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61  sequence table a
106d0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20  ssociated with. 
106e0 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65   ** the table be
106f0 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69  ing dropped. Thi
10700 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65  s is done before
10710 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72   the table is dr
10720 6f 70 70 65 64 0a 20 20 2a 2a 20 61 74 20 74 68  opped.  ** at th
10730 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69  e btree level, i
10740 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c 69 74  n case the sqlit
10750 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
10760 20 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d   needs to.  ** m
10770 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c 74 20  ove as a result 
10780 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e  of the drop (can
10790 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d   happen in auto-
107a0 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20  vacuum mode)..  
107b0 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74  */.  if( pTab->t
107c0 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74  abFlags & TF_Aut
107d0 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20  oincrement ){.  
107e0 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
107f0 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
10800 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
10810 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  %Q.sqlite_sequen
10820 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ce WHERE name=%Q
10830 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  ",.      pDb->zN
10840 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
10850 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  .    );.  }.#end
10860 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c  if..  /* Drop al
10870 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  l SQLITE_MASTER 
10880 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
10890 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66  entries that ref
108a0 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74  er to the.  ** t
108b0 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61  able. The progra
108c0 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72  m name loops thr
108d0 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72 20  ough the master 
108e0 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65  table and delete
108f0 73 0a 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77  s.  ** every row
10900 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
10910 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73  a table of the s
10920 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
10930 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20 64  one being.  ** d
10940 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73  ropped. Triggers
10950 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70   are handled sep
10960 65 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20  erately because 
10970 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65  a trigger can be
10980 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e  .  ** created in
10990 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
109a0 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74  se that refers t
109b0 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f  o a table in ano
109c0 74 68 65 72 0a 20 20 2a 2a 20 64 61 74 61 62 61  ther.  ** databa
109d0 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  se..  */.  sqlit
109e0 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
109f0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 44 45  arse, .      "DE
10a00 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
10a10 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25  WHERE tbl_name=%
10a20 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69  Q and type!='tri
10a30 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 70 44  gger'",.      pD
10a40 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b->zName, SCHEMA
10a50 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 54 61  _TABLE(iDb), pTa
10a60 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b->zName);.  if(
10a70 20 21 69 73 56 69 65 77 20 26 26 20 21 49 73 56   !isView && !IsV
10a80 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
10a90 20 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65      destroyTable
10aa0 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
10ab0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65    }..  /* Remove
10ac0 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
10ad0 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69   from SQLite's i
10ae0 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61  nternal schema a
10af0 6e 64 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74  nd modify.  ** t
10b00 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
10b10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  ..  */.  if( IsV
10b20 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
10b30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10b40 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73  ddOp4(v, OP_VDes
10b50 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c  troy, iDb, 0, 0,
10b60 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
10b70 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
10b80 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
10b90 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20  DropTable, iDb, 
10ba0 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  0, 0, pTab->zNam
10bb0 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  e, 0);.  sqlite3
10bc0 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
10bd0 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c  rse, iDb);.  sql
10be0 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
10bf0 64 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  db, iDb);.}../*.
10c00 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10c10 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20  is called to do 
10c20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52  the work of a DR
10c30 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  OP TABLE stateme
10c40 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20  nt..** pName is 
10c50 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
10c60 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70  table to be drop
10c70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ped..*/.void sql
10c80 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61  ite3DropTable(Pa
10c90 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
10ca0 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
10cb0 20 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45   isView, int noE
10cc0 72 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  rr){.  Table *pT
10cd0 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  ab;.  Vdbe *v;. 
10ce0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
10cf0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
10d00 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d   iDb;..  if( db-
10d10 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
10d20 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
10d30 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
10d40 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
10d50 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73  >nErr==0 );.  as
10d60 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
10d70 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 6e 6f  c==1 );.  if( no
10d80 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65  Err ) db->suppre
10d90 73 73 45 72 72 2b 2b 3b 0a 20 20 70 54 61 62 20  ssErr++;.  pTab 
10da0 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
10db0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 73 56  able(pParse, isV
10dc0 69 65 77 2c 20 0a 20 20 20 20 20 20 20 20 20 20  iew, .          
10dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10de0 20 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e    pName->a[0].zN
10df0 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ame, pName->a[0]
10e00 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69  .zDatabase);.  i
10e10 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73  f( noErr ) db->s
10e20 75 70 70 72 65 73 73 45 72 72 2d 2d 3b 0a 0a 20  uppressErr--;.. 
10e30 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
10e40 20 20 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20      if( noErr ) 
10e50 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
10e60 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61  yNamedSchema(pPa
10e70 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  rse, pName->a[0]
10e80 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
10e90 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
10ea0 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62  table;.  }.  iDb
10eb0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
10ec0 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
10ed0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73  ->pSchema);.  as
10ee0 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
10ef0 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a  iDb<db->nDb );..
10f00 20 20 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20    /* If pTab is 
10f10 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  a virtual table,
10f20 20 63 61 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c   call ViewGetCol
10f30 75 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e  umnNames() to en
10f40 73 75 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20  sure.  ** it is 
10f50 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
10f60 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
10f70 6c 28 70 54 61 62 29 20 26 26 20 73 71 6c 69 74  l(pTab) && sqlit
10f80 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
10f90 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
10fa0 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  b) ){.    goto e
10fb0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
10fc0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
10fd0 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
10fe0 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
10ff0 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73  t code;.    cons
11000 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
11010 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
11020 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
11030 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
11040 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
11050 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
11060 32 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  2 = 0;.    if( s
11070 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
11080 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
11090 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
110a0 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74  zDb)){.      got
110b0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
110c0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
110d0 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20   isView ){.     
110e0 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
110f0 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
11100 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
11110 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56  LITE_DROP_TEMP_V
11120 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
11130 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
11140 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45   SQLITE_DROP_VIE
11150 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  W;.      }.#ifnd
11160 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
11170 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
11180 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74  }else if( IsVirt
11190 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
111a0 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
111b0 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20  _DROP_VTABLE;.  
111c0 20 20 20 20 7a 41 72 67 32 20 3d 20 73 71 6c 69      zArg2 = sqli
111d0 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c  te3GetVTable(db,
111e0 20 70 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e   pTab)->pMod->zN
111f0 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ame;.#endif.    
11200 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
11210 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
11220 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
11230 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
11240 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
11250 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11260 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
11270 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b  LITE_DROP_TABLE;
11280 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11290 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
112a0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
112b0 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  code, pTab->zNam
112c0 65 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29  e, zArg2, zDb) )
112d0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
112e0 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
112f0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
11300 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
11310 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
11320 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  TE, pTab->zName,
11330 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
11340 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
11350 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
11360 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73  }.#endif.  if( s
11370 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
11380 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
11390 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20  ite_", 7)==0 .  
113a0 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e    && sqlite3StrN
113b0 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65  ICmp(pTab->zName
113c0 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 22 2c  , "sqlite_stat",
113d0 20 31 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 73   11)!=0 ){.    s
113e0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
113f0 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
11400 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70   may not be drop
11410 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  ped", pTab->zNam
11420 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
11430 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
11440 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
11450 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a  E_OMIT_VIEW.  /*
11460 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42   Ensure DROP TAB
11470 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f  LE is not used o
11480 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52  n a view, and DR
11490 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75  OP VIEW is not u
114a0 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61  sed.  ** on a ta
114b0 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
114c0 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e  isView && pTab->
114d0 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
114e0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
114f0 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44  g(pParse, "use D
11500 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c  ROP TABLE to del
11510 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70  ete table %s", p
11520 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
11530 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
11540 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28  table;.  }.  if(
11550 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62   !isView && pTab
11560 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
11570 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11580 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
11590 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74  OP VIEW to delet
115a0 65 20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62  e view %s", pTab
115b0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
115c0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
115d0 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  le;.  }.#endif..
115e0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
115f0 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
11600 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
11610 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a  master table.  *
11620 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  * on disk..  */.
11630 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
11640 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
11650 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
11660 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
11670 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
11680 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  1, iDb);.    sql
11690 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62  ite3ClearStatTab
116a0 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c  les(pParse, iDb,
116b0 20 22 74 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e   "tbl", pTab->zN
116c0 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
116d0 33 46 6b 44 72 6f 70 54 61 62 6c 65 28 70 50 61  3FkDropTable(pPa
116e0 72 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54 61 62  rse, pName, pTab
116f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  );.    sqlite3Co
11700 64 65 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72  deDropTable(pPar
11710 73 65 2c 20 70 54 61 62 2c 20 69 44 62 2c 20 69  se, pTab, iDb, i
11720 73 56 69 65 77 29 3b 0a 20 20 7d 0a 0a 65 78 69  sView);.  }..exi
11730 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20  t_drop_table:.  
11740 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
11750 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b  lete(db, pName);
11760 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
11770 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
11780 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
11790 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20   foreign key on 
117a0 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72  the table.** cur
117b0 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
117c0 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f  struction.  pFro
117d0 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20  mCol determines 
117e0 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  which columns.**
117f0 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
11800 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74  table point to t
11810 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20  he foreign key. 
11820 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20   If pFromCol==0 
11830 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20  then.** connect 
11840 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c  the key to the l
11850 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72  ast column inser
11860 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65  ted.  pTo is the
11870 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20   name of.** the 
11880 74 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74  table referred t
11890 6f 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20  o.  pToCol is a 
118a0 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69  list of tables i
118b0 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70  n the other.** p
118c0 54 6f 20 74 61 62 6c 65 20 74 68 61 74 20 74 68  To table that th
118d0 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f  e foreign key po
118e0 69 6e 74 73 20 74 6f 2e 20 20 66 6c 61 67 73 20  ints to.  flags 
118f0 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20  contains all.** 
11900 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
11910 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72  t the conflict r
11920 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
11930 74 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a  thms specified.*
11940 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45  * in the ON DELE
11950 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e  TE, ON UPDATE an
11960 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75  d ON INSERT clau
11970 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b  ses..**.** An FK
11980 65 79 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ey structure is 
11990 63 72 65 61 74 65 64 20 61 6e 64 20 61 64 64 65  created and adde
119a0 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  d to the table c
119b0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65  urrently.** unde
119c0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69  r construction i
119d0 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e  n the pParse->pN
119e0 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 0a 2a  ewTable field..*
119f0 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e  *.** The foreign
11a00 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72 20   key is set for 
11a10 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73  IMMEDIATE proces
11a20 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75  sing.  A subsequ
11a30 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73  ent call.** to s
11a40 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
11a50 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68  gnKey() might ch
11a60 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45 46  ange this to DEF
11a70 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ERRED..*/.void s
11a80 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72 65  qlite3CreateFore
11a90 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20  ignKey(.  Parse 
11aa0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
11ab0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
11ac0 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
11ad0 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43  *pFromCol,  /* C
11ae0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74  olumns in this t
11af0 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20  able that point 
11b00 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  to other table *
11b10 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20  /.  Token *pTo, 
11b20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
11b30 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74 61   of the other ta
11b40 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ble */.  ExprLis
11b50 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a  t *pToCol,    /*
11b60 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   Columns in the 
11b70 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
11b80 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
11b90 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63        /* Conflic
11ba0 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
11bb0 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20  orithms. */.){. 
11bc0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
11bd0 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64  Parse->db;.#ifnd
11be0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
11bf0 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65  OREIGN_KEY.  FKe
11c00 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20  y *pFKey = 0;.  
11c10 46 4b 65 79 20 2a 70 4e 65 78 74 54 6f 3b 0a 20  FKey *pNextTo;. 
11c20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72   Table *p = pPar
11c30 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
11c40 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e   int nByte;.  in
11c50 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  t i;.  int nCol;
11c60 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61  .  char *z;..  a
11c70 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b  ssert( pTo!=0 );
11c80 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 49  .  if( p==0 || I
11c90 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
11ca0 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
11cb0 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20  if( pFromCol==0 
11cc0 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  ){.    int iCol 
11cd0 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20  = p->nCol-1;.   
11ce0 20 69 66 28 20 4e 45 56 45 52 28 69 43 6f 6c 3c   if( NEVER(iCol<
11cf0 30 29 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  0) ) goto fk_end
11d00 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c  ;.    if( pToCol
11d10 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70   && pToCol->nExp
11d20 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  r!=1 ){.      sq
11d30 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
11d40 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b  arse, "foreign k
11d50 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20  ey on %s".      
11d60 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65     " should refe
11d70 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63  rence only one c
11d80 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25  olumn of table %
11d90 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e  T",.         p->
11da0 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
11db0 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f  , pTo);.      go
11dc0 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d  to fk_end;.    }
11dd0 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20  .    nCol = 1;. 
11de0 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f   }else if( pToCo
11df0 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78  l && pToCol->nEx
11e00 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  pr!=pFromCol->nE
11e10 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
11e20 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
11e30 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62  e,.        "numb
11e40 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
11e50 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65   foreign key doe
11e60 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
11e70 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20  number of ".    
11e80 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20      "columns in 
11e90 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
11ea0 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f  able");.    goto
11eb0 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65   fk_end;.  }else
11ec0 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72  {.    nCol = pFr
11ed0 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20  omCol->nExpr;.  
11ee0 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  }.  nByte = size
11ef0 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 28 6e 43  of(*pFKey) + (nC
11f00 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 70 46 4b  ol-1)*sizeof(pFK
11f10 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70  ey->aCol[0]) + p
11f20 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28  To->n + 1;.  if(
11f30 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66   pToCol ){.    f
11f40 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c  or(i=0; i<pToCol
11f50 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
11f60 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71       nByte += sq
11f70 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54  lite3Strlen30(pT
11f80 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
11f90 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  ) + 1;.    }.  }
11fa0 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74  .  pFKey = sqlit
11fb0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
11fc0 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  b, nByte );.  if
11fd0 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20  ( pFKey==0 ){.  
11fe0 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
11ff0 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f   }.  pFKey->pFro
12000 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e  m = p;.  pFKey->
12010 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70  pNextFrom = p->p
12020 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61  FKey;.  z = (cha
12030 72 2a 29 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b  r*)&pFKey->aCol[
12040 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e  nCol];.  pFKey->
12050 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70  zTo = z;.  memcp
12060 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f  y(z, pTo->z, pTo
12070 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e  ->n);.  z[pTo->n
12080 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
12090 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 7a 20  Dequote(z);.  z 
120a0 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70  += pTo->n+1;.  p
120b0 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f  FKey->nCol = nCo
120c0 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  l;.  if( pFromCo
120d0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65  l==0 ){.    pFKe
120e0 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d  y->aCol[0].iFrom
120f0 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
12100 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
12110 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
12120 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  {.      int j;. 
12130 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
12140 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  p->nCol; j++){. 
12150 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
12160 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f  e3StrICmp(p->aCo
12170 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f  l[j].zName, pFro
12180 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  mCol->a[i].zName
12190 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
121a0 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d    pFKey->aCol[i]
121b0 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20  .iFrom = j;.    
121c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
121d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
121e0 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e       if( j>=p->n
121f0 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Col ){.        s
12200 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
12210 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
12220 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d    "unknown colum
12230 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65  n \"%s\" in fore
12240 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
12250 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  on", .          
12260 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
12270 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
12280 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
12290 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
122a0 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
122b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
122c0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
122d0 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
122e0 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61  rlen30(pToCol->a
122f0 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
12300 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d    pFKey->aCol[i]
12310 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20  .zCol = z;.     
12320 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f   memcpy(z, pToCo
12330 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e  l->a[i].zName, n
12340 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20  );.      z[n] = 
12350 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b  0;.      z += n+
12360 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
12370 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
12380 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61   = 0;.  pFKey->a
12390 41 63 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29  Action[0] = (u8)
123a0 28 66 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20  (flags & 0xff); 
123b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e             /* ON
123c0 20 44 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a   DELETE action *
123d0 2f 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69  /.  pFKey->aActi
123e0 6f 6e 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c  on[1] = (u8)((fl
123f0 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66  ags >> 8 ) & 0xf
12400 66 29 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44  f);    /* ON UPD
12410 41 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20  ATE action */.. 
12420 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12430 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
12440 64 62 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d  db, 0, p->pSchem
12450 61 29 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20  a) );.  pNextTo 
12460 3d 20 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65  = (FKey *)sqlite
12470 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e  3HashInsert(&p->
12480 70 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73  pSchema->fkeyHas
12490 68 2c 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  h, .      pFKey-
124a0 3e 7a 54 6f 2c 20 73 71 6c 69 74 65 33 53 74 72  >zTo, sqlite3Str
124b0 6c 65 6e 33 30 28 70 46 4b 65 79 2d 3e 7a 54 6f  len30(pFKey->zTo
124c0 29 2c 20 28 76 6f 69 64 20 2a 29 70 46 4b 65 79  ), (void *)pFKey
124d0 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 78  .  );.  if( pNex
124e0 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a 20 20  tTo==pFKey ){.  
124f0 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
12500 65 64 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  ed = 1;.    goto
12510 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69   fk_end;.  }.  i
12520 66 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20  f( pNextTo ){.  
12530 20 20 61 73 73 65 72 74 28 20 70 4e 65 78 74 54    assert( pNextT
12540 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b  o->pPrevTo==0 );
12550 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  .    pFKey->pNex
12560 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20  tTo = pNextTo;. 
12570 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65     pNextTo->pPre
12580 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d  vTo = pFKey;.  }
12590 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
125a0 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74  foreign key to t
125b0 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65 20  he table as the 
125c0 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a  last step..  */.
125d0 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b    p->pFKey = pFK
125e0 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b  ey;.  pFKey = 0;
125f0 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69  ..fk_end:.  sqli
12600 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 46  te3DbFree(db, pF
12610 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  Key);.#endif /* 
12620 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
12630 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
12640 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78  ) */.  sqlite3Ex
12650 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
12660 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71   pFromCol);.  sq
12670 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
12680 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b  ete(db, pToCol);
12690 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
126a0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
126b0 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c   when an INITIAL
126c0 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20  LY IMMEDIATE or 
126d0 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
126e0 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  ED.** clause is 
126f0 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  seen as part of 
12700 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  a foreign key de
12710 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69  finition.  The i
12720 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72  sDeferred.** par
12730 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72 20  ameter is 1 for 
12740 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
12750 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49  ED and 0 for INI
12760 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
12770 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f  ..** The behavio
12780 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  r of the most re
12790 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66  cently created f
127a0 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64  oreign key is ad
127b0 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64  justed.** accord
127c0 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ingly..*/.void s
127d0 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
127e0 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61  gnKey(Parse *pPa
127f0 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72  rse, int isDefer
12800 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  red){.#ifndef SQ
12810 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
12820 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70  N_KEY.  Table *p
12830 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b  Tab;.  FKey *pFK
12840 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20  ey;.  if( (pTab 
12850 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
12860 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65  ble)==0 || (pFKe
12870 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29  y = pTab->pFKey)
12880 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
12890 61 73 73 65 72 74 28 20 69 73 44 65 66 65 72 72  assert( isDeferr
128a0 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65 72  ed==0 || isDefer
128b0 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a  red==1 ); /* EV:
128c0 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37 20 2a   R-30323-21917 *
128d0 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  /.  pFKey->isDef
128e0 65 72 72 65 64 20 3d 20 28 75 38 29 69 73 44 65  erred = (u8)isDe
128f0 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d  ferred;.#endif.}
12900 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
12910 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
12920 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c  erase and refill
12930 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54   index *pIdx.  T
12940 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  his is.** used t
12950 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  o initialize a n
12960 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ewly created ind
12970 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75  ex or to recompu
12980 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  te the.** conten
12990 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e  t of an index in
129a0 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52   response to a R
129b0 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
129c0 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74  **.** if memRoot
129d0 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61  Page is not nega
129e0 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  tive, it means t
129f0 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73  hat the index is
12a00 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65   newly.** create
12a10 64 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72  d.  The register
12a20 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6d 65   specified by me
12a30 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69  mRootPage contai
12a40 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  ns the.** root p
12a50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
12a60 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d  e index.  If mem
12a70 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61  RootPage is nega
12a80 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tive, then.** th
12a90 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
12aa0 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20  exists and must 
12ab0 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72  be cleared befor
12ac0 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64  e being refilled
12ad0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74   and.** the root
12ae0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
12af0 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b  the index is tak
12b00 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e  en from pIndex->
12b10 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tnum..*/.static 
12b20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66 69  void sqlite3Refi
12b30 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  llIndex(Parse *p
12b40 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
12b50 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f  ndex, int memRoo
12b60 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20  tPage){.  Table 
12b70 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
12b80 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20  pTable;  /* The 
12b90 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e  table that is in
12ba0 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  dexed */.  int i
12bb0 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
12bc0 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72  ab++;     /* Btr
12bd0 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
12be0 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  or pTab */.  int
12bf0 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e   iIdx = pParse->
12c00 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42  nTab++;     /* B
12c10 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
12c20 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20   for pIndex */. 
12c30 20 69 6e 74 20 69 53 6f 72 74 65 72 3b 20 20 20   int iSorter;   
12c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c50 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 65 64  /* Cursor opened
12c60 20 62 79 20 4f 70 65 6e 53 6f 72 74 65 72 20 28   by OpenSorter (
12c70 69 66 20 69 6e 20 75 73 65 29 20 2a 2f 0a 20 20  if in use) */.  
12c80 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20  int addr1;      
12c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12ca0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70  * Address of top
12cb0 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e   of loop */.  in
12cc0 74 20 61 64 64 72 32 3b 20 20 20 20 20 20 20 20  t addr2;        
12cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12ce0 41 64 64 72 65 73 73 20 74 6f 20 6a 75 6d 70 20  Address to jump 
12cf0 74 6f 20 66 6f 72 20 6e 65 78 74 20 69 74 65 72  to for next iter
12d00 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 74  ation */.  int t
12d10 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  num;            
12d20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
12d30 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20  t page of index 
12d40 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d60 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
12d70 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76  code into this v
12d80 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a  irtual machine *
12d90 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
12da0 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
12db0 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f     /* KeyInfo fo
12dc0 72 20 69 6e 64 65 78 20 2a 2f 0a 23 69 66 64 65  r index */.#ifde
12dd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
12de0 52 47 45 5f 53 4f 52 54 0a 20 20 69 6e 74 20 72  RGE_SORT.  int r
12df0 65 67 49 64 78 4b 65 79 3b 20 20 20 20 20 20 20  egIdxKey;       
12e00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
12e10 69 73 74 65 72 73 20 63 6f 6e 74 61 69 6e 69 6e  isters containin
12e20 67 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 20  g the index key 
12e30 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20  */.#endif.  int 
12e40 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20  regRecord;      
12e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
12e60 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61  gister holding a
12e70 73 73 65 6d 62 6c 69 65 64 20 69 6e 64 65 78 20  ssemblied index 
12e80 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69  record */.  sqli
12e90 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
12ea0 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20 54 68  ->db;      /* Th
12eb0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
12ec0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
12ed0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
12ee0 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49  maToIndex(db, pI
12ef0 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  ndex->pSchema);.
12f00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12f10 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
12f20 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ON.  if( sqlite3
12f30 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
12f40 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58  , SQLITE_REINDEX
12f50 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
12f60 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44   0,.      db->aD
12f70 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29  b[iDb].zName ) )
12f80 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
12f90 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  }.#endif..  /* R
12fa0 65 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c  equire a write-l
12fb0 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
12fc0 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73   to perform this
12fd0 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
12fe0 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
12ff0 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
13000 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61  ab->tnum, 1, pTa
13010 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20  b->zName);..  v 
13020 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
13030 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
13040 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
13050 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65   if( memRootPage
13060 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20  >=0 ){.    tnum 
13070 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20  = memRootPage;. 
13080 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d   }else{.    tnum
13090 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b   = pIndex->tnum;
130a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
130b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65  AddOp2(v, OP_Cle
130c0 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ar, tnum, iDb);.
130d0 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c    }.  pKey = sql
130e0 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
130f0 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29  (pParse, pIndex)
13100 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
13110 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
13120 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75  Write, iIdx, tnu
13130 6d 2c 20 69 44 62 2c 20 0a 20 20 20 20 20 20 20  m, iDb, .       
13140 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
13150 61 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45  ar *)pKey, P4_KE
13160 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
13170 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67    if( memRootPag
13180 65 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  e>=0 ){.    sqli
13190 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
131a0 76 2c 20 31 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  v, 1);.  }..#ifn
131b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
131c0 4d 45 52 47 45 5f 53 4f 52 54 0a 20 20 2f 2a 20  MERGE_SORT.  /* 
131d0 4f 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72 20  Open the sorter 
131e0 63 75 72 73 6f 72 20 69 66 20 77 65 20 61 72 65  cursor if we are
131f0 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a   to use one. */.
13200 20 20 69 53 6f 72 74 65 72 20 3d 20 70 50 61 72    iSorter = pPar
13210 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71  se->nTab++;.  sq
13220 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
13230 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  v, OP_SorterOpen
13240 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c 20 30 2c  , iSorter, 0, 0,
13250 20 28 63 68 61 72 2a 29 70 4b 65 79 2c 20 50 34   (char*)pKey, P4
13260 5f 4b 45 59 49 4e 46 4f 29 3b 0a 23 65 6c 73 65  _KEYINFO);.#else
13270 0a 20 20 69 53 6f 72 74 65 72 20 3d 20 69 54 61  .  iSorter = iTa
13280 62 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  b;.#endif..  /* 
13290 4f 70 65 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  Open the table. 
132a0 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
132b0 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62   rows of the tab
132c0 6c 65 2c 20 69 6e 73 65 72 74 69 6e 67 20 69 6e  le, inserting in
132d0 64 65 78 0a 20 20 2a 2a 20 72 65 63 6f 72 64 73  dex.  ** records
132e0 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72   into the sorter
132f0 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4f 70  . */.  sqlite3Op
13300 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
13310 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c  iTab, iDb, pTab,
13320 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
13330 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
13340 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13350 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30  _Rewind, iTab, 0
13360 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d  );.  regRecord =
13370 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
13380 65 67 28 70 50 61 72 73 65 29 3b 0a 0a 23 69 66  eg(pParse);..#if
13390 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
133a0 5f 4d 45 52 47 45 5f 53 4f 52 54 0a 20 20 73 71  _MERGE_SORT.  sq
133b0 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64  lite3GenerateInd
133c0 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49  exKey(pParse, pI
133d0 6e 64 65 78 2c 20 69 54 61 62 2c 20 72 65 67 52  ndex, iTab, regR
133e0 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20 73 71 6c  ecord, 1);.  sql
133f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13400 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72  , OP_SorterInser
13410 74 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52  t, iSorter, regR
13420 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
13430 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13440 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
13450 64 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  dr1+1);.  sqlite
13460 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
13470 20 61 64 64 72 31 29 3b 0a 20 20 61 64 64 72 31   addr1);.  addr1
13480 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
13490 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
134a0 72 53 6f 72 74 2c 20 69 53 6f 72 74 65 72 2c 20  rSort, iSorter, 
134b0 30 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  0);.  if( pIndex
134c0 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
134d0 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 32  ne ){.    int j2
134e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
134f0 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 33  rrentAddr(v) + 3
13500 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13510 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
13520 74 6f 2c 20 30 2c 20 6a 32 29 3b 0a 20 20 20 20  to, 0, j2);.    
13530 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
13540 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
13550 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
13560 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
13570 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c 20 69 53  orterCompare, iS
13580 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65 67 52 65  orter, j2, regRe
13590 63 6f 72 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  cord);.    sqlit
135a0 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74  e3HaltConstraint
135b0 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
135c0 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 22 69 6e 64  , OE_Abort, "ind
135d0 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65  exed columns are
135e0 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 34   not unique", P4
135f0 5f 53 54 41 54 49 43 0a 20 20 20 20 29 3b 0a 20  _STATIC.    );. 
13600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72   }else{.    addr
13610 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
13620 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
13630 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
13640 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
13650 74 65 72 44 61 74 61 2c 20 69 53 6f 72 74 65 72  terData, iSorter
13660 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
13670 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13680 33 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  3(v, OP_IdxInser
13690 74 2c 20 69 49 64 78 2c 20 72 65 67 52 65 63 6f  t, iIdx, regReco
136a0 72 64 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65  rd, 1);.  sqlite
136b0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
136c0 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
136d0 45 53 55 4c 54 29 3b 0a 23 65 6c 73 65 0a 20 20  ESULT);.#else.  
136e0 72 65 67 49 64 78 4b 65 79 20 3d 20 73 71 6c 69  regIdxKey = sqli
136f0 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78  te3GenerateIndex
13700 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49 6e 64  Key(pParse, pInd
13710 65 78 2c 20 69 54 61 62 2c 20 72 65 67 52 65 63  ex, iTab, regRec
13720 6f 72 64 2c 20 31 29 3b 0a 20 20 61 64 64 72 32  ord, 1);.  addr2
13730 20 3d 20 61 64 64 72 31 20 2b 20 31 3b 0a 20 20   = addr1 + 1;.  
13740 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  if( pIndex->onEr
13750 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a  ror!=OE_None ){.
13760 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 72 65      const int re
13770 67 52 6f 77 69 64 20 3d 20 72 65 67 49 64 78 4b  gRowid = regIdxK
13780 65 79 20 2b 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  ey + pIndex->nCo
13790 6c 75 6d 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20  lumn;.    const 
137a0 69 6e 74 20 6a 32 20 3d 20 73 71 6c 69 74 65 33  int j2 = sqlite3
137b0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
137c0 76 29 20 2b 20 32 3b 0a 20 20 20 20 76 6f 69 64  v) + 2;.    void
137d0 20 2a 20 63 6f 6e 73 74 20 70 52 65 67 4b 65 79   * const pRegKey
137e0 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f   = SQLITE_INT_TO
137f0 5f 50 54 52 28 72 65 67 49 64 78 4b 65 79 29 3b  _PTR(regIdxKey);
13800 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 67  ..    /* The reg
13810 69 73 74 65 72 73 20 61 63 63 65 73 73 65 64 20  isters accessed 
13820 62 79 20 74 68 65 20 4f 50 5f 49 73 55 6e 69 71  by the OP_IsUniq
13830 75 65 20 6f 70 63 6f 64 65 20 77 65 72 65 20 61  ue opcode were a
13840 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20  llocated.    ** 
13850 75 73 69 6e 67 20 73 71 6c 69 74 65 33 47 65 74  using sqlite3Get
13860 54 65 6d 70 52 61 6e 67 65 28 29 20 69 6e 73 69  TempRange() insi
13870 64 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  de of the sqlite
13880 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
13890 79 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  y().    ** call 
138a0 61 62 6f 76 65 2e 20 4a 75 73 74 20 62 65 66 6f  above. Just befo
138b0 72 65 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e  re that function
138c0 20 77 61 73 20 66 72 65 65 64 20 74 68 65 79 20   was freed they 
138d0 77 65 72 65 20 72 65 6c 65 61 73 65 64 0a 20 20  were released.  
138e0 20 20 2a 2a 20 28 6d 61 64 65 20 61 76 61 69 6c    ** (made avail
138f0 61 62 6c 65 20 74 6f 20 74 68 65 20 63 6f 6d 70  able to the comp
13900 69 6c 65 72 20 66 6f 72 20 72 65 75 73 65 29 20  iler for reuse) 
13910 75 73 69 6e 67 20 0a 20 20 20 20 2a 2a 20 73 71  using .    ** sq
13920 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
13930 52 61 6e 67 65 28 29 2e 20 53 6f 20 69 6e 20 73  Range(). So in s
13940 6f 6d 65 20 77 61 79 73 20 68 61 76 69 6e 67 20  ome ways having 
13950 74 68 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 0a  the OP_IsUnique.
13960 20 20 20 20 2a 2a 20 6f 70 63 6f 64 65 20 75 73      ** opcode us
13970 65 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f  e the values sto
13980 72 65 64 20 77 69 74 68 69 6e 20 73 65 65 6d 73  red within seems
13990 20 64 61 6e 67 65 72 6f 75 73 2e 20 48 6f 77 65   dangerous. Howe
139a0 76 65 72 2c 20 73 69 6e 63 65 0a 20 20 20 20 2a  ver, since.    *
139b0 2a 20 77 65 20 63 61 6e 20 62 65 20 73 75 72 65  * we can be sure
139c0 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 74   that no other t
139d0 65 6d 70 20 72 65 67 69 73 74 65 72 73 20 68 61  emp registers ha
139e0 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ve been allocate
139f0 64 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 73  d.    ** since s
13a00 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
13a10 70 52 61 6e 67 65 28 29 20 77 61 73 20 63 61 6c  pRange() was cal
13a20 6c 65 64 2c 20 69 74 20 69 73 20 73 61 66 65 20  led, it is safe 
13a30 74 6f 20 64 6f 20 73 6f 2e 0a 20 20 20 20 2a 2f  to do so..    */
13a40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13a50 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 73 55  AddOp4(v, OP_IsU
13a60 6e 69 71 75 65 2c 20 69 49 64 78 2c 20 6a 32 2c  nique, iIdx, j2,
13a70 20 72 65 67 52 6f 77 69 64 2c 20 70 52 65 67 4b   regRowid, pRegK
13a80 65 79 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20  ey, P4_INT32);. 
13a90 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f     sqlite3HaltCo
13aa0 6e 73 74 72 61 69 6e 74 28 0a 20 20 20 20 20 20  nstraint(.      
13ab0 20 20 70 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f    pParse, OE_Abo
13ac0 72 74 2c 20 22 69 6e 64 65 78 65 64 20 63 6f 6c  rt, "indexed col
13ad0 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69  umns are not uni
13ae0 71 75 65 22 2c 20 50 34 5f 53 54 41 54 49 43 29  que", P4_STATIC)
13af0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
13b00 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
13b10 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c  IdxInsert, iIdx,
13b20 20 72 65 67 52 65 63 6f 72 64 2c 20 30 29 3b 0a   regRecord, 0);.
13b30 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
13b40 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
13b50 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
13b60 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
13b70 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
13b80 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64  Parse, regRecord
13b90 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
13ba0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
13bb0 74 65 72 4e 65 78 74 2c 20 69 53 6f 72 74 65 72  terNext, iSorter
13bc0 2c 20 61 64 64 72 32 29 3b 0a 20 20 73 71 6c 69  , addr2);.  sqli
13bd0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
13be0 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 73 71  v, addr1);..  sq
13bf0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
13c00 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61  v, OP_Close, iTa
13c10 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b);.  sqlite3Vdb
13c20 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
13c30 6f 73 65 2c 20 69 49 64 78 29 3b 0a 20 20 73 71  ose, iIdx);.  sq
13c40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
13c50 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 6f  v, OP_Close, iSo
13c60 72 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rter);.}../*.** 
13c70 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64  Create a new ind
13c80 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61  ex for an SQL ta
13c90 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61  ble.  pName1.pNa
13ca0 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20  me2 is the name 
13cb0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a  of the index .**
13cc0 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73   and pTblList is
13cd0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
13ce0 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
13cf0 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42  o be indexed.  B
13d00 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20  oth will .** be 
13d10 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61  NULL for a prima
13d20 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64  ry key or an ind
13d30 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74  ex that is creat
13d40 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a  ed to satisfy a.
13d50 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  ** UNIQUE constr
13d60 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65  aint.  If pTable
13d70 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20   and pIndex are 
13d80 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65  NULL, use pParse
13d90 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61  ->pNewTable.** a
13da0 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  s the table to b
13db0 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72  e indexed.  pPar
13dc0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73  se->pNewTable is
13dd0 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73   a table that is
13de0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65  .** currently be
13df0 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ing constructed 
13e00 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  by a CREATE TABL
13e10 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
13e20 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  ** pList is a li
13e30 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
13e40 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c   be indexed.  pL
13e50 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ist will be NULL
13e60 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61   if this.** is a
13e70 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
13e80 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e  unique-constrain
13e90 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  t on the most re
13ea0 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  cent column adde
13eb0 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c  d.** to the tabl
13ec0 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
13ed0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
13ee0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69   .**.** If the i
13ef0 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20  ndex is created 
13f00 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 72 65  successfully, re
13f10 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
13f20 6f 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 0a  o the new Index.
13f30 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 54 68  ** structure. Th
13f40 69 73 20 69 73 20 75 73 65 64 20 62 79 20 73 71  is is used by sq
13f50 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b  lite3AddPrimaryK
13f60 65 79 28 29 20 74 6f 20 6d 61 72 6b 20 74 68 65  ey() to mark the
13f70 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 74 68 65   index.** as the
13f80 20 74 61 62 6c 65 73 20 70 72 69 6d 61 72 79 20   tables primary 
13f90 6b 65 79 20 28 49 6e 64 65 78 2e 61 75 74 6f 49  key (Index.autoI
13fa0 6e 64 65 78 3d 3d 32 29 2e 0a 2a 2f 0a 49 6e 64  ndex==2)..*/.Ind
13fb0 65 78 20 2a 73 71 6c 69 74 65 33 43 72 65 61 74  ex *sqlite3Creat
13fc0 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  eIndex(.  Parse 
13fd0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
13fe0 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  All information 
13ff0 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65  about this parse
14000 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
14010 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69 72 73  me1,     /* Firs
14020 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20  t part of index 
14030 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c  name. May be NUL
14040 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  L */.  Token *pN
14050 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53 65 63  ame2,     /* Sec
14060 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65  ond part of inde
14070 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
14080 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ULL */.  SrcList
14090 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54   *pTblName, /* T
140a0 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55  able to index. U
140b0 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
140c0 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45  able if 0 */.  E
140d0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
140e0 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63    /* A list of c
140f0 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
14100 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
14110 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20  Error,       /* 
14120 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e  OE_Abort, OE_Ign
14130 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c  ore, OE_Replace,
14140 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20   or OE_None */. 
14150 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20   Token *pStart, 
14160 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54      /* The CREAT
14170 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
14180 69 6e 73 20 74 68 69 73 20 73 74 61 74 65 6d 65  ins this stateme
14190 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nt */.  Token *p
141a0 45 6e 64 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  End,       /* Th
141b0 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65  e ")" that close
141c0 73 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44  s the CREATE IND
141d0 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EX statement */.
141e0 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c    int sortOrder,
141f0 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64       /* Sort ord
14200 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65  er of primary ke
14210 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55  y when pList==NU
14220 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f  LL */.  int ifNo
14230 74 45 78 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d  tExist     /* Om
14240 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65  it error if inde
14250 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
14260 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
14270 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a  pRet = 0;     /*
14280 20 50 6f 69 6e 74 65 72 20 74 6f 20 72 65 74 75   Pointer to retu
14290 72 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  rn */.  Table *p
142a0 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Tab = 0;     /* 
142b0 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  Table to be inde
142c0 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  xed */.  Index *
142d0 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a  pIndex = 0;   /*
142e0 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
142f0 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68   created */.  ch
14300 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20  ar *zName = 0;  
14310 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
14320 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  e index */.  int
14330 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
14340 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
14350 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61  haracters in zNa
14360 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  me */.  int i, j
14370 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64  ;.  Token nullId
14380 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65  ;        /* Fake
14390 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d   token for an em
143a0 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20  pty ID list */. 
143b0 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20   DbFixer sFix;  
143c0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73        /* For ass
143d0 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20  igning database 
143e0 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20  names to pTable 
143f0 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
14400 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74  erMask;   /* 1 t
14410 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20  o honor DESC in 
14420 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e  index.  0 to ign
14430 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ore. */.  sqlite
14440 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
14450 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20  db;.  Db *pDb;  
14460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
14470 65 20 73 70 65 63 69 66 69 63 20 74 61 62 6c 65  e specific table
14480 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
14490 69 6e 64 65 78 65 64 20 64 61 74 61 62 61 73 65  indexed database
144a0 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
144b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
144c0 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
144d0 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e  ase that is bein
144e0 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54  g written */.  T
144f0 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b  oken *pName = 0;
14500 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
14510 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  ed name of the i
14520 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a  ndex to create *
14530 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  /.  struct ExprL
14540 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49  ist_item *pListI
14550 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  tem; /* For loop
14560 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a  ing over pList *
14570 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20  /.  int nCol;.  
14580 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a  int nExtra = 0;.
14590 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a    char *zExtra;.
145a0 0a 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72  .  assert( pStar
145b0 74 3d 3d 30 20 7c 7c 20 70 45 6e 64 21 3d 30 20  t==0 || pEnd!=0 
145c0 29 3b 20 2f 2a 20 70 45 6e 64 20 6d 75 73 74 20  ); /* pEnd must 
145d0 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 70  be non-NULL if p
145e0 53 74 61 72 74 20 69 73 20 2a 2f 0a 20 20 61 73  Start is */.  as
145f0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
14600 72 72 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  rr==0 );      /*
14610 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69   Never called wi
14620 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20  th prior errors 
14630 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  */.  if( db->mal
14640 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49 4e 5f  locFailed || IN_
14650 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a  DECLARE_VTAB ){.
14660 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
14670 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
14680 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
14690 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
146a0 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
146b0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
146c0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20  te_index;.  }.. 
146d0 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
146e0 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
146f0 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
14700 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20  Return early if 
14710 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a  not found..  */.
14720 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d    if( pTblName!=
14730 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65  0 ){..    /* Use
14740 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e   the two-part in
14750 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65  dex name to dete
14760 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62 61  rmine the databa
14770 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65  se .    ** to se
14780 61 72 63 68 20 66 6f 72 20 74 68 65 20 74 61 62  arch for the tab
14790 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20 74 61  le. 'Fix' the ta
147a0 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73  ble name to this
147b0 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72   db.    ** befor
147c0 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65  e looking up the
147d0 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20   table..    */. 
147e0 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
147f0 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20  1 && pName2 );. 
14800 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
14810 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
14820 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
14830 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20  e2, &pName);.   
14840 20 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74   if( iDb<0 ) got
14850 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
14860 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dex;.    assert(
14870 20 70 4e 61 6d 65 20 26 26 20 70 4e 61 6d 65 2d   pName && pName-
14880 3e 7a 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  >z );..#ifndef S
14890 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44  QLITE_OMIT_TEMPD
148a0 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  B.    /* If the 
148b0 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75  index name was u
148c0 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63  nqualified, chec
148d0 6b 20 69 66 20 74 68 65 20 74 68 65 20 74 61 62  k if the the tab
148e0 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74  le.    ** is a t
148f0 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f  emp table. If so
14900 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
14910 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20  se to 1. Do not 
14920 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  do this.    ** i
14930 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67 20 61  f initialising a
14940 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
14950 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
14960 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
14970 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  ){.      pTab = 
14980 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f  sqlite3SrcListLo
14990 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 62  okup(pParse, pTb
149a0 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  lName);.      if
149b0 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26  ( pName2->n==0 &
149c0 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e  & pTab && pTab->
149d0 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62  pSchema==db->aDb
149e0 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20  [1].pSchema ){. 
149f0 20 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a         iDb = 1;.
14a00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
14a10 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20 73 71  ndif..    if( sq
14a20 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46  lite3FixInit(&sF
14a30 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c  ix, pParse, iDb,
14a40 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29   "index", pName)
14a50 20 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c 69   &&.        sqli
14a60 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73  te3FixSrcList(&s
14a70 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20  Fix, pTblName). 
14a80 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42     ){.      /* B
14a90 65 63 61 75 73 65 20 74 68 65 20 70 61 72 73 65  ecause the parse
14aa0 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62  r constructs pTb
14ab0 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e  lName from a sin
14ac0 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a  gle identifier,.
14ad0 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
14ae0 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e  FixSrcList can n
14af0 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20  ever fail. */.  
14b00 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20      assert(0);. 
14b10 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20     }.    pTab = 
14b20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
14b30 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54  le(pParse, 0, pT
14b40 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61  blName->a[0].zNa
14b50 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70 54 62  me, .        pTb
14b60 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  lName->a[0].zDat
14b70 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20  abase);.    if( 
14b80 21 70 54 61 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c  !pTab || db->mal
14b90 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
14ba0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
14bb0 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
14bc0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
14bd0 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
14be0 65 6d 61 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ema );.  }else{.
14bf0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
14c00 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
14c10 72 74 28 20 70 53 74 61 72 74 3d 3d 30 20 29 3b  rt( pStart==0 );
14c20 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50 61 72  .    pTab = pPar
14c30 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
14c40 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67     if( !pTab ) g
14c50 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
14c60 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20 3d  index;.    iDb =
14c70 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
14c80 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
14c90 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20  pSchema);.  }.  
14ca0 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
14cb0 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Db];..  assert( 
14cc0 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  pTab!=0 );.  ass
14cd0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
14ce0 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71  r==0 );.  if( sq
14cf0 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54  lite3StrNICmp(pT
14d00 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ab->zName, "sqli
14d10 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20  te_", 7)==0 .   
14d20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 26 70      && memcmp(&p
14d30 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 61  Tab->zName[7],"a
14d40 6c 74 65 72 74 61 62 5f 22 2c 39 29 21 3d 30 20  ltertab_",9)!=0 
14d50 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
14d60 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
14d70 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
14d80 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54   be indexed", pT
14d90 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
14da0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
14db0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e  _index;.  }.#ifn
14dc0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14dd0 56 49 45 57 0a 20 20 69 66 28 20 70 54 61 62 2d  VIEW.  if( pTab-
14de0 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
14df0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
14e00 70 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d  pParse, "views m
14e10 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
14e20 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d");.    goto ex
14e30 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
14e40 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e  .  }.#endif.#ifn
14e50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14e60 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
14e70 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
14e80 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
14e90 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14ea0 2c 20 22 76 69 72 74 75 61 6c 20 74 61 62 6c 65  , "virtual table
14eb0 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
14ec0 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f  exed");.    goto
14ed0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
14ee0 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ex;.  }.#endif..
14ef0 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
14f00 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
14f10 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65  ndex.  Make sure
14f20 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c   there is not al
14f30 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20  ready another.  
14f40 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
14f50 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
14f60 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  name.  .  **.  *
14f70 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66  * Exception:  If
14f80 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
14f90 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72  the names of per
14fa0 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66  manent indices f
14fb0 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  rom the.  ** sql
14fc0 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
14fd0 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f   (because some o
14fe0 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61  ther process cha
14ff0 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29  nged the schema)
15000 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66   and.  ** one of
15010 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73   the index names
15020 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74   collides with t
15030 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d  he name of a tem
15040 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a  porary table or.
15050 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e    ** index, then
15060 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
15070 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69  e to process thi
15080 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20  s index..  **.  
15090 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69  ** If pName==0 i
150a0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
150b0 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67  are.  ** dealing
150c0 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20   with a primary 
150d0 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f  key or UNIQUE co
150e0 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61  nstraint.  We ha
150f0 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72  ve to invent our
15100 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a  .  ** own name..
15110 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65    */.  if( pName
15120 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
15130 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
15140 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
15150 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  .    if( zName==
15160 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
15170 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
15180 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 7a  assert( pName->z
15190 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 53  !=0 );.    if( S
151a0 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
151b0 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65  3CheckObjectName
151c0 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20  (pParse, zName) 
151d0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
151e0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
151f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
15200 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
15210 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
15220 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
15230 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a  zName, 0)!=0 ){.
15240 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
15250 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
15260 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
15270 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  y a table named 
15280 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
15290 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
152a0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
152b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
152c0 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  f( sqlite3FindIn
152d0 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70  dex(db, zName, p
152e0 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  Db->zName)!=0 ){
152f0 0a 20 20 20 20 20 20 69 66 28 20 21 69 66 4e 6f  .      if( !ifNo
15300 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20  tExist ){.      
15310 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
15320 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78  g(pParse, "index
15330 20 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73   %s already exis
15340 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ts", zName);.   
15350 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15360 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69    assert( !db->i
15370 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20  nit.busy );.    
15380 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
15390 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
153a0 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
153b0 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  }.      goto exi
153c0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
153d0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
153e0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e     int n;.    In
153f0 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20  dex *pLoop;.    
15400 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e  for(pLoop=pTab->
15410 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f  pIndex, n=1; pLo
15420 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
15430 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20  >pNext, n++){}. 
15440 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
15450 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73  e3MPrintf(db, "s
15460 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
15470 25 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  %s_%d", pTab->zN
15480 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28  ame, n);.    if(
15490 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
154a0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
154b0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
154c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
154d0 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69   for authorizati
154e0 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  on to create an 
154f0 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e  index..  */.#ifn
15500 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15510 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
15520 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
15530 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61   *zDb = pDb->zNa
15540 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
15550 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
15560 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
15570 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
15580 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29  (iDb), 0, zDb) )
15590 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
155a0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
155b0 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51      }.    i = SQ
155c0 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45  LITE_CREATE_INDE
155d0 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54  X;.    if( !OMIT
155e0 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
155f0 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43  1 ) i = SQLITE_C
15600 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
15610 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
15620 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
15630 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61  e, i, zName, pTa
15640 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
15650 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
15660 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
15670 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
15680 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d  ..  /* If pList=
15690 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69  =0, it means thi
156a0 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
156b0 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70  lled to make a p
156c0 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20  rimary.  ** key 
156d0 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20  out of the last 
156e0 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20  column added to 
156f0 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20  the table under 
15700 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20  construction..  
15710 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66  ** So create a f
15720 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75  ake list to simu
15730 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a  late this..  */.
15740 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
15750 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d  {.    nullId.z =
15760 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62   pTab->aCol[pTab
15770 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b  ->nCol-1].zName;
15780 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20  .    nullId.n = 
15790 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
157a0 28 63 68 61 72 2a 29 6e 75 6c 6c 49 64 2e 7a 29  (char*)nullId.z)
157b0 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  ;.    pList = sq
157c0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
157d0 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30  end(pParse, 0, 0
157e0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
157f0 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
15800 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
15810 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
15820 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  tSetName(pParse,
15830 20 70 4c 69 73 74 2c 20 26 6e 75 6c 6c 49 64 2c   pList, &nullId,
15840 20 30 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e   0);.    pList->
15850 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  a[0].sortOrder =
15860 20 28 75 38 29 73 6f 72 74 4f 72 64 65 72 3b 0a   (u8)sortOrder;.
15870 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65    }..  /* Figure
15880 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79   out how many by
15890 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 72 65  tes of space are
158a0 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
158b0 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20  re explicitly.  
158c0 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c  ** specified col
158d0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
158e0 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  names..  */.  fo
158f0 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
15900 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
15910 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
15920 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
15930 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 20  ;.    if( pExpr 
15940 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
15950 20 2a 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d   *pColl = pExpr-
15960 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 2f 2a  >pColl;.      /*
15970 20 45 69 74 68 65 72 20 70 43 6f 6c 6c 21 3d 30   Either pColl!=0
15980 20 6f 72 20 74 68 65 72 65 20 77 61 73 20 61 6e   or there was an
15990 20 4f 4f 4d 20 66 61 69 6c 75 72 65 2e 20 20 42   OOM failure.  B
159a0 75 74 20 69 66 20 61 6e 20 4f 4f 4d 0a 20 20 20  ut if an OOM.   
159b0 20 20 20 2a 2a 20 66 61 69 6c 75 72 65 20 77 65     ** failure we
159c0 20 68 61 76 65 20 71 75 69 74 20 62 65 66 6f 72   have quit befor
159d0 65 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20  e reaching this 
159e0 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  point. */.      
159f0 69 66 28 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c  if( ALWAYS(pColl
15a00 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 78  ) ){.        nEx
15a10 74 72 61 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69  tra += (1 + sqli
15a20 74 65 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c  te3Strlen30(pCol
15a30 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  l->zName));.    
15a40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
15a50 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61   /* .  ** Alloca
15a60 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72  te the index str
15a70 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20  ucture. .  */.  
15a80 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
15a90 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
15aa0 20 20 6e 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e    nCol = pList->
15ab0 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 20  nExpr;.  pIndex 
15ac0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
15ad0 63 5a 65 72 6f 28 64 62 2c 20 0a 20 20 20 20 20  cZero(db, .     
15ae0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 49   ROUND8(sizeof(I
15af0 6e 64 65 78 29 29 20 2b 20 20 20 20 20 20 20 20  ndex)) +        
15b00 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73        /* Index s
15b10 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20 20 20  tructure  */.   
15b20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66     ROUND8(sizeof
15b30 28 74 52 6f 77 63 6e 74 29 2a 28 6e 43 6f 6c 2b  (tRowcnt)*(nCol+
15b40 31 29 29 20 2b 20 20 20 2f 2a 20 49 6e 64 65 78  1)) +   /* Index
15b50 2e 61 69 52 6f 77 45 73 74 20 20 20 2a 2f 0a 20  .aiRowEst   */. 
15b60 20 20 20 20 20 73 69 7a 65 6f 66 28 63 68 61 72       sizeof(char
15b70 20 2a 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20   *)*nCol +      
15b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
15b90 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f  ex.azColl     */
15ba0 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e  .      sizeof(in
15bb0 74 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20  t)*nCol +       
15bc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
15bd0 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20  ndex.aiColumn   
15be0 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
15bf0 75 38 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20  u8)*nCol +      
15c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15c10 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65   Index.aSortOrde
15c20 72 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 61 6d 65  r */.      nName
15c30 20 2b 20 31 20 2b 20 20 20 20 20 20 20 20 20 20   + 1 +          
15c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c50 2f 2a 20 49 6e 64 65 78 2e 7a 4e 61 6d 65 20 20  /* Index.zName  
15c60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6e 45 78      */.      nEx
15c70 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20 20  tra             
15c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c90 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73    /* Collation s
15ca0 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 20 2a 2f  equence names */
15cb0 0a 20 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  .  );.  if( db->
15cc0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
15cd0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
15ce0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
15cf0 20 20 7a 45 78 74 72 61 20 3d 20 28 63 68 61 72    zExtra = (char
15d00 2a 29 70 49 6e 64 65 78 3b 0a 20 20 70 49 6e 64  *)pIndex;.  pInd
15d10 65 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d 20 28  ex->aiRowEst = (
15d20 74 52 6f 77 63 6e 74 2a 29 26 7a 45 78 74 72 61  tRowcnt*)&zExtra
15d30 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 49  [ROUND8(sizeof(I
15d40 6e 64 65 78 29 29 5d 3b 0a 20 20 70 49 6e 64 65  ndex))];.  pInde
15d50 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61  x->azColl = (cha
15d60 72 2a 2a 29 0a 20 20 20 20 20 28 28 63 68 61 72  r**).     ((char
15d70 2a 29 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45  *)pIndex->aiRowE
15d80 73 74 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65  st + ROUND8(size
15d90 6f 66 28 74 52 6f 77 63 6e 74 29 2a 6e 43 6f 6c  of(tRowcnt)*nCol
15da0 2b 31 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  +1));.  assert( 
15db0 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
15dc0 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 69 52  MENT(pIndex->aiR
15dd0 6f 77 45 73 74 29 20 29 3b 0a 20 20 61 73 73 65  owEst) );.  asse
15de0 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
15df0 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d  LIGNMENT(pIndex-
15e00 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20 20 70 49  >azColl) );.  pI
15e10 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d  ndex->aiColumn =
15e20 20 28 69 6e 74 20 2a 29 28 26 70 49 6e 64 65 78   (int *)(&pIndex
15e30 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b  ->azColl[nCol]);
15e40 0a 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74  .  pIndex->aSort
15e50 4f 72 64 65 72 20 3d 20 28 75 38 20 2a 29 28 26  Order = (u8 *)(&
15e60 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
15e70 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65  [nCol]);.  pInde
15e80 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  x->zName = (char
15e90 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 53 6f   *)(&pIndex->aSo
15ea0 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 29 3b 0a  rtOrder[nCol]);.
15eb0 20 20 7a 45 78 74 72 61 20 3d 20 28 63 68 61 72    zExtra = (char
15ec0 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 7a 4e 61   *)(&pIndex->zNa
15ed0 6d 65 5b 6e 4e 61 6d 65 2b 31 5d 29 3b 0a 20 20  me[nName+1]);.  
15ee0 6d 65 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a  memcpy(pIndex->z
15ef0 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Name, zName, nNa
15f00 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78 2d  me+1);.  pIndex-
15f10 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a  >pTable = pTab;.
15f20 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d    pIndex->nColum
15f30 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  n = pList->nExpr
15f40 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ;.  pIndex->onEr
15f50 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f  ror = (u8)onErro
15f60 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74  r;.  pIndex->aut
15f70 6f 49 6e 64 65 78 20 3d 20 28 75 38 29 28 70 4e  oIndex = (u8)(pN
15f80 61 6d 65 3d 3d 30 29 3b 0a 20 20 70 49 6e 64 65  ame==0);.  pInde
15f90 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  x->pSchema = db-
15fa0 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
15fb0 61 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  a;.  assert( sql
15fc0 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
15fd0 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
15fe0 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
15ff0 6f 20 73 65 65 20 69 66 20 77 65 20 73 68 6f 75  o see if we shou
16000 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65  ld honor DESC re
16010 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20  quests on index 
16020 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69  columns.  */.  i
16030 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  f( pDb->pSchema-
16040 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20  >file_format>=4 
16050 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72  ){.    sortOrder
16060 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20  Mask = -1;   /* 
16070 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20  Honor DESC */.  
16080 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f  }else{.    sortO
16090 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20  rderMask = 0;   
160a0 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20   /* Ignore DESC 
160b0 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61  */.  }..  /* Sca
160c0 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  n the names of t
160d0 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
160e0 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
160f0 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c  dexed and.  ** l
16100 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  oad the column i
16110 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20  ndices into the 
16120 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  Index structure.
16130 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f    Report an erro
16140 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f  r.  ** if any co
16150 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e  lumn is not foun
16160 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44  d..  **.  ** TOD
16170 4f 3a 20 20 41 64 64 20 61 20 74 65 73 74 20 74  O:  Add a test t
16180 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
16190 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e   the same column
161a0 20 69 73 20 6e 6f 74 20 6e 61 6d 65 64 0a 20 20   is not named.  
161b0 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63  ** more than onc
161c0 65 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  e within the sam
161d0 65 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74  e index.  Only t
161e0 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63  he first instanc
161f0 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f  e of.  ** the co
16200 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65 72 20 62  lumn will ever b
16210 65 20 75 73 65 64 20 62 79 20 74 68 65 20 6f 70  e used by the op
16220 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74 65 20 74  timizer.  Note t
16230 68 61 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20  hat using the.  
16240 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 6d  ** same column m
16250 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 63 61  ore than once ca
16260 6e 6e 6f 74 20 62 65 20 61 6e 20 65 72 72 6f 72  nnot be an error
16270 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
16280 75 6c 64 20 0a 20 20 2a 2a 20 62 72 65 61 6b 20  uld .  ** break 
16290 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
162a0 69 62 69 6c 69 74 79 20 2d 20 69 74 20 6e 65 65  ibility - it nee
162b0 64 73 20 74 6f 20 62 65 20 61 20 77 61 72 6e 69  ds to be a warni
162c0 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ng..  */.  for(i
162d0 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c  =0, pListItem=pL
162e0 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d  ist->a; i<pList-
162f0 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69  >nExpr; i++, pLi
16300 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 63  stItem++){.    c
16310 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 4e  onst char *zColN
16320 61 6d 65 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d  ame = pListItem-
16330 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c 75  >zName;.    Colu
16340 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 20  mn *pTabCol;.   
16350 20 69 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f   int requestedSo
16360 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 63 68 61  rtOrder;.    cha
16370 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20  r *zColl;       
16380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
16390 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
163a0 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 66  e name */..    f
163b0 6f 72 28 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d  or(j=0, pTabCol=
163c0 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54  pTab->aCol; j<pT
163d0 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70  ab->nCol; j++, p
163e0 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  TabCol++){.     
163f0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
16400 43 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54  Cmp(zColName, pT
16410 61 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30  abCol->zName)==0
16420 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
16430 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d      if( j>=pTab-
16440 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  >nCol ){.      s
16450 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
16460 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
16470 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e   has no column n
16480 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20  amed %s",.      
16490 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a    pTab->zName, z
164a0 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ColName);.      
164b0 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
164c0 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 67  ema = 1;.      g
164d0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
164e0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
164f0 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
16500 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 2f 2a  n[i] = j;.    /*
16510 20 4a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 6f   Justification o
16520 66 20 74 68 65 20 41 4c 57 41 59 53 28 70 4c 69  f the ALWAYS(pLi
16530 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70  stItem->pExpr->p
16540 43 6f 6c 6c 29 3a 20 20 42 65 63 61 75 73 65 20  Coll):  Because 
16550 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 77 61  of.    ** the wa
16560 79 20 74 68 65 20 22 69 64 78 6c 69 73 74 22 20  y the "idxlist" 
16570 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 69 73 20  non-terminal is 
16580 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74  constructed by t
16590 68 65 20 70 61 72 73 65 72 2c 0a 20 20 20 20 2a  he parser,.    *
165a0 2a 20 69 66 20 70 4c 69 73 74 49 74 65 6d 2d 3e  * if pListItem->
165b0 70 45 78 70 72 20 69 73 20 6e 6f 74 20 6e 75 6c  pExpr is not nul
165c0 6c 20 74 68 65 6e 20 65 69 74 68 65 72 20 70 4c  l then either pL
165d0 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  istItem->pExpr->
165e0 70 43 6f 6c 6c 0a 20 20 20 20 2a 2a 20 6d 75 73  pColl.    ** mus
165f0 74 20 65 78 69 73 74 20 6f 72 20 65 6c 73 65 20  t exist or else 
16600 74 68 65 72 65 20 6d 75 73 74 20 68 61 76 65 20  there must have 
16610 62 65 65 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  been an OOM erro
16620 72 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65  r.  But if there
16630 0a 20 20 20 20 2a 2a 20 77 61 73 20 61 6e 20 4f  .    ** was an O
16640 4f 4d 20 65 72 72 6f 72 2c 20 77 65 20 77 6f 75  OM error, we wou
16650 6c 64 20 6e 65 76 65 72 20 72 65 61 63 68 20 74  ld never reach t
16660 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20  his point. */.  
16670 20 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d    if( pListItem-
16680 3e 70 45 78 70 72 20 26 26 20 41 4c 57 41 59 53  >pExpr && ALWAYS
16690 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70  (pListItem->pExp
166a0 72 2d 3e 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  r->pColl) ){.   
166b0 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20     int nColl;.  
166c0 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73      zColl = pLis
166d0 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43  tItem->pExpr->pC
166e0 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  oll->zName;.    
166f0 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    nColl = sqlite
16700 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29  3Strlen30(zColl)
16710 20 2b 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65   + 1;.      asse
16720 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c  rt( nExtra>=nCol
16730 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  l );.      memcp
16740 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c  y(zExtra, zColl,
16750 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7a   nColl);.      z
16760 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20  Coll = zExtra;. 
16770 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e       zExtra += n
16780 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78 74  Coll;.      nExt
16790 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20  ra -= nColl;.   
167a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43   }else{.      zC
167b0 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  oll = pTab->aCol
167c0 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [j].zColl;.     
167d0 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 7b 0a 20   if( !zColl ){. 
167e0 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 64         zColl = d
167f0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 2d 3e 7a 4e  b->pDfltColl->zN
16800 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
16810 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e   }.    if( !db->
16820 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21 73 71  init.busy && !sq
16830 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
16840 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c  eq(pParse, zColl
16850 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
16860 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
16870 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  x;.    }.    pIn
16880 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d  dex->azColl[i] =
16890 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75   zColl;.    requ
168a0 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 20 3d  estedSortOrder =
168b0 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74   pListItem->sort
168c0 4f 72 64 65 72 20 26 20 73 6f 72 74 4f 72 64 65  Order & sortOrde
168d0 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65  rMask;.    pInde
168e0 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
168f0 20 3d 20 28 75 38 29 72 65 71 75 65 73 74 65 64   = (u8)requested
16900 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 20  SortOrder;.  }. 
16910 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52   sqlite3DefaultR
16920 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 0a  owEst(pIndex);..
16930 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72    if( pTab==pPar
16940 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b  se->pNewTable ){
16950 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  .    /* This rou
16960 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61  tine has been ca
16970 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
16980 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
16990 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65  x as a.    ** re
169a0 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52  sult of a PRIMAR
169b0 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
169c0 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75  clause on a colu
169d0 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f  mn definition, o
169e0 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41  r.    ** a PRIMA
169f0 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
16a00 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e   clause followin
16a10 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66  g the column def
16a20 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  initions..    **
16a30 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20   i.e. one of:.  
16a40 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41    **.    ** CREA
16a50 54 45 20 54 41 42 4c 45 20 74 28 78 20 50 52 49  TE TABLE t(x PRI
16a60 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20  MARY KEY, y);.  
16a70 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
16a80 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45  E t(x, y, UNIQUE
16a90 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a  (x, y));.    **.
16aa0 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61      ** Either wa
16ab0 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  y, check to see 
16ac0 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72  if the table alr
16ad0 65 61 64 79 20 68 61 73 20 73 75 63 68 20 61 6e  eady has such an
16ae0 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a   index. If.    *
16af0 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68  * so, don't both
16b00 65 72 20 63 72 65 61 74 69 6e 67 20 74 68 69 73  er creating this
16b10 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20   one. This only 
16b20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a  applies to.    *
16b30 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
16b40 63 72 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e  created indices.
16b50 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73   Users can do as
16b60 20 74 68 65 79 20 77 69 73 68 20 77 69 74 68 0a   they wish with.
16b70 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20      ** explicit 
16b80 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a  indices..    **.
16b90 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55      ** Two UNIQU
16ba0 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59  E or PRIMARY KEY
16bb0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
16bc0 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 69   considered equi
16bd0 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61  valent.    ** (a
16be0 6e 64 20 74 68 75 73 20 73 75 70 70 72 65 73 73  nd thus suppress
16bf0 69 6e 67 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  ing the second o
16c00 6e 65 29 20 65 76 65 6e 20 69 66 20 74 68 65 79  ne) even if they
16c10 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a   have different.
16c20 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65      ** sort orde
16c30 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rs..    **.    *
16c40 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
16c50 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69  ifferent collati
16c60 6e 67 20 73 65 71 75 65 6e 63 65 73 20 6f 72 20  ng sequences or 
16c70 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  if the columns o
16c80 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e  f.    ** the con
16c90 73 74 72 61 69 6e 74 20 6f 63 63 75 72 20 69 6e  straint occur in
16ca0 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72   different order
16cb0 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73  s, then the cons
16cc0 74 72 61 69 6e 74 73 20 61 72 65 0a 20 20 20 20  traints are.    
16cd0 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69  ** considered di
16ce0 73 74 69 6e 63 74 20 61 6e 64 20 62 6f 74 68 20  stinct and both 
16cf0 72 65 73 75 6c 74 20 69 6e 20 73 65 70 61 72 61  result in separa
16d00 74 65 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  te indices..    
16d10 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
16d20 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  dx;.    for(pIdx
16d30 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
16d40 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
16d50 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
16d60 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t k;.      asser
16d70 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  t( pIdx->onError
16d80 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20  !=OE_None );.   
16d90 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
16da0 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20 20  >autoIndex );.  
16db0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
16dc0 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  ex->onError!=OE_
16dd0 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20 69  None );..      i
16de0 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  f( pIdx->nColumn
16df0 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  !=pIndex->nColum
16e00 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
16e10 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
16e20 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b  Idx->nColumn; k+
16e30 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
16e40 74 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20  t char *z1;.    
16e50 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
16e60 7a 32 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z2;.        if( 
16e70 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  pIdx->aiColumn[k
16e80 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  ]!=pIndex->aiCol
16e90 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a  umn[k] ) break;.
16ea0 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 49 64          z1 = pId
16eb0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
16ec0 20 20 20 20 20 20 7a 32 20 3d 20 70 49 6e 64 65        z2 = pInde
16ed0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
16ee0 20 20 20 20 20 20 69 66 28 20 7a 31 21 3d 7a 32        if( z1!=z2
16ef0 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
16f00 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65  mp(z1, z2) ) bre
16f10 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
16f20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e    if( k==pIdx->n
16f30 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
16f40 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
16f50 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45  ror!=pIndex->onE
16f60 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rror ){.        
16f70 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72    /* This constr
16f80 61 69 6e 74 20 63 72 65 61 74 65 73 20 74 68 65  aint creates the
16f90 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61   same index as a
16fa0 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
16fb0 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
16fc0 74 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65  t specified some
16fd0 77 68 65 72 65 20 69 6e 20 74 68 65 20 43 52 45  where in the CRE
16fe0 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
16ff0 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ent..          *
17000 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e  * However the ON
17010 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
17020 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e  s are different.
17030 20 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20   If both this . 
17040 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
17050 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70  traint and the p
17060 72 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65  revious equivale
17070 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  nt constraint ha
17080 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20  ve explicit.    
17090 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46        ** ON CONF
170a0 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74 68 69  LICT clauses thi
170b0 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f  s is an error. O
170c0 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68  therwise, use th
170d0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  e.          ** e
170e0 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
170f0 69 65 64 20 62 65 68 61 76 69 6f 75 72 20 66 6f  ied behaviour fo
17100 72 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  r the index..   
17110 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
17120 20 20 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e      if( !(pIdx->
17130 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
17140 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f  ult || pIndex->o
17150 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
17160 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lt) ){.         
17170 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
17180 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
17190 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e              "con
171a0 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46  flicting ON CONF
171b0 4c 49 43 54 20 63 6c 61 75 73 65 73 20 73 70 65  LICT clauses spe
171c0 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20  cified", 0);.   
171d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
171e0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45     if( pIdx->onE
171f0 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
17200 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
17210 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20  pIdx->onError = 
17220 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b  pIndex->onError;
17230 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
17240 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
17250 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
17260 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
17270 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c     }.  }..  /* L
17280 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65  ink the new Inde
17290 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  x structure to i
172a0 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20  ts table and to 
172b0 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69  the other.  ** i
172c0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
172d0 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20  e structures. . 
172e0 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
172f0 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49  it.busy ){.    I
17300 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 61 73 73  ndex *p;.    ass
17310 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
17320 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
17330 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  0, pIndex->pSche
17340 6d 61 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73  ma) );.    p = s
17350 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
17360 28 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  (&pIndex->pSchem
17370 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20  a->idxHash, .   
17380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17390 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
173a0 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72  Name, sqlite3Str
173b0 6c 65 6e 33 30 28 70 49 6e 64 65 78 2d 3e 7a 4e  len30(pIndex->zN
173c0 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ame),.          
173d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173e0 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28  pIndex);.    if(
173f0 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65   p ){.      asse
17400 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b  rt( p==pIndex );
17410 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74    /* Malloc must
17420 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a   have failed */.
17430 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
17440 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
17450 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
17460 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
17470 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
17480 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
17490 61 6e 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70  anges;.    if( p
174a0 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20  TblName!=0 ){.  
174b0 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d      pIndex->tnum
174c0 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54   = db->init.newT
174d0 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  num;.    }.  }..
174e0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
174f0 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 74  init.busy is 0 t
17500 68 65 6e 20 63 72 65 61 74 65 20 74 68 65 20 69  hen create the i
17510 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54  ndex on disk.  T
17520 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65  his.  ** involve
17530 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e  s writing the in
17540 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73  dex into the mas
17550 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69  ter table and fi
17560 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a  lling in the.  *
17570 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65  * index with the
17580 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63   current table c
17590 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20  ontents..  **.  
175a0 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e  ** The db->init.
175b0 62 75 73 79 20 69 73 20 30 20 77 68 65 6e 20 74  busy is 0 when t
175c0 68 65 20 75 73 65 72 20 66 69 72 73 74 20 65 6e  he user first en
175d0 74 65 72 73 20 61 20 43 52 45 41 54 45 20 49 4e  ters a CREATE IN
175e0 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e  DEX .  ** comman
175f0 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  d.  db->init.bus
17600 79 20 69 73 20 31 20 77 68 65 6e 20 61 20 64 61  y is 1 when a da
17610 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
17620 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54   and .  ** CREAT
17630 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
17640 74 73 20 61 72 65 20 72 65 61 64 20 6f 75 74 20  ts are read out 
17650 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  of the master ta
17660 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68  ble.  In.  ** th
17670 65 20 6c 61 74 74 65 72 20 63 61 73 65 20 74 68  e latter case th
17680 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
17690 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20  exists on disk, 
176a0 77 68 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a  which is why.  *
176b0 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20  * we don't want 
176c0 74 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a  to recreate it..
176d0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62    **.  ** If pTb
176e0 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e  lName==0 it mean
176f0 73 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  s this index is 
17700 67 65 6e 65 72 61 74 65 64 20 61 73 20 61 20 70  generated as a p
17710 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20  rimary key.  ** 
17720 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
17730 61 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45  aint of a CREATE
17740 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
17750 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62  .  Since the tab
17760 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74  le.  ** has just
17770 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69   been created, i
17780 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61  t contains no da
17790 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ta and the index
177a0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
177b0 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65    ** step can be
177c0 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20   skipped..  */. 
177d0 20 65 6c 73 65 7b 20 2f 2a 20 69 66 28 20 64 62   else{ /* if( db
177e0 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
177f0 20 2a 2f 0a 20 20 20 20 56 64 62 65 20 2a 76 3b   */.    Vdbe *v;
17800 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  .    char *zStmt
17810 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d  ;.    int iMem =
17820 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
17830 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ..    v = sqlite
17840 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
17850 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
17860 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
17870 65 5f 69 6e 64 65 78 3b 0a 0a 0a 20 20 20 20 2f  e_index;...    /
17880 2a 20 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f  * Create the roo
17890 74 70 61 67 65 20 66 6f 72 20 74 68 65 20 69 6e  tpage for the in
178a0 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  dex.    */.    s
178b0 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
178c0 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
178d0 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 1, iDb);.    s
178e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
178f0 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64  (v, OP_CreateInd
17900 65 78 2c 20 69 44 62 2c 20 69 4d 65 6d 29 3b 0a  ex, iDb, iMem);.
17910 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74  .    /* Gather t
17920 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
17930 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 49   of the CREATE I
17940 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69  NDEX statement i
17950 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a  nto.    ** the z
17960 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20  Stmt variable.  
17970 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74    */.    if( pSt
17980 61 72 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  art ){.      ass
17990 65 72 74 28 20 70 45 6e 64 21 3d 30 20 29 3b 0a  ert( pEnd!=0 );.
179a0 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64        /* A named
179b0 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65   index with an e
179c0 78 70 6c 69 63 69 74 20 43 52 45 41 54 45 20 49  xplicit CREATE I
179d0 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
179e0 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  /.      zStmt = 
179f0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
17a00 62 2c 20 22 43 52 45 41 54 45 25 73 20 49 4e 44  b, "CREATE%s IND
17a10 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20  EX %.*s",.      
17a20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f    onError==OE_No
17a30 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51  ne ? "" : " UNIQ
17a40 55 45 22 2c 0a 20 20 20 20 20 20 20 20 28 69 6e  UE",.        (in
17a50 74 29 28 70 45 6e 64 2d 3e 7a 20 2d 20 70 4e 61  t)(pEnd->z - pNa
17a60 6d 65 2d 3e 7a 29 20 2b 20 31 2c 0a 20 20 20 20  me->z) + 1,.    
17a70 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20      pName->z);. 
17a80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17a90 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63 20  /* An automatic 
17aa0 69 6e 64 65 78 20 63 72 65 61 74 65 64 20 62 79  index created by
17ab0 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
17ac0 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
17ad0 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  int */.      /* 
17ae0 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
17af0 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20  Printf(""); */. 
17b00 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a       zStmt = 0;.
17b10 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
17b20 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71  d an entry in sq
17b30 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20  lite_master for 
17b40 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20 2a  this index.    *
17b50 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  /.    sqlite3Nes
17b60 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
17b70 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45 52   .        "INSER
17b80 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c  T INTO %Q.%s VAL
17b90 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25  UES('index',%Q,%
17ba0 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20  Q,#%d,%Q);",.   
17bb0 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
17bc0 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ].zName, SCHEMA_
17bd0 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20  TABLE(iDb),.    
17be0 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
17bf0 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  e,.        pTab-
17c00 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
17c10 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a 53  iMem,.        zS
17c20 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  tmt.    );.    s
17c30 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
17c40 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a   zStmt);..    /*
17c50 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20   Fill the index 
17c60 77 69 74 68 20 64 61 74 61 20 61 6e 64 20 72 65  with data and re
17c70 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61  parse the schema
17c80 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70  . Code an OP_Exp
17c90 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e  ire.    ** to in
17ca0 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65  validate all pre
17cb0 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  -compiled statem
17cc0 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ents..    */.   
17cd0 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b   if( pTblName ){
17ce0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
17cf0 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
17d00 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b  , pIndex, iMem);
17d10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68  .      sqlite3Ch
17d20 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
17d30 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  e, iDb);.      s
17d40 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72  qlite3VdbeAddPar
17d50 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44  seSchemaOp(v, iD
17d60 62 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  b,.         sqli
17d70 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
17d80 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79  name='%q' AND ty
17d90 70 65 3d 27 69 6e 64 65 78 27 22 2c 20 70 49 6e  pe='index'", pIn
17da0 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  dex->zName));.  
17db0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17dc0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 78 70 69  ddOp1(v, OP_Expi
17dd0 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  re, 0);.    }.  
17de0 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64  }..  /* When add
17df0 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ing an index to 
17e00 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69  the list of indi
17e10 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c  ces for a table,
17e20 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20   make.  ** sure 
17e30 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65  all indices labe
17e40 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63  led OE_Replace c
17e50 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68  ome after all th
17e60 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a  ose labeled.  **
17e70 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69   OE_Ignore.  Thi
17e80 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66  s is necessary f
17e90 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 63  or the correct c
17ea0 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b 0a  onstraint check.
17eb0 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
17ec0 28 69 6e 20 73 71 6c 69 74 65 33 47 65 6e 65 72  (in sqlite3Gener
17ed0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65  ateConstraintChe
17ee0 63 6b 73 28 29 29 20 61 73 20 70 61 72 74 20 6f  cks()) as part o
17ef0 66 0a 20 20 2a 2a 20 55 50 44 41 54 45 20 61 6e  f.  ** UPDATE an
17f00 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  d INSERT stateme
17f10 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66  nts.  .  */.  if
17f20 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
17f30 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29  || pTblName==0 )
17f40 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f  {.    if( onErro
17f50 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c  r!=OE_Replace ||
17f60 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30   pTab->pIndex==0
17f70 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61  .         || pTa
17f80 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  b->pIndex->onErr
17f90 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b  or==OE_Replace){
17fa0 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
17fb0 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e  Next = pTab->pIn
17fc0 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  dex;.      pTab-
17fd0 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
17fe0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17ff0 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72     Index *pOther
18000 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
18010 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f  .      while( pO
18020 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70  ther->pNext && p
18030 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e  Other->pNext->on
18040 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
18050 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74  e ){.        pOt
18060 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  her = pOther->pN
18070 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
18080 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
18090 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74   = pOther->pNext
180a0 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e  ;.      pOther->
180b0 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a  pNext = pIndex;.
180c0 20 20 20 20 7d 0a 20 20 20 20 70 52 65 74 20 3d      }.    pRet =
180d0 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 49 6e   pIndex;.    pIn
180e0 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  dex = 0;.  }..  
180f0 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f  /* Clean up befo
18100 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78  re exiting */.ex
18110 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a  it_create_index:
18120 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b  .  if( pIndex ){
18130 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
18140 65 65 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 7a  ee(db, pIndex->z
18150 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 73 71 6c  ColAff);.    sql
18160 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
18170 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71  Index);.  }.  sq
18180 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
18190 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
181a0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
181b0 44 65 6c 65 74 65 28 64 62 2c 20 70 54 62 6c 4e  Delete(db, pTblN
181c0 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
181d0 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
181e0 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ;.  return pRet;
181f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74  .}../*.** Fill t
18200 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73  he Index.aiRowEs
18210 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 64  t[] array with d
18220 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69  efault informati
18230 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  on - information
18240 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77  .** to be used w
18250 68 65 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20  hen we have not 
18260 72 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20  run the ANALYZE 
18270 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61  command..**.** a
18280 69 52 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75  iRowEst[0] is su
18290 70 70 6f 73 65 20 74 6f 20 63 6f 6e 74 61 69 6e  ppose to contain
182a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
182b0 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69  lements in the i
182c0 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77  ndex..** Since w
182d0 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67  e do not know, g
182e0 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20  uess 1 million. 
182f0 20 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20   aiRowEst[1] is 
18300 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
18310 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
18320 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
18330 65 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79  e that match any
18340 20 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75   particular valu
18350 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73  e of the.** firs
18360 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
18370 69 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74  index.  aiRowEst
18380 5b 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61  [2] is an estima
18390 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
183a0 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74  .** of rows that
183b0 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69   match any parti
183c0 63 75 6c 61 72 20 63 6f 6d 62 69 6e 69 61 74 69  cular combiniati
183d0 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  on of the first 
183e0 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20  2 columns.** of 
183f0 74 68 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20  the index.  And 
18400 73 6f 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75  so forth.  It mu
18410 73 74 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  st always be the
18420 20 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20   case that.*.** 
18430 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45            aiRowE
18440 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b  st[N]<=aiRowEst[
18450 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20  N-1].**         
18460 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31    aiRowEst[N]>=1
18470 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f  .**.** Apart fro
18480 6d 20 74 68 61 74 2c 20 77 65 20 68 61 76 65 20  m that, we have 
18490 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20  little to go on 
184a0 62 65 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f  besides intuitio
184b0 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61  n as to.** how a
184c0 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64  iRowEst[] should
184d0 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
184e0 20 20 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65    The numbers ge
184f0 6e 65 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20  nerated here.** 
18500 61 72 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70  are based on typ
18510 69 63 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e  ical values foun
18520 64 20 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69  d in actual indi
18530 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ces..*/.void sql
18540 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73  ite3DefaultRowEs
18550 74 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  t(Index *pIdx){.
18560 20 20 74 52 6f 77 63 6e 74 20 2a 61 20 3d 20 70    tRowcnt *a = p
18570 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20  Idx->aiRowEst;. 
18580 20 69 6e 74 20 69 3b 0a 20 20 74 52 6f 77 63 6e   int i;.  tRowcn
18590 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 61  t n;.  assert( a
185a0 21 3d 30 20 29 3b 0a 20 20 61 5b 30 5d 20 3d 20  !=0 );.  a[0] = 
185b0 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52  pIdx->pTable->nR
185c0 6f 77 45 73 74 3b 0a 20 20 69 66 28 20 61 5b 30  owEst;.  if( a[0
185d0 5d 3c 31 30 20 29 20 61 5b 30 5d 20 3d 20 31 30  ]<10 ) a[0] = 10
185e0 3b 0a 20 20 6e 20 3d 20 31 30 3b 0a 20 20 66 6f  ;.  n = 10;.  fo
185f0 72 28 69 3d 31 3b 20 69 3c 3d 70 49 64 78 2d 3e  r(i=1; i<=pIdx->
18600 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
18610 20 20 20 61 5b 69 5d 20 3d 20 6e 3b 0a 20 20 20     a[i] = n;.   
18620 20 69 66 28 20 6e 3e 35 20 29 20 6e 2d 2d 3b 0a   if( n>5 ) n--;.
18630 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78 2d 3e    }.  if( pIdx->
18640 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
18650 20 29 7b 0a 20 20 20 20 61 5b 70 49 64 78 2d 3e   ){.    a[pIdx->
18660 6e 43 6f 6c 75 6d 6e 5d 20 3d 20 31 3b 0a 20 20  nColumn] = 1;.  
18670 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
18680 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f  routine will dro
18690 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61  p an existing na
186a0 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73  med index.  This
186b0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c   routine.** impl
186c0 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20  ements the DROP 
186d0 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e  INDEX statement.
186e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
186f0 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20  DropIndex(Parse 
18700 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
18710 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45   *pName, int ifE
18720 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65 78 20  xists){.  Index 
18730 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20  *pIndex;.  Vdbe 
18740 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
18750 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
18760 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73    int iDb;..  as
18770 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
18780 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 4e 65  rr==0 );   /* Ne
18790 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ver called with 
187a0 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a  prior errors */.
187b0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
187c0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
187d0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
187e0 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ex;.  }.  assert
187f0 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31  ( pName->nSrc==1
18800 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45   );.  if( SQLITE
18810 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
18820 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
18830 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
18840 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
18850 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
18860 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
18870 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pName->a[0].zNam
18880 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
18890 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28  Database);.  if(
188a0 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20   pIndex==0 ){.  
188b0 20 20 69 66 28 20 21 69 66 45 78 69 73 74 73 20    if( !ifExists 
188c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
188d0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
188e0 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a   "no such index:
188f0 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b   %S", pName, 0);
18900 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18910 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
18920 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70  ifyNamedSchema(p
18930 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  Parse, pName->a[
18940 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
18950 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
18960 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
18970 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
18980 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
18990 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75    if( pIndex->au
189a0 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73  toIndex ){.    s
189b0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
189c0 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73  Parse, "index as
189d0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e  sociated with UN
189e0 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72  IQUE ".      "or
189f0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
18a00 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62  straint cannot b
18a10 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a  e dropped", 0);.
18a20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
18a30 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
18a40 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
18a50 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
18a60 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b  Index->pSchema);
18a70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18a80 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
18a90 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
18aa0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
18ab0 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62  P_INDEX;.    Tab
18ac0 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
18ad0 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63  x->pTable;.    c
18ae0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
18af0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
18b00 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
18b10 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
18b20 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20  MA_TABLE(iDb);. 
18b30 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
18b40 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
18b50 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
18b60 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  Tab, 0, zDb) ){.
18b70 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
18b80 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
18b90 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  }.    if( !OMIT_
18ba0 54 45 4d 50 44 42 20 26 26 20 69 44 62 20 29 20  TEMPDB && iDb ) 
18bb0 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
18bc0 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  OP_TEMP_INDEX;. 
18bd0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
18be0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
18bf0 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  code, pIndex->zN
18c00 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
18c10 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
18c20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
18c30 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
18c40 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
18c50 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
18c60 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61  move the index a
18c70 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  nd from the mast
18c80 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20  er table */.  v 
18c90 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
18ca0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
18cb0 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
18cc0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
18cd0 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
18ce0 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
18cf0 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
18d00 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45  se,.       "DELE
18d10 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
18d20 45 52 45 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20  ERE name=%Q AND 
18d30 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20  type='index'",. 
18d40 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
18d50 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
18d60 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 49 6e  _TABLE(iDb), pIn
18d70 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29  dex->zName.    )
18d80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65  ;.    sqlite3Cle
18d90 61 72 53 74 61 74 54 61 62 6c 65 73 28 70 50 61  arStatTables(pPa
18da0 72 73 65 2c 20 69 44 62 2c 20 22 69 64 78 22 2c  rse, iDb, "idx",
18db0 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b   pIndex->zName);
18dc0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
18dd0 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
18de0 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72   iDb);.    destr
18df0 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
18e00 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c  e, pIndex->tnum,
18e10 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
18e20 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
18e30 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44  OP_DropIndex, iD
18e40 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d  b, 0, 0, pIndex-
18e50 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  >zName, 0);.  }.
18e60 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78  .exit_drop_index
18e70 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  :.  sqlite3SrcLi
18e80 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61  stDelete(db, pNa
18e90 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41  me);.}../*.** pA
18ea0 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65  rray is a pointe
18eb0 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  r to an array of
18ec0 20 6f 62 6a 65 63 74 73 2e 20 45 61 63 68 20 6f   objects. Each o
18ed0 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20  bject in the.** 
18ee0 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79  array is szEntry
18ef0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
18f00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65  This routine use
18f10 73 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  s sqlite3DbReall
18f20 6f 63 28 29 0a 2a 2a 20 74 6f 20 65 78 74 65 6e  oc().** to exten
18f30 64 20 74 68 65 20 61 72 72 61 79 20 73 6f 20 74  d the array so t
18f40 68 61 74 20 74 68 65 72 65 20 69 73 20 73 70 61  hat there is spa
18f50 63 65 20 66 6f 72 20 61 20 6e 65 77 20 6f 62 6a  ce for a new obj
18f60 65 63 74 20 61 74 20 74 68 65 20 65 6e 64 2e 0a  ect at the end..
18f70 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
18f80 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
18f90 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 63 6f 6e  ed, *pnEntry con
18fa0 74 61 69 6e 73 20 74 68 65 20 63 75 72 72 65 6e  tains the curren
18fb0 74 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65  t size of.** the
18fc0 20 61 72 72 61 79 20 28 69 6e 20 65 6e 74 72 69   array (in entri
18fd0 65 73 20 2d 20 73 6f 20 74 68 65 20 61 6c 6c 6f  es - so the allo
18fe0 63 61 74 69 6f 6e 20 69 73 20 28 28 2a 70 6e 45  cation is ((*pnE
18ff0 6e 74 72 79 29 20 2a 20 73 7a 45 6e 74 72 79 29  ntry) * szEntry)
19000 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20 74 6f 74   bytes.** in tot
19010 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
19020 65 20 72 65 61 6c 6c 6f 63 28 29 20 69 73 20 73  e realloc() is s
19030 75 63 63 65 73 73 66 75 6c 20 28 69 2e 65 2e 20  uccessful (i.e. 
19040 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74  if no OOM condit
19050 69 6f 6e 20 6f 63 63 75 72 73 29 2c 20 74 68 65  ion occurs), the
19060 0a 2a 2a 20 73 70 61 63 65 20 61 6c 6c 6f 63 61  .** space alloca
19070 74 65 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ted for the new 
19080 6f 62 6a 65 63 74 20 69 73 20 7a 65 72 6f 65 64  object is zeroed
19090 2c 20 2a 70 6e 45 6e 74 72 79 20 75 70 64 61 74  , *pnEntry updat
190a0 65 64 20 74 6f 0a 2a 2a 20 72 65 66 6c 65 63 74  ed to.** reflect
190b0 20 74 68 65 20 6e 65 77 20 73 69 7a 65 20 6f 66   the new size of
190c0 20 74 68 65 20 61 72 72 61 79 20 61 6e 64 20 61   the array and a
190d0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
190e0 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  new allocation.*
190f0 2a 20 72 65 74 75 72 6e 65 64 2e 20 2a 70 49 64  * returned. *pId
19100 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
19110 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 65 77  index of the new
19120 20 61 72 72 61 79 20 65 6e 74 72 79 20 69 6e 20   array entry in 
19130 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
19140 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
19150 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 66 61 69  he realloc() fai
19160 6c 73 2c 20 2a 70 49 64 78 20 69 73 20 73 65 74  ls, *pIdx is set
19170 20 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74 72 79   to -1, *pnEntry
19180 20 72 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e 63 68   remains.** unch
19190 61 6e 67 65 64 20 61 6e 64 20 61 20 63 6f 70 79  anged and a copy
191a0 20 6f 66 20 70 41 72 72 61 79 20 72 65 74 75 72   of pArray retur
191b0 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ned..*/.void *sq
191c0 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
191d0 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  te(.  sqlite3 *d
191e0 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65  b,      /* Conne
191f0 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20  ction to notify 
19200 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  of malloc failur
19210 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  es */.  void *pA
19220 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72  rray,     /* Arr
19230 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20  ay of objects.  
19240 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63  Might be realloc
19250 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ated */.  int sz
19260 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53  Entry,      /* S
19270 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65  ize of each obje
19280 63 74 20 69 6e 20 74 68 65 20 61 72 72 61 79 20  ct in the array 
19290 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72  */.  int *pnEntr
192a0 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  y,     /* Number
192b0 20 6f 66 20 6f 62 6a 65 63 74 73 20 63 75 72 72   of objects curr
192c0 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a  ently in use */.
192d0 20 20 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20    int *pIdx     
192e0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
192f0 20 69 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20   index of a new 
19300 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  slot here */.){.
19310 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74    char *z;.  int
19320 20 6e 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20   n = *pnEntry;. 
19330 20 69 66 28 20 28 6e 20 26 20 28 6e 2d 31 29 29   if( (n & (n-1))
19340 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  ==0 ){.    int s
19350 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f 20 31 20 3a  z = (n==0) ? 1 :
19360 20 32 2a 6e 3b 0a 20 20 20 20 76 6f 69 64 20 2a   2*n;.    void *
19370 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
19380 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72  Realloc(db, pArr
19390 61 79 2c 20 73 7a 2a 73 7a 45 6e 74 72 79 29 3b  ay, sz*szEntry);
193a0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
193b0 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64 78 20   ){.      *pIdx 
193c0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  = -1;.      retu
193d0 72 6e 20 70 41 72 72 61 79 3b 0a 20 20 20 20 7d  rn pArray;.    }
193e0 0a 20 20 20 20 70 41 72 72 61 79 20 3d 20 70 4e  .    pArray = pN
193f0 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63  ew;.  }.  z = (c
19400 68 61 72 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d  har*)pArray;.  m
19410 65 6d 73 65 74 28 26 7a 5b 6e 20 2a 20 73 7a 45  emset(&z[n * szE
19420 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72  ntry], 0, szEntr
19430 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 6e 3b  y);.  *pIdx = n;
19440 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20  .  ++*pnEntry;. 
19450 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a   return pArray;.
19460 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
19470 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
19480 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73   the given IdLis
19490 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
194a0 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65   IdList if.** ne
194b0 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ed be..**.** A n
194c0 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65 74  ew IdList is ret
194d0 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
194e0 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  f malloc() fails
194f0 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c  ..*/.IdList *sql
19500 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
19510 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64  (sqlite3 *db, Id
19520 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
19530 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69  en *pToken){.  i
19540 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
19550 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
19560 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
19570 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
19580 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20  of(IdList) );.  
19590 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
195a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
195b0 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69   pList->a = sqli
195c0 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
195d0 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20  (.      db,.    
195e0 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20    pList->a,.    
195f0 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e    sizeof(pList->
19600 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 26 70 4c  a[0]),.      &pL
19610 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20  ist->nId,.      
19620 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 3c  &i.  );.  if( i<
19630 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
19640 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
19650 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74   pList);.    ret
19660 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69  urn 0;.  }.  pLi
19670 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  st->a[i].zName =
19680 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
19690 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e  Token(db, pToken
196a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  );.  return pLis
196b0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  t;.}../*.** Dele
196c0 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f  te an IdList..*/
196d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c  .void sqlite3IdL
196e0 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  istDelete(sqlite
196f0 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
19700 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
19710 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
19720 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
19730 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
19740 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
19750 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c  te3DbFree(db, pL
19760 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
19770 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
19780 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d  bFree(db, pList-
19790 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  >a);.  sqlite3Db
197a0 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  Free(db, pList);
197b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
197c0 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c   the index in pL
197d0 69 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74  ist of the ident
197e0 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e  ifier named zId.
197f0 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69    Return -1.** i
19800 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
19810 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73  int sqlite3IdLis
19820 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70  tIndex(IdList *p
19830 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  List, const char
19840 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
19850 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
19860 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  0 ) return -1;. 
19870 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
19880 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
19890 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
198a0 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
198b0 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d  .zName, zName)==
198c0 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  0 ) return i;.  
198d0 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
198e0 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74  ../*.** Expand t
198f0 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  he space allocat
19900 65 64 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ed for the given
19910 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20   SrcList object 
19920 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e  by.** creating n
19930 45 78 74 72 61 20 6e 65 77 20 73 6c 6f 74 73 20  Extra new slots 
19940 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 69 53 74  beginning at iSt
19950 61 72 74 2e 20 20 69 53 74 61 72 74 20 69 73 20  art.  iStart is 
19960 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e  zero based..** N
19970 65 77 20 73 6c 6f 74 73 20 61 72 65 20 7a 65 72  ew slots are zer
19980 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  oed..**.** For e
19990 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65 20  xample, suppose 
199a0 61 20 53 72 63 4c 69 73 74 20 69 6e 69 74 69 61  a SrcList initia
199b0 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f  lly contains two
199c0 20 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a   entries: A,B..*
199d0 2a 20 54 6f 20 61 70 70 65 6e 64 20 33 20 6e 65  * To append 3 ne
199e0 77 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74  w entries onto t
199f0 68 65 20 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a  he end, do this:
19a00 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65  .**.**    sqlite
19a10 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
19a20 64 62 2c 20 70 53 72 63 6c 69 73 74 2c 20 33 2c  db, pSrclist, 3,
19a30 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72   2);.**.** After
19a40 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 20   the call above 
19a50 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  it would contain
19a60 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69  :  A, B, nil, ni
19a70 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68  l, nil..** If th
19a80 65 20 69 53 74 61 72 74 20 61 72 67 75 6d 65 6e  e iStart argumen
19a90 74 20 68 61 64 20 62 65 65 6e 20 31 20 69 6e 73  t had been 1 ins
19aa0 74 65 61 64 20 6f 66 20 32 2c 20 74 68 65 6e 20  tead of 2, then 
19ab0 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f  the result.** wo
19ac0 75 6c 64 20 68 61 76 65 20 62 65 65 6e 3a 20 20  uld have been:  
19ad0 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c  A, nil, nil, nil
19ae0 2c 20 42 2e 20 20 54 6f 20 70 72 65 70 65 6e 64  , B.  To prepend
19af0 20 74 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a   the new slots,.
19b00 2a 2a 20 74 68 65 20 69 53 74 61 72 74 20 76 61  ** the iStart va
19b10 6c 75 65 20 77 6f 75 6c 64 20 62 65 20 30 2e 20  lue would be 0. 
19b20 20 54 68 65 20 72 65 73 75 6c 74 20 74 68 65 6e   The result then
19b30 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69   would.** be: ni
19b40 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20  l, nil, nil, A, 
19b50 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  B..**.** If a me
19b60 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
19b70 66 61 69 6c 73 20 74 68 65 20 53 72 63 4c 69 73  fails the SrcLis
19b80 74 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20  t is unchanged. 
19b90 20 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c   The.** db->mall
19ba0 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 77 69  ocFailed flag wi
19bb0 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74 72 75  ll be set to tru
19bc0 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  e..*/.SrcList *s
19bd0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
19be0 61 72 67 65 28 0a 20 20 73 71 6c 69 74 65 33 20  arge(.  sqlite3 
19bf0 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61  *db,       /* Da
19c00 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
19c10 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f  n to notify of O
19c20 4f 4d 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53  OM errors */.  S
19c30 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
19c40 20 20 2f 2a 20 54 68 65 20 53 72 63 4c 69 73 74    /* The SrcList
19c50 20 74 6f 20 62 65 20 65 6e 6c 61 72 67 65 64 20   to be enlarged 
19c60 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
19c70 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
19c80 72 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20 74  r of new slots t
19c90 6f 20 61 64 64 20 74 6f 20 70 53 72 63 2d 3e 61  o add to pSrc->a
19ca0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61  [] */.  int iSta
19cb0 72 74 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  rt         /* In
19cc0 64 65 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d  dex in pSrc->a[]
19cd0 20 6f 66 20 66 69 72 73 74 20 6e 65 77 20 73 6c   of first new sl
19ce0 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ot */.){.  int i
19cf0 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
19d00 68 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69  hecking on calli
19d10 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  ng parameters */
19d20 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72  .  assert( iStar
19d30 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=0 );.  assert
19d40 28 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20  ( nExtra>=1 );. 
19d50 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30   assert( pSrc!=0
19d60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
19d70 74 61 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63  tart<=pSrc->nSrc
19d80 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
19d90 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70  te additional sp
19da0 61 63 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  ace if needed */
19db0 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72  .  if( pSrc->nSr
19dc0 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e  c+nExtra>pSrc->n
19dd0 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63  Alloc ){.    Src
19de0 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  List *pNew;.    
19df0 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72  int nAlloc = pSr
19e00 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a  c->nSrc+nExtra;.
19e10 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20      int nGot;.  
19e20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
19e30 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53  DbRealloc(db, pS
19e40 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rc,.            
19e50 20 20 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29     sizeof(*pSrc)
19e60 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69   + (nAlloc-1)*si
19e70 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29  zeof(pSrc->a[0])
19e80 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77   );.    if( pNew
19e90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
19ea0 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
19eb0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72  ailed );.      r
19ec0 65 74 75 72 6e 20 70 53 72 63 3b 0a 20 20 20 20  eturn pSrc;.    
19ed0 7d 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4e 65  }.    pSrc = pNe
19ee0 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20 28 73  w;.    nGot = (s
19ef0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69  qlite3DbMallocSi
19f00 7a 65 28 64 62 2c 20 70 4e 65 77 29 20 2d 20 73  ze(db, pNew) - s
19f10 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f 73 69  izeof(*pSrc))/si
19f20 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29  zeof(pSrc->a[0])
19f30 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41  +1;.    pSrc->nA
19f40 6c 6c 6f 63 20 3d 20 28 75 31 36 29 6e 47 6f 74  lloc = (u16)nGot
19f50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65  ;.  }..  /* Move
19f60 20 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20   existing slots 
19f70 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20  that come after 
19f80 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74  the newly insert
19f90 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75  ed slots.  ** ou
19fa0 74 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a  t of the way */.
19fb0 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53    for(i=pSrc->nS
19fc0 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b  rc-1; i>=iStart;
19fd0 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d   i--){.    pSrc-
19fe0 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70  >a[i+nExtra] = p
19ff0 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20  Src->a[i];.  }. 
1a000 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 28   pSrc->nSrc += (
1a010 69 31 36 29 6e 45 78 74 72 61 3b 0a 0a 20 20 2f  i16)nExtra;..  /
1a020 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c 79  * Zero the newly
1a030 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73   allocated slots
1a040 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 53   */.  memset(&pS
1a050 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30  rc->a[iStart], 0
1a060 2c 20 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61  , sizeof(pSrc->a
1a070 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20  [0])*nExtra);.  
1a080 66 6f 72 28 69 3d 69 53 74 61 72 74 3b 20 69 3c  for(i=iStart; i<
1a090 69 53 74 61 72 74 2b 6e 45 78 74 72 61 3b 20 69  iStart+nExtra; i
1a0a0 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61  ++){.    pSrc->a
1a0b0 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31  [i].iCursor = -1
1a0c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75  ;.  }..  /* Retu
1a0d0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1a0e0 74 68 65 20 65 6e 6c 61 72 67 65 64 20 53 72 63  the enlarged Src
1a0f0 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e  List */.  return
1a100 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   pSrc;.}.../*.**
1a110 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61   Append a new ta
1a120 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20  ble name to the 
1a130 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20  given SrcList.  
1a140 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63  Create a new Src
1a150 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
1a160 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79  be.  A new entry
1a170 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74   is created in t
1a180 68 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20  he SrcList even 
1a190 69 66 20 70 54 61 62 6c 65 20 69 73 20 4e 55 4c  if pTable is NUL
1a1a0 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69  L..**.** A SrcLi
1a1b0 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  st is returned, 
1a1c0 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65  or NULL if there
1a1d0 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   is an OOM error
1a1e0 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 0a  .  The returned.
1a1f0 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74  ** SrcList might
1a200 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
1a210 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
1a220 20 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69 74   was input or it
1a230 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e   might be.** a n
1a240 65 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f  ew one.  If an O
1a250 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  OM error does oc
1a260 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 70  curs, then the p
1a270 72 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70 4c  rior value of pL
1a280 69 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 69  ist.** that is i
1a290 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75  nput to this rou
1a2a0 74 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74 69  tine is automati
1a2b0 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a  cally freed..**.
1a2c0 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20  ** If pDatabase 
1a2d0 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20  is not null, it 
1a2e0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74  means that the t
1a2f0 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69  able has an opti
1a300 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65  onal.** database
1a310 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c   name prefix.  L
1a320 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61  ike this:  "data
1a330 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68  base.table".  Th
1a340 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70  e pDatabase.** p
1a350 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62  oints to the tab
1a360 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
1a370 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f  pTable points to
1a380 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
1a390 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69  me..** The SrcLi
1a3a0 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65  st.a[].zName fie
1a3b0 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ld is filled wit
1a3c0 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  h the table name
1a3d0 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20   which might.** 
1a3e0 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65  come from pTable
1a3f0 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69   (if pDatabase i
1a400 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20  s NULL) or from 
1a410 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20  pDatabase.  .** 
1a420 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74  SrcList.a[].zDat
1a430 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20  abase is filled 
1a440 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
1a450 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62  e name from pTab
1a460 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e  le,.** or with N
1a470 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61  ULL if no databa
1a480 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e  se is specified.
1a490 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  .**.** In other 
1a4a0 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c  words, if call l
1a4b0 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1a4c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
1a4d0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41  rcListAppend(D,A
1a4e0 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,0);.**.** The
1a4f0 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e  n B is a table n
1a500 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
1a510 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73  base name is uns
1a520 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61  pecified.  If ca
1a530 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69  lled.** like thi
1a540 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
1a550 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1a560 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a  ppend(D,A,B,C);.
1a570 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20  **.** Then C is 
1a580 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  the table name a
1a590 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61  nd B is the data
1a5a0 62 61 73 65 20 6e 61 6d 65 2e 20 20 49 66 20 43  base name.  If C
1a5b0 20 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74   is defined.** t
1a5c0 68 65 6e 20 73 6f 20 69 73 20 42 2e 20 20 49 6e  hen so is B.  In
1a5d0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 65   other words, we
1a5e0 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 63 61   never have a ca
1a5f0 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20  se where:.**.** 
1a600 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
1a610 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41  rcListAppend(D,A
1a620 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74  ,0,C);.**.** Bot
1a630 68 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61  h pTable and pDa
1a640 74 61 62 61 73 65 20 61 72 65 20 61 73 73 75 6d  tabase are assum
1a650 65 64 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e  ed to be quoted.
1a660 20 20 54 68 65 79 20 61 72 65 20 64 65 71 75 6f    They are dequo
1a670 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65  ted.** before be
1a680 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68 65  ing added to the
1a690 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63   SrcList..*/.Src
1a6a0 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
1a6b0 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 73 71  ListAppend(.  sq
1a6c0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1a6d0 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
1a6e0 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c  to notify of mal
1a6f0 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a  loc failures */.
1a700 20 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74    SrcList *pList
1a710 2c 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20  ,     /* Append 
1a720 74 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74 2e  to this SrcList.
1a730 20 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61 20   NULL creates a 
1a740 6e 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20  new SrcList */. 
1a750 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20   Token *pTable, 
1a760 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
1a770 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b   append */.  Tok
1a780 65 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20 20  en *pDatabase   
1a790 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66 20   /* Database of 
1a7a0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  the table */.){.
1a7b0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1a7c0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1a7d0 61 73 73 65 72 74 28 20 70 44 61 74 61 62 61 73  assert( pDatabas
1a7e0 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d  e==0 || pTable!=
1a7f0 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20  0 );  /* Cannot 
1a800 68 61 76 65 20 43 20 77 69 74 68 6f 75 74 20 42  have C without B
1a810 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   */.  if( pList=
1a820 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
1a830 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
1a840 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
1a850 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20  (SrcList) );.   
1a860 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1a870 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c  return 0;.    pL
1a880 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b  ist->nAlloc = 1;
1a890 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 73  .  }.  pList = s
1a8a0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
1a8b0 61 72 67 65 28 64 62 2c 20 70 4c 69 73 74 2c 20  arge(db, pList, 
1a8c0 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b  1, pList->nSrc);
1a8d0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1a8e0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
1a8f0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
1a900 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
1a910 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1a920 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69  }.  pItem = &pLi
1a930 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72  st->a[pList->nSr
1a940 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74  c-1];.  if( pDat
1a950 61 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61  abase && pDataba
1a960 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  se->z==0 ){.    
1a970 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  pDatabase = 0;. 
1a980 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61   }.  if( pDataba
1a990 73 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20  se ){.    Token 
1a9a0 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61  *pTemp = pDataba
1a9b0 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73  se;.    pDatabas
1a9c0 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20  e = pTable;.    
1a9d0 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a  pTable = pTemp;.
1a9e0 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61    }.  pItem->zNa
1a9f0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
1aa00 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54  FromToken(db, pT
1aa10 61 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e  able);.  pItem->
1aa20 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69  zDatabase = sqli
1aa30 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1aa40 28 64 62 2c 20 70 44 61 74 61 62 61 73 65 29 3b  (db, pDatabase);
1aa50 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
1aa60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
1aa70 20 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65   VdbeCursor inde
1aa80 78 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c  x numbers to all
1aa90 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63   tables in a Src
1aaa0 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  List.*/.void sql
1aab0 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
1aac0 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a  nCursors(Parse *
1aad0 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
1aae0 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
1aaf0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
1ab00 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1ab10 20 20 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c    assert(pList |
1ab20 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
1ab30 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1ab40 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
1ab50 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
1ab60 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73  pList->a; i<pLis
1ab70 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
1ab80 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  tem++){.      if
1ab90 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ( pItem->iCursor
1aba0 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  >=0 ) break;.   
1abb0 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f     pItem->iCurso
1abc0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
1abd0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  ++;.      if( pI
1abe0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  tem->pSelect ){.
1abf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
1ac00 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
1ac10 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65  ors(pParse, pIte
1ac20 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63  m->pSelect->pSrc
1ac30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1ac40 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
1ac50 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53  lete an entire S
1ac60 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67  rcList including
1ac70 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75   all its substru
1ac80 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cture..*/.void s
1ac90 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
1aca0 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
1acb0 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29   SrcList *pList)
1acc0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
1acd0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1ace0 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70   *pItem;.  if( p
1acf0 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1ad00 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
1ad10 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
1ad20 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
1ad30 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
1ad40 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1ad50 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
1ad60 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
1ad70 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
1ad80 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
1ad90 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1ada0 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
1adb0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1adc0 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 49 6e 64  (db, pItem->zInd
1add0 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ex);.    sqlite3
1ade0 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
1adf0 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20  pItem->pTab);.  
1ae00 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1ae10 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
1ae20 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73  >pSelect);.    s
1ae30 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
1ae40 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29  (db, pItem->pOn)
1ae50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  ;.    sqlite3IdL
1ae60 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49  istDelete(db, pI
1ae70 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
1ae80 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
1ae90 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  e(db, pList);.}.
1aea0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1aeb0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
1aec0 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 61   the parser to a
1aed0 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f  dd a new term to
1aee0 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61   the.** end of a
1aef0 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c   growing FROM cl
1af00 61 75 73 65 2e 20 20 54 68 65 20 22 70 22 20 70  ause.  The "p" p
1af10 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
1af20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46  part of.** the F
1af30 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20  ROM clause that 
1af40 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1af50 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22   constructed.  "
1af60 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66  p" is NULL.** if
1af70 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
1af80 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46  st term of the F
1af90 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61  ROM clause.  pTa
1afa0 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73  ble and pDatabas
1afb0 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d  e.** are the nam
1afc0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61  e of the table a
1afd0 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  nd database name
1afe0 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
1aff0 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44  ause term..** pD
1b000 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20  atabase is NULL 
1b010 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1b020 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69  name qualifier i
1b030 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a  s missing - the.
1b040 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20  ** usual case.  
1b050 49 66 20 74 68 65 20 74 65 72 6d 20 68 61 73 20  If the term has 
1b060 61 20 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41  a alias, then pA
1b070 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74  lias points to t
1b080 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65  he.** alias toke
1b090 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20  n.  If the term 
1b0a0 69 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 74  is a subquery, t
1b0b0 68 65 6e 20 70 53 75 62 71 75 65 72 79 20 69 73  hen pSubquery is
1b0c0 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73   the.** SELECT s
1b0d0 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68  tatement that th
1b0e0 65 20 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64  e subquery encod
1b0f0 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20  es.  The pTable 
1b100 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65  and.** pDatabase
1b110 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20   parameters are 
1b120 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72  NULL for subquer
1b130 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e  ies.  The pOn an
1b140 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61  d pUsing.** para
1b150 6d 65 74 65 72 73 20 61 72 65 20 74 68 65 20 63  meters are the c
1b160 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e  ontent of the ON
1b170 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
1b180 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  es..**.** Return
1b190 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77   a new SrcList w
1b1a0 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20  hich encodes is 
1b1b0 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68  the FROM with th
1b1c0 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64  e new.** term ad
1b1d0 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  ded..*/.SrcList 
1b1e0 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41  *sqlite3SrcListA
1b1f0 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20  ppendFromTerm(. 
1b200 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1b210 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
1b220 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1b230 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20   SrcList *p,    
1b240 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1b250 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74 68 65  left part of the
1b260 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72   FROM clause alr
1b270 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54  eady seen */.  T
1b280 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20  oken *pTable,   
1b290 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1b2a0 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61  f the table to a
1b2b0 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63  dd to the FROM c
1b2c0 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  lause */.  Token
1b2d0 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20 20 20   *pDatabase,    
1b2e0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1b2f0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
1b300 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a  ining pTable */.
1b310 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c    Token *pAlias,
1b320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b330 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
1b340 20 6f 66 20 74 68 65 20 41 53 20 73 75 62 65 78   of the AS subex
1b350 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65  pression */.  Se
1b360 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c  lect *pSubquery,
1b370 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75        /* A subqu
1b380 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63  ery used in plac
1b390 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d  e of a table nam
1b3a0 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e  e */.  Expr *pOn
1b3b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1b3c0 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  * The ON clause 
1b3d0 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49  of a join */.  I
1b3e0 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20  dList *pUsing   
1b3f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53         /* The US
1b400 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ING clause of a 
1b410 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  join */.){.  str
1b420 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1b430 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
1b440 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1b450 3e 64 62 3b 0a 20 20 69 66 28 20 21 70 20 26 26  >db;.  if( !p &&
1b460 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29   (pOn || pUsing)
1b470 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1b480 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1b490 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69  "a JOIN clause i
1b4a0 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  s required befor
1b4b0 65 20 25 73 22 2c 20 0a 20 20 20 20 20 20 28 70  e %s", .      (p
1b4c0 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49  On ? "ON" : "USI
1b4d0 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  NG").    );.    
1b4e0 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d  goto append_from
1b4f0 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20  _error;.  }.  p 
1b500 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
1b510 41 70 70 65 6e 64 28 64 62 2c 20 70 2c 20 70 54  Append(db, p, pT
1b520 61 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29  able, pDatabase)
1b530 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
1b540 4e 45 56 45 52 28 70 2d 3e 6e 53 72 63 3d 3d 30  NEVER(p->nSrc==0
1b550 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70  ) ){.    goto ap
1b560 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b  pend_from_error;
1b570 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
1b580 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b  p->a[p->nSrc-1];
1b590 0a 20 20 61 73 73 65 72 74 28 20 70 41 6c 69 61  .  assert( pAlia
1b5a0 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 41  s!=0 );.  if( pA
1b5b0 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70  lias->n ){.    p
1b5c0 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73  Item->zAlias = s
1b5d0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1b5e0 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b  ken(db, pAlias);
1b5f0 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53  .  }.  pItem->pS
1b600 65 6c 65 63 74 20 3d 20 70 53 75 62 71 75 65 72  elect = pSubquer
1b610 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20  y;.  pItem->pOn 
1b620 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e  = pOn;.  pItem->
1b630 70 55 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b  pUsing = pUsing;
1b640 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61  .  return p;.. a
1b650 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
1b660 3a 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  :.  assert( p==0
1b670 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
1b680 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29  rDelete(db, pOn)
1b690 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73  ;.  sqlite3IdLis
1b6a0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69  tDelete(db, pUsi
1b6b0 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ng);.  sqlite3Se
1b6c0 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
1b6d0 53 75 62 71 75 65 72 79 29 3b 0a 20 20 72 65 74  Subquery);.  ret
1b6e0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1b6f0 41 64 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42  Add an INDEXED B
1b700 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44  Y or NOT INDEXED
1b710 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d   clause to the m
1b720 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
1b730 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f  ed .** element o
1b740 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73  f the source-lis
1b750 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
1b760 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
1b770 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1b780 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79  SrcListIndexedBy
1b790 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1b7a0 53 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65  SrcList *p, Toke
1b7b0 6e 20 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a  n *pIndexedBy){.
1b7c0 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
1b7d0 65 64 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28  edBy!=0 );.  if(
1b7e0 20 70 20 26 26 20 41 4c 57 41 59 53 28 70 2d 3e   p && ALWAYS(p->
1b7f0 6e 53 72 63 3e 30 29 20 29 7b 0a 20 20 20 20 73  nSrc>0) ){.    s
1b800 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1b810 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
1b820 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  a[p->nSrc-1];.  
1b830 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
1b840 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 26  >notIndexed==0 &
1b850 26 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 3d  & pItem->zIndex=
1b860 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  =0 );.    if( pI
1b870 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26  ndexedBy->n==1 &
1b880 26 20 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a  & !pIndexedBy->z
1b890 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22   ){.      /* A "
1b8a0 4e 4f 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61  NOT INDEXED" cla
1b8b0 75 73 65 20 77 61 73 20 73 75 70 70 6c 69 65 64  use was supplied
1b8c0 2e 20 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20  . See parse.y . 
1b8d0 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63       ** construc
1b8e0 74 20 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20  t "indexed_opt" 
1b8f0 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a  for details. */.
1b900 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 6e 6f 74        pItem->not
1b910 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20  Indexed = 1;.   
1b920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
1b930 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71  tem->zIndex = sq
1b940 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1b950 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
1b960 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20  IndexedBy);.    
1b970 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  }.  }.}../*.** W
1b980 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20  hen building up 
1b990 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e  a FROM clause in
1b9a0 20 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65   the parser, the
1b9b0 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a   join operator.*
1b9c0 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61  * is initially a
1b9d0 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c  ttached to the l
1b9e0 65 66 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75  eft operand.  Bu
1b9f0 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  t the code gener
1ba00 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20  ator.** expects 
1ba10 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
1ba20 72 20 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72  r to be on the r
1ba30 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54  ight operand.  T
1ba40 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53  his routine.** S
1ba50 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f  hifts all join o
1ba60 70 65 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65  perators from le
1ba70 66 74 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20  ft to right for 
1ba80 61 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a  an entire FROM.*
1ba90 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  * clause..**.** 
1baa0 45 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65  Example: Suppose
1bab0 20 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b   the join is lik
1bac0 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
1bad0 20 20 20 20 20 20 20 20 41 20 6e 61 74 75 72 61          A natura
1bae0 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a  l cross join B.*
1baf0 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f  *.** The operato
1bb00 72 20 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72  r is "natural cr
1bb10 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20  oss join".  The 
1bb20 41 20 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73  A and B operands
1bb30 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69   are stored.** i
1bb40 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d  n p->a[0] and p-
1bb50 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76  >a[1], respectiv
1bb60 65 6c 79 2e 20 20 54 68 65 20 70 61 72 73 65 72  ely.  The parser
1bb70 20 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65   initially store
1bb80 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f  s the.** operato
1bb90 72 20 77 69 74 68 20 41 2e 20 20 54 68 69 73 20  r with A.  This 
1bba0 72 6f 75 74 69 6e 65 20 73 68 69 66 74 73 20 74  routine shifts t
1bbb0 68 61 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65  hat operator ove
1bbc0 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20  r to B..*/.void 
1bbd0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68  sqlite3SrcListSh
1bbe0 69 66 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c  iftJoinType(SrcL
1bbf0 69 73 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ist *p){.  if( p
1bc00 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
1bc10 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 20     assert( p->a 
1bc20 7c 7c 20 70 2d 3e 6e 53 72 63 3d 3d 30 20 29 3b  || p->nSrc==0 );
1bc30 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53  .    for(i=p->nS
1bc40 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  rc-1; i>0; i--){
1bc50 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 6a  .      p->a[i].j
1bc60 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69  ointype = p->a[i
1bc70 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  -1].jointype;.  
1bc80 20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e    }.    p->a[0].
1bc90 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
1bca0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  }.}../*.** Begin
1bcb0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
1bcc0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65  /.void sqlite3Be
1bcd0 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  ginTransaction(P
1bce0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1bcf0 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74  t type){.  sqlit
1bd00 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  e3 *db;.  Vdbe *
1bd10 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  v;.  int i;..  a
1bd20 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
1bd30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73   );.  db = pPars
1bd40 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
1bd50 20 64 62 21 3d 30 20 29 3b 0a 2f 2a 20 20 69 66   db!=0 );./*  if
1bd60 28 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  ( db->aDb[0].pBt
1bd70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 2a 2f  ==0 ) return; */
1bd80 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
1bd90 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1bda0 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
1bdb0 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20  ON, "BEGIN", 0, 
1bdc0 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1bdd0 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69  ;.  }.  v = sqli
1bde0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1bdf0 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72  e);.  if( !v ) r
1be00 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70  eturn;.  if( typ
1be10 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29  e!=TK_DEFERRED )
1be20 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
1be30 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
1be40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1be50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72  eAddOp2(v, OP_Tr
1be60 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74  ansaction, i, (t
1be70 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56  ype==TK_EXCLUSIV
1be80 45 29 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  E)+1);.      sql
1be90 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
1bea0 65 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  e(v, i);.    }. 
1beb0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
1bec0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74  AddOp2(v, OP_Aut
1bed0 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a  oCommit, 0, 0);.
1bee0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
1bef0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
1bf00 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
1bf10 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  mitTransaction(P
1bf20 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
1bf30 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73   Vdbe *v;..  ass
1bf40 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29  ert( pParse!=0 )
1bf50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
1bf60 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69  se->db!=0 );.  i
1bf70 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1bf80 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1bf90 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
1bfa0 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20  "COMMIT", 0, 0) 
1bfb0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
1bfc0 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33   }.  v = sqlite3
1bfd0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1bfe0 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
1bff0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c000 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  2(v, OP_AutoComm
1c010 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d  it, 1, 0);.  }.}
1c020 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
1c030 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
1c040 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
1c050 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f  llbackTransactio
1c060 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
1c070 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  {.  Vdbe *v;..  
1c080 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d  assert( pParse!=
1c090 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1c0a0 50 61 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a  Parse->db!=0 );.
1c0b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
1c0c0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1c0d0 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
1c0e0 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30  N, "ROLLBACK", 0
1c0f0 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , 0) ){.    retu
1c100 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71  rn;.  }.  v = sq
1c110 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1c120 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
1c130 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1c140 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74  AddOp2(v, OP_Aut
1c150 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a  oCommit, 1, 1);.
1c160 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
1c170 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1c180 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
1c190 65 72 20 77 68 65 6e 20 69 74 20 70 61 72 73 65  er when it parse
1c1a0 73 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 63  s a command to c
1c1b0 72 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61 73  reate,.** releas
1c1c0 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  e or rollback an
1c1d0 20 53 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e 20   SQL savepoint. 
1c1e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1c1f0 53 61 76 65 70 6f 69 6e 74 28 50 61 72 73 65 20  Savepoint(Parse 
1c200 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c  *pParse, int op,
1c210 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
1c220 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
1c230 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1c240 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
1c250 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a   pName);.  if( z
1c260 4e 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65  Name ){.    Vdbe
1c270 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
1c280 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 23 69  Vdbe(pParse);.#i
1c290 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c2a0 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
1c2b0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1c2c0 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a   char * const az
1c2d0 5b 5d 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20  [] = { "BEGIN", 
1c2e0 22 52 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c  "RELEASE", "ROLL
1c2f0 42 41 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73  BACK" };.    ass
1c300 65 72 74 28 20 21 53 41 56 45 50 4f 49 4e 54 5f  ert( !SAVEPOINT_
1c310 42 45 47 49 4e 20 26 26 20 53 41 56 45 50 4f 49  BEGIN && SAVEPOI
1c320 4e 54 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26 26  NT_RELEASE==1 &&
1c330 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
1c340 41 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66  ACK==2 );.#endif
1c350 0a 20 20 20 20 69 66 28 20 21 76 20 7c 7c 20 73  .    if( !v || s
1c360 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1c370 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
1c380 41 56 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d  AVEPOINT, az[op]
1c390 2c 20 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20  , zName, 0) ){. 
1c3a0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
1c3b0 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  ee(pParse->db, z
1c3c0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
1c3d0 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  urn;.    }.    s
1c3e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1c3f0 28 76 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74  (v, OP_Savepoint
1c400 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d  , op, 0, 0, zNam
1c410 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  e, P4_DYNAMIC);.
1c420 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
1c430 65 20 73 75 72 65 20 74 68 65 20 54 45 4d 50 20  e sure the TEMP 
1c440 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
1c450 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66   and available f
1c460 6f 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a  or use.  Return.
1c470 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
1c480 20 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20   errors.  Leave 
1c490 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
1c4a0 65 73 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  es in the pParse
1c4b0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69   structure..*/.i
1c4c0 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65  nt sqlite3OpenTe
1c4d0 6d 70 44 61 74 61 62 61 73 65 28 50 61 72 73 65  mpDatabase(Parse
1c4e0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
1c4f0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1c500 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d  e->db;.  if( db-
1c510 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26  >aDb[1].pBt==0 &
1c520 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  & !pParse->expla
1c530 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  in ){.    int rc
1c540 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  ;.    Btree *pBt
1c550 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
1c560 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a  st int flags = .
1c570 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1c580 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
1c590 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
1c5a0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
1c5b0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
1c5c0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
1c5d0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c   |.          SQL
1c5e0 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
1c5f0 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20  NCLOSE |.       
1c600 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
1c610 45 4d 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20  EMP_DB;..    rc 
1c620 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  = sqlite3BtreeOp
1c630 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20  en(db->pVfs, 0, 
1c640 64 62 2c 20 26 70 42 74 2c 20 30 2c 20 66 6c 61  db, &pBt, 0, fla
1c650 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  gs);.    if( rc!
1c660 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c670 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1c680 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61  Msg(pParse, "una
1c690 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  ble to open a te
1c6a0 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
1c6b0 20 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65   ".        "file
1c6c0 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d   for storing tem
1c6d0 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b  porary tables");
1c6e0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
1c6f0 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65  c = rc;.      re
1c700 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1c710 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74    db->aDb[1].pBt
1c720 20 3d 20 70 42 74 3b 0a 20 20 20 20 61 73 73 65   = pBt;.    asse
1c730 72 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  rt( db->aDb[1].p
1c740 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66  Schema );.    if
1c750 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d  ( SQLITE_NOMEM==
1c760 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
1c770 61 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d  ageSize(pBt, db-
1c780 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 20 2d  >nextPagesize, -
1c790 31 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 64  1, 0) ){.      d
1c7a0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1c7b0 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 1;.      retur
1c7c0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
1c7d0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1c7e0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
1c7f0 45 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  E code that will
1c800 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65   verify the sche
1c810 6d 61 20 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74  ma cookie and st
1c820 61 72 74 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72  art.** a read-tr
1c830 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c  ansaction for al
1c840 6c 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  l named database
1c850 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74   files..**.** It
1c860 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   is important th
1c870 61 74 20 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f  at all schema co
1c880 6f 6b 69 65 73 20 62 65 20 76 65 72 69 66 69 65  okies be verifie
1c890 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61  d and all.** rea
1c8a0 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 62  d transactions b
1c8b0 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
1c8c0 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 68   anything else h
1c8d0 61 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65  appens in.** the
1c8e0 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20   VDBE program.  
1c8f0 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  But this routine
1c900 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 61   can be called a
1c910 66 74 65 72 20 6d 75 63 68 20 6f 74 68 65 72 0a  fter much other.
1c920 2a 2a 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e  ** code has been
1c930 20 67 65 6e 65 72 61 74 65 64 2e 20 20 53 6f 20   generated.  So 
1c940 68 65 72 65 20 69 73 20 77 68 61 74 20 77 65 20  here is what we 
1c950 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  do:.**.** The fi
1c960 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f  rst time this ro
1c970 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
1c980 20 77 65 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47   we code an OP_G
1c990 6f 74 6f 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c  oto that.** will
1c9a0 20 6a 75 6d 70 20 74 6f 20 61 20 73 75 62 72 6f   jump to a subro
1c9b0 75 74 69 6e 65 20 61 74 20 74 68 65 20 65 6e 64  utine at the end
1c9c0 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   of the program.
1c9d0 20 20 54 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63    Then we.** rec
1c9e0 6f 72 64 20 65 76 65 72 79 20 64 61 74 61 62 61  ord every databa
1c9f0 73 65 20 74 68 61 74 20 6e 65 65 64 73 20 69 74  se that needs it
1ca00 73 20 73 63 68 65 6d 61 20 76 65 72 69 66 69 65  s schema verifie
1ca10 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72  d in the.** pPar
1ca20 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66  se->cookieMask f
1ca30 69 65 6c 64 2e 20 20 4c 61 74 65 72 2c 20 61 66  ield.  Later, af
1ca40 74 65 72 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f  ter all other co
1ca50 64 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67  de has been.** g
1ca60 65 6e 65 72 61 74 65 64 2c 20 74 68 65 20 73 75  enerated, the su
1ca70 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 64 6f  broutine that do
1ca80 65 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65  es the cookie ve
1ca90 72 69 66 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a  rifications and.
1caa0 2a 2a 20 73 74 61 72 74 73 20 74 68 65 20 74 72  ** starts the tr
1cab0 61 6e 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20  ansactions will 
1cac0 62 65 20 63 6f 64 65 64 20 61 6e 64 20 74 68 65  be coded and the
1cad0 20 4f 50 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75   OP_Goto P2 valu
1cae0 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64  e.** will be mad
1caf0 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  e to point to th
1cb00 61 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20  at subroutine.  
1cb10 54 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f  The generation o
1cb20 66 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20  f the.** cookie 
1cb30 76 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75 62  verification sub
1cb40 72 6f 75 74 69 6e 65 20 63 6f 64 65 20 68 61 70  routine code hap
1cb50 70 65 6e 73 20 69 6e 20 73 71 6c 69 74 65 33 46  pens in sqlite3F
1cb60 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a  inishCoding()..*
1cb70 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30 20 74 68  *.** If iDb<0 th
1cb80 65 6e 20 63 6f 64 65 20 74 68 65 20 4f 50 5f 47  en code the OP_G
1cb90 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74  oto only - don't
1cba0 20 73 65 74 20 66 6c 61 67 20 74 6f 20 76 65 72   set flag to ver
1cbb0 69 66 79 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d  ify the.** schem
1cbc0 61 20 6f 6e 20 61 6e 79 20 64 61 74 61 62 61 73  a on any databas
1cbd0 65 73 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  es.  This can be
1cbe0 20 75 73 65 64 20 74 6f 20 70 6f 73 69 74 69 6f   used to positio
1cbf0 6e 20 74 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a  n the OP_Goto.**
1cc00 20 65 61 72 6c 79 20 69 6e 20 74 68 65 20 63 6f   early in the co
1cc10 64 65 2c 20 62 65 66 6f 72 65 20 77 65 20 6b 6e  de, before we kn
1cc20 6f 77 20 69 66 20 61 6e 79 20 64 61 74 61 62 61  ow if any databa
1cc30 73 65 20 74 61 62 6c 65 73 20 77 69 6c 6c 20 62  se tables will b
1cc40 65 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  e used..*/.void 
1cc50 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
1cc60 79 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70  ySchema(Parse *p
1cc70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b  Parse, int iDb){
1cc80 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65  .  Parse *pTople
1cc90 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
1cca0 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
1ccb0 65 29 3b 0a 0a 20 20 69 66 28 20 70 54 6f 70 6c  e);..  if( pTopl
1ccc0 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  evel->cookieGoto
1ccd0 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ==0 ){.    Vdbe 
1cce0 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
1ccf0 64 62 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a  dbe(pToplevel);.
1cd00 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
1cd10 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20  eturn;  /* This 
1cd20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20  only happens if 
1cd30 74 68 65 72 65 20 77 61 73 20 61 20 70 72 69 6f  there was a prio
1cd40 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 70  r error */.    p
1cd50 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65  Toplevel->cookie
1cd60 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64  Goto = sqlite3Vd
1cd70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1cd80 6f 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20  oto, 0, 0)+1;.  
1cd90 7d 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29  }.  if( iDb>=0 )
1cda0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
1cdb0 62 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 64  b = pToplevel->d
1cdc0 62 3b 0a 20 20 20 20 79 44 62 4d 61 73 6b 20 6d  b;.    yDbMask m
1cdd0 61 73 6b 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  ask;..    assert
1cde0 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  ( iDb<db->nDb );
1cdf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
1ce00 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30  >aDb[iDb].pBt!=0
1ce10 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20   || iDb==1 );.  
1ce20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 53 51    assert( iDb<SQ
1ce30 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
1ce40 44 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  D+2 );.    asser
1ce50 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
1ce60 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
1ce70 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 6d 61 73  b, 0) );.    mas
1ce80 6b 20 3d 20 28 28 79 44 62 4d 61 73 6b 29 31 29  k = ((yDbMask)1)
1ce90 3c 3c 69 44 62 3b 0a 20 20 20 20 69 66 28 20 28  <<iDb;.    if( (
1cea0 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69  pToplevel->cooki
1ceb0 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30  eMask & mask)==0
1cec0 20 29 7b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65   ){.      pTople
1ced0 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  vel->cookieMask 
1cee0 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  |= mask;.      p
1cef0 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65  Toplevel->cookie
1cf00 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d  Value[iDb] = db-
1cf10 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
1cf20 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
1cf30 3b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  ;.      if( !OMI
1cf40 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
1cf50 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
1cf60 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74  lite3OpenTempDat
1cf70 61 62 61 73 65 28 70 54 6f 70 6c 65 76 65 6c 29  abase(pToplevel)
1cf80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1cf90 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
1cfa0 61 72 67 75 6d 65 6e 74 20 7a 44 62 20 69 73 20  argument zDb is 
1cfb0 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20  NULL, then call 
1cfc0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
1cfd0 79 53 63 68 65 6d 61 28 29 20 66 6f 72 20 65 61  ySchema() for ea
1cfe0 63 68 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20  ch .** attached 
1cff0 64 61 74 61 62 61 73 65 2e 20 4f 74 68 65 72 77  database. Otherw
1d000 69 73 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66  ise, invoke it f
1d010 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
1d020 6e 61 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a  named zDb only..
1d030 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
1d040 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63  odeVerifyNamedSc
1d050 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  hema(Parse *pPar
1d060 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
1d070 7a 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  zDb){.  sqlite3 
1d080 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1d090 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
1d0a0 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
1d0b0 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70   i++){.    Db *p
1d0c0 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
1d0d0 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
1d0e0 42 74 20 26 26 20 28 21 7a 44 62 20 7c 7c 20 30  Bt && (!zDb || 0
1d0f0 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
1d100 28 7a 44 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65  (zDb, pDb->zName
1d110 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  )) ){.      sqli
1d120 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
1d130 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a  ema(pParse, i);.
1d140 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1d150 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
1d160 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61   code that prepa
1d170 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e  res for doing an
1d180 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a   operation that.
1d190 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
1d1a0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
1d1b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1d1c0 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72   starts a new tr
1d1d0 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20  ansaction if we 
1d1e0 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  are not already 
1d1f0 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e  within.** a tran
1d200 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20  saction.  If we 
1d210 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68  are already with
1d220 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
1d230 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f  , then a checkpo
1d240 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66  int.** is set if
1d250 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e   the setStatemen
1d260 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
1d270 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69  rue.  A checkpoi
1d280 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nt should.** be 
1d290 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f  set for operatio
1d2a0 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61  ns that might fa
1d2b0 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e  il (due to a con
1d2c0 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66  straint) part of
1d2d0 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f  .** the way thro
1d2e0 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69  ugh and which wi
1d2f0 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20  ll need to undo 
1d300 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68  some writes with
1d310 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a  out having to.**
1d320 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68   rollback the wh
1d330 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ole transaction.
1d340 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73    For operations
1d350 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74   where all const
1d360 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65  raints.** can be
1d370 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20   checked before 
1d380 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20  any changes are 
1d390 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
1d3a0 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65  base, it is neve
1d3b0 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74  r.** necessary t
1d3c0 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61  o undo a write a
1d3d0 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  nd the checkpoin
1d3e0 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
1d3f0 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
1d400 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
1d410 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  eration(Parse *p
1d420 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74  Parse, int setSt
1d430 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62  atement, int iDb
1d440 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70  ){.  Parse *pTop
1d450 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
1d460 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
1d470 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  rse);.  sqlite3C
1d480 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
1d490 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
1d4a0 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65  pToplevel->write
1d4b0 4d 61 73 6b 20 7c 3d 20 28 28 79 44 62 4d 61 73  Mask |= ((yDbMas
1d4c0 6b 29 31 29 3c 3c 69 44 62 3b 0a 20 20 70 54 6f  k)1)<<iDb;.  pTo
1d4d0 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57  plevel->isMultiW
1d4e0 72 69 74 65 20 7c 3d 20 73 65 74 53 74 61 74 65  rite |= setState
1d4f0 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ment;.}../*.** I
1d500 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
1d510 20 73 74 61 74 65 6d 65 6e 74 20 63 75 72 72 65   statement curre
1d520 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
1d530 72 75 63 74 69 6f 6e 20 6d 69 67 68 74 20 77 72  ruction might wr
1d540 69 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e  ite.** more than
1d550 20 6f 6e 65 20 65 6e 74 72 79 20 28 65 78 61 6d   one entry (exam
1d560 70 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e  ple: deleting on
1d570 65 20 72 6f 77 20 74 68 65 6e 20 69 6e 73 65 72  e row then inser
1d580 74 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a  ting another,.**
1d590 20 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c 74 69   inserting multi
1d5a0 70 6c 65 20 72 6f 77 73 20 69 6e 20 61 20 74 61  ple rows in a ta
1d5b0 62 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e  ble, or insertin
1d5c0 67 20 61 20 72 6f 77 20 61 6e 64 20 69 6e 64 65  g a row and inde
1d5d0 78 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49  x entries.).** I
1d5e0 66 20 61 6e 20 61 62 6f 72 74 20 6f 63 63 75 72  f an abort occur
1d5f0 73 20 61 66 74 65 72 20 73 6f 6d 65 20 6f 66 20  s after some of 
1d600 74 68 65 73 65 20 77 72 69 74 65 73 20 68 61 76  these writes hav
1d610 65 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65  e completed, the
1d620 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  n it will.** be 
1d630 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64  necessary to und
1d640 6f 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 64 20  o the completed 
1d650 77 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  writes..*/.void 
1d660 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74  sqlite3MultiWrit
1d670 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
1d680 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c  {.  Parse *pTopl
1d690 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
1d6a0 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
1d6b0 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c  se);.  pToplevel
1d6c0 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 3d  ->isMultiWrite =
1d6d0 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68   1;.}../* .** Th
1d6e0 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
1d6f0 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
1d700 69 6e 65 20 69 66 20 69 73 20 64 69 73 63 6f 76  ine if is discov
1d710 65 72 73 20 74 68 61 74 20 69 74 20 69 73 0a 2a  ers that it is.*
1d720 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 62  * possible to ab
1d730 6f 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ort a statement 
1d740 70 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74  prior to complet
1d750 69 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72 20 74  ion.  In order t
1d760 6f 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68  o .** perform th
1d770 69 73 20 61 62 6f 72 74 20 77 69 74 68 6f 75 74  is abort without
1d780 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68 65 20   corrupting the 
1d790 64 61 74 61 62 61 73 65 2c 20 77 65 20 6e 65 65  database, we nee
1d7a0 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72  d to make.** sur
1d7b0 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65  e that the state
1d7c0 6d 65 6e 74 20 69 73 20 70 72 6f 74 65 63 74 65  ment is protecte
1d7d0 64 20 62 79 20 61 20 73 74 61 74 65 6d 65 6e 74  d by a statement
1d7e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1d7f0 0a 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c  .** Technically,
1d800 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f   we only need to
1d810 20 73 65 74 20 74 68 65 20 6d 61 79 41 62 6f 72   set the mayAbor
1d820 74 20 66 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a  t flag if the.**
1d830 20 69 73 4d 75 6c 74 69 57 72 69 74 65 20 66 6c   isMultiWrite fl
1d840 61 67 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ag was previousl
1d850 79 20 73 65 74 2e 20 20 54 68 65 72 65 20 69 73  y set.  There is
1d860 20 61 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e   a time dependen
1d870 63 79 0a 2a 2a 20 73 75 63 68 20 74 68 61 74 20  cy.** such that 
1d880 74 68 65 20 61 62 6f 72 74 20 6d 75 73 74 20 6f  the abort must o
1d890 63 63 75 72 20 61 66 74 65 72 20 74 68 65 20 6d  ccur after the m
1d8a0 75 6c 74 69 77 72 69 74 65 2e 20 20 54 68 69 73  ultiwrite.  This
1d8b0 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73   makes.** some s
1d8c0 74 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76  tatements involv
1d8d0 69 6e 67 20 74 68 65 20 52 45 50 4c 41 43 45 20  ing the REPLACE 
1d8e0 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  conflict resolut
1d8f0 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a  ion algorithm.**
1d900 20 67 6f 20 61 20 6c 69 74 74 6c 65 20 66 61 73   go a little fas
1d910 74 65 72 2e 20 20 42 75 74 20 74 61 6b 69 6e 67  ter.  But taking
1d920 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68   advantage of th
1d930 69 73 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e  is time dependen
1d940 63 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d  cy.** makes it m
1d950 6f 72 65 20 64 69 66 66 69 63 75 6c 74 20 74 6f  ore difficult to
1d960 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20   prove that the 
1d970 63 6f 64 65 20 69 73 20 63 6f 72 72 65 63 74 20  code is correct 
1d980 28 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c  (in .** particul
1d990 61 72 2c 20 69 74 20 70 72 65 76 65 6e 74 73 20  ar, it prevents 
1d9a0 75 73 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20  us from writing 
1d9b0 61 6e 20 65 66 66 65 63 74 69 76 65 0a 2a 2a 20  an effective.** 
1d9c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
1d9d0 66 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d  f sqlite3AssertM
1d9e0 61 79 41 62 6f 72 74 28 29 29 20 61 6e 64 20 73  ayAbort()) and s
1d9f0 6f 20 77 65 20 68 61 76 65 20 63 68 6f 73 65 6e  o we have chosen
1da00 0a 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68 65 20  .** to take the 
1da10 73 61 66 65 20 72 6f 75 74 65 20 61 6e 64 20 73  safe route and s
1da20 6b 69 70 20 74 68 65 20 6f 70 74 69 6d 69 7a 61  kip the optimiza
1da30 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
1da40 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 50 61  lite3MayAbort(Pa
1da50 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
1da60 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
1da70 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
1da80 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
1da90 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61  .  pToplevel->ma
1daa0 79 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f  yAbort = 1;.}../
1dab0 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
1dac0 48 61 6c 74 20 74 68 61 74 20 63 61 75 73 65 73  Halt that causes
1dad0 20 74 68 65 20 76 64 62 65 20 74 6f 20 72 65 74   the vdbe to ret
1dae0 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f  urn an SQLITE_CO
1daf0 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f  NSTRAINT.** erro
1db00 72 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72 20 70  r. The onError p
1db10 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69  arameter determi
1db20 6e 65 73 20 77 68 69 63 68 20 28 69 66 20 61 6e  nes which (if an
1db30 79 29 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  y) of the statem
1db40 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75  ent.** and/or cu
1db50 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
1db60 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1db70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1db80 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
1db90 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1dba0 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 63 68 61 72  nt onError, char
1dbb0 20 2a 70 34 2c 20 69 6e 74 20 70 34 74 79 70 65   *p4, int p4type
1dbc0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
1dbd0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1dbe0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 6f 6e 45  arse);.  if( onE
1dbf0 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  rror==OE_Abort )
1dc00 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79  {.    sqlite3May
1dc10 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20  Abort(pParse);. 
1dc20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
1dc30 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c  AddOp4(v, OP_Hal
1dc40 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  t, SQLITE_CONSTR
1dc50 41 49 4e 54 2c 20 6f 6e 45 72 72 6f 72 2c 20 30  AINT, onError, 0
1dc60 2c 20 70 34 2c 20 70 34 74 79 70 65 29 3b 0a 7d  , p4, p4type);.}
1dc70 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
1dc80 20 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75   see if pIndex u
1dc90 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  ses the collatin
1dca0 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
1dcb0 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
1dcc0 65 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64  e if it does and
1dcd0 20 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65   false if it doe
1dce0 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65  s not..*/.#ifnde
1dcf0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
1dd00 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74  INDEX.static int
1dd10 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28   collationMatch(
1dd20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
1dd30 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  l, Index *pIndex
1dd40 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
1dd50 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29  sert( zColl!=0 )
1dd60 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1dd70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Index->nColumn; 
1dd80 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
1dd90 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78  char *z = pIndex
1dda0 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20  ->azColl[i];.   
1ddb0 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b   assert( z!=0 );
1ddc0 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  .    if( 0==sqli
1ddd0 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43  te3StrICmp(z, zC
1dde0 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 65  oll) ){.      re
1ddf0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1de00 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1de10 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
1de20 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
1de30 63 65 73 20 6f 66 20 70 54 61 62 20 74 68 61 74  ces of pTab that
1de40 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69   use the collati
1de50 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
1de60 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d  l..** If pColl==
1de70 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65  0 then recompute
1de80 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
1de90 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  pTab..*/.#ifndef
1dea0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
1deb0 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64  NDEX.static void
1dec0 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50 61   reindexTable(Pa
1ded0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
1dee0 6c 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20 63  le *pTab, char c
1def0 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20  onst *zColl){.  
1df00 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
1df10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1df20 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  n index associat
1df30 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a  ed with pTab */.
1df40 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54  .  for(pIndex=pT
1df50 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64  ab->pIndex; pInd
1df60 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65  ex; pIndex=pInde
1df70 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  x->pNext){.    i
1df80 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63  f( zColl==0 || c
1df90 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43  ollationMatch(zC
1dfa0 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a  oll, pIndex) ){.
1dfb0 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20        int iDb = 
1dfc0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
1dfd0 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
1dfe0 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
1dff0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
1e000 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
1e010 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
1e020 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e030 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
1e040 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b  se, pIndex, -1);
1e050 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
1e060 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d  dif../*.** Recom
1e070 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
1e080 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69   of all tables i
1e090 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  n all databases 
1e0a0 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64  where the.** ind
1e0b0 69 63 65 73 20 75 73 65 20 74 68 65 20 63 6f 6c  ices use the col
1e0c0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1e0d0 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c  pColl.  If pColl
1e0e0 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75  ==0 then recompu
1e0f0 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65  te.** all indice
1e100 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f  s everywhere..*/
1e110 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e120 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61  OMIT_REINDEX.sta
1e130 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78  tic void reindex
1e140 44 61 74 61 62 61 73 65 73 28 50 61 72 73 65 20  Databases(Parse 
1e150 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 63 6f  *pParse, char co
1e160 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44  nst *zColl){.  D
1e170 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20  b *pDb;         
1e180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
1e190 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
1e1a0 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
1e1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1c0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1e1d0 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   index number */
1e1e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1e1f0 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
1e200 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
1e210 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48  onnection */.  H
1e220 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20  ashElem *k;     
1e230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
1e240 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74  r looping over t
1e250 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a  ables in pDb */.
1e260 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
1e270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e280 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   A table in the 
1e290 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 61  database */..  a
1e2a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
1e2b0 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78  reeHoldsAllMutex
1e2c0 65 73 28 64 62 29 20 29 3b 20 20 2f 2a 20 4e 65  es(db) );  /* Ne
1e2d0 65 64 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20  eded for schema 
1e2e0 61 63 63 65 73 73 20 2a 2f 0a 20 20 66 6f 72 28  access */.  for(
1e2f0 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61  iDb=0, pDb=db->a
1e300 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b  Db; iDb<db->nDb;
1e310 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a   iDb++, pDb++){.
1e320 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 21      assert( pDb!
1e330 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d  =0 );.    for(k=
1e340 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
1e350 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
1e360 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73  blHash);  k; k=s
1e370 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29  qliteHashNext(k)
1e380 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  ){.      pTab = 
1e390 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61  (Table*)sqliteHa
1e3a0 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20  shData(k);.     
1e3b0 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50   reindexTable(pP
1e3c0 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c  arse, pTab, zCol
1e3d0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  l);.    }.  }.}.
1e3e0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
1e3f0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1e400 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d  the REINDEX comm
1e410 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  and..**.**      
1e420 20 20 52 45 49 4e 44 45 58 20 20 20 20 20 20 20    REINDEX       
1e430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e440 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20       -- 1.**    
1e450 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f      REINDEX  <co
1e460 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20  llation>        
1e470 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20         -- 2.**  
1e480 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f        REINDEX  ?
1e490 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62  <database>.?<tab
1e4a0 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a  lename>  -- 3.**
1e4b0 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
1e4c0 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69   ?<database>.?<i
1e4d0 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a  ndexname>  -- 4.
1e4e0 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75  **.** Form 1 cau
1e4f0 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ses all indices 
1e500 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  in all attached 
1e510 64 61 74 61 62 61 73 65 73 20 74 6f 20 62 65 20  databases to be 
1e520 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d  rebuilt..** Form
1e530 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20   2 rebuilds all 
1e540 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64  indices in all d
1e550 61 74 61 62 61 73 65 73 20 74 68 61 74 20 75 73  atabases that us
1e560 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63  e the named.** c
1e570 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
1e580 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20  n.  Forms 3 and 
1e590 34 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61  4 rebuild the na
1e5a0 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c  med index or all
1e5b0 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f  .** indices asso
1e5c0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
1e5d0 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a  named table..*/.
1e5e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e5f0 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64  MIT_REINDEX.void
1e600 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28   sqlite3Reindex(
1e610 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
1e620 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f  oken *pName1, To
1e630 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20  ken *pName2){.  
1e640 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
1e650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1e660 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1e670 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  e to be reindexe
1e680 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  d, or NULL */.  
1e690 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20  char *z;        
1e6a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1e6b0 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ame of a table o
1e6c0 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e  r index */.  con
1e6d0 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20  st char *zDb;   
1e6e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1e6f0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1e700 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1e710 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1e720 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20    /* A table in 
1e730 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
1e740 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
1e750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e760 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69   An index associ
1e770 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a  ated with pTab *
1e780 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
1e790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7a0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1e7b0 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  index number */.
1e7c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1e7d0 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
1e7e0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
1e7f0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f  nnection */.  To
1e800 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20  ken *pObjName;  
1e810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1e820 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  e of the table o
1e830 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65  r index to be re
1e840 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a  indexed */..  /*
1e850 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
1e860 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
1e870 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
1e880 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
1e890 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
1e8a0 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
1e8b0 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
1e8c0 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
1e8d0 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
1e8e0 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
1e8f0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1e900 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30  .  if( pName1==0
1e910 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44   ){.    reindexD
1e920 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
1e930 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   0);.    return;
1e940 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4e 45 56  .  }else if( NEV
1e950 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c  ER(pName2==0) ||
1e960 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b   pName2->z==0 ){
1e970 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  .    char *zColl
1e980 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
1e990 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a  ame1->z );.    z
1e9a0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61  Coll = sqlite3Na
1e9b0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
1e9c0 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b  se->db, pName1);
1e9d0 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20  .    if( !zColl 
1e9e0 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 43  ) return;.    pC
1e9f0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
1ea00 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
1ea10 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b  (db), zColl, 0);
1ea20 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
1ea30 7b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 44  {.      reindexD
1ea40 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
1ea50 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 73   zColl);.      s
1ea60 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1ea70 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72   zColl);.      r
1ea80 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
1ea90 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1eaa0 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20  b, zColl);.  }. 
1eab0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
1eac0 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
1ead0 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
1eae0 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20  , &pObjName);.  
1eaf0 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75  if( iDb<0 ) retu
1eb00 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  rn;.  z = sqlite
1eb10 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
1eb20 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20  b, pObjName);.  
1eb30 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
1eb40 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61  n;.  zDb = db->a
1eb50 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
1eb60 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
1eb70 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20  indTable(db, z, 
1eb80 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62  zDb);.  if( pTab
1eb90 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54   ){.    reindexT
1eba0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
1ebb0 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
1ebc0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
1ebd0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1ebe0 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
1ebf0 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
1ec00 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69   z, zDb);.  sqli
1ec10 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
1ec20 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  ;.  if( pIndex )
1ec30 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
1ec40 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
1ec50 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
1ec60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 66  ;.    sqlite3Ref
1ec70 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
1ec80 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20   pIndex, -1);.  
1ec90 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1eca0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1ecb0 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
1ecc0 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20  to identify the 
1ecd0 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69  object to be rei
1ece0 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64  ndexed");.}.#end
1ecf0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
1ed00 20 61 20 64 79 6e 61 6d 69 63 6c 79 20 61 6c 6c   a dynamicly all
1ed10 6f 63 61 74 65 64 20 4b 65 79 49 6e 66 6f 20 73  ocated KeyInfo s
1ed20 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 61  tructure that ca
1ed30 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 77 69 74  n be used.** wit
1ed40 68 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 6f 72  h OP_OpenRead or
1ed50 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 74 6f   OP_OpenWrite to
1ed60 20 61 63 63 65 73 73 20 64 61 74 61 62 61 73 65   access database
1ed70 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a   index pIdx..**.
1ed80 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
1ed90 2c 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  , a pointer to t
1eda0 68 65 20 6e 65 77 20 73 74 72 75 63 74 75 72 65  he new structure
1edb0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e   is returned. In
1edc0 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 74 68   this case.** th
1edd0 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
1ede0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c  onsible for call
1edf0 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65  ing sqlite3DbFre
1ee00 65 28 64 62 2c 20 29 20 6f 6e 20 74 68 65 20 72  e(db, ) on the r
1ee10 65 74 75 72 6e 65 64 20 0a 2a 2a 20 70 6f 69 6e  eturned .** poin
1ee20 74 65 72 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ter. If an error
1ee30 20 6f 63 63 75 72 73 20 28 6f 75 74 20 6f 66 20   occurs (out of 
1ee40 6d 65 6d 6f 72 79 20 6f 72 20 6d 69 73 73 69 6e  memory or missin
1ee50 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 2a 2a 20  g collation .** 
1ee60 73 65 71 75 65 6e 63 65 29 2c 20 4e 55 4c 4c 20  sequence), NULL 
1ee70 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1ee80 74 68 65 20 73 74 61 74 65 20 6f 66 20 70 50 61  the state of pPa
1ee90 72 73 65 20 75 70 64 61 74 65 64 20 74 6f 20 72  rse updated to r
1eea0 65 66 6c 65 63 74 0a 2a 2a 20 74 68 65 20 65 72  eflect.** the er
1eeb0 72 6f 72 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  ror..*/.KeyInfo 
1eec0 2a 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79  *sqlite3IndexKey
1eed0 69 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  info(Parse *pPar
1eee0 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29  se, Index *pIdx)
1eef0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
1ef00 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43   nCol = pIdx->nC
1ef10 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 42 79  olumn;.  int nBy
1ef20 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 4b 65 79  tes = sizeof(Key
1ef30 49 6e 66 6f 29 20 2b 20 28 6e 43 6f 6c 2d 31 29  Info) + (nCol-1)
1ef40 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  *sizeof(CollSeq*
1ef50 29 20 2b 20 6e 43 6f 6c 3b 0a 20 20 73 71 6c 69  ) + nCol;.  sqli
1ef60 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1ef70 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  ->db;.  KeyInfo 
1ef80 2a 70 4b 65 79 20 3d 20 28 4b 65 79 49 6e 66 6f  *pKey = (KeyInfo
1ef90 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   *)sqlite3DbMall
1efa0 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
1efb0 73 29 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20  s);..  if( pKey 
1efc0 29 7b 0a 20 20 20 20 70 4b 65 79 2d 3e 64 62 20  ){.    pKey->db 
1efd0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1efe0 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64    pKey->aSortOrd
1eff0 65 72 20 3d 20 28 75 38 20 2a 29 26 28 70 4b 65  er = (u8 *)&(pKe
1f000 79 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b  y->aColl[nCol]);
1f010 0a 20 20 20 20 61 73 73 65 72 74 28 20 26 70 4b  .    assert( &pK
1f020 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  ey->aSortOrder[n
1f030 43 6f 6c 5d 3d 3d 26 28 28 28 75 38 20 2a 29 70  Col]==&(((u8 *)p
1f040 4b 65 79 29 5b 6e 42 79 74 65 73 5d 29 20 29 3b  Key)[nBytes]) );
1f050 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1f060 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
1f070 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20    char *zColl = 
1f080 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b  pIdx->azColl[i];
1f090 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
1f0a0 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 4b  Coll );.      pK
1f0b0 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73  ey->aColl[i] = s
1f0c0 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
1f0d0 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
1f0e0 6c 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e  l);.      pKey->
1f0f0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
1f100 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
1f110 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  [i];.    }.    p
1f120 4b 65 79 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75  Key->nField = (u
1f130 31 36 29 6e 43 6f 6c 3b 0a 20 20 7d 0a 0a 20 20  16)nCol;.  }..  
1f140 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
1f150 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
1f160 62 46 72 65 65 28 64 62 2c 20 70 4b 65 79 29 3b  bFree(db, pKey);
1f170 0a 20 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20  .    pKey = 0;. 
1f180 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79   }.  return pKey
1f190 3b 0a 7d 0a                                      ;.}.