System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 00a327120d81ace6267e714ae8010c997d55de5d:


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 75 33 32  o>0 ){.      u32
1210: 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69 6e 74   mask;.      int
1220: 20 69 44 62 3b 0a 20 20 20 20 20 20 73 71 6c 69   iDb;.      sqli
1230: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
1240: 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  v, pParse->cooki
1250: 65 47 6f 74 6f 2d 31 29 3b 0a 20 20 20 20 20 20  eGoto-1);.      
1260: 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73 6b 3d  for(iDb=0, mask=
1270: 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  1; iDb<db->nDb; 
1280: 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b 2b 29  mask<<=1, iDb++)
1290: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  {.        if( (m
12a0: 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e 63 6f  ask & pParse->co
12b0: 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29 20 63  okieMask)==0 ) c
12c0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
12d0: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
12e0: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
12f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1300: 62 65 41 64 64 4f 70 32 28 76 2c 4f 50 5f 54 72  beAddOp2(v,OP_Tr
1310: 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62 2c 20  ansaction, iDb, 
1320: 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e  (mask & pParse->
1330: 77 72 69 74 65 4d 61 73 6b 29 21 3d 30 29 3b 0a  writeMask)!=0);.
1340: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
1350: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a  init.busy==0 ){.
1360: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1370: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 4f 50  3VdbeAddOp2(v,OP
1380: 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 69  _VerifyCookie, i
1390: 44 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  Db, pParse->cook
13a0: 69 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b 0a 20  ieValue[iDb]);. 
13b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
13e0: 45 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  E.      {.      
13f0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
1400: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
1410: 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 3b 20 69  se->nVtabLock; i
1420: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  ++){.          c
1430: 68 61 72 20 2a 76 74 61 62 20 3d 20 28 63 68 61  har *vtab = (cha
1440: 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54  r *)sqlite3GetVT
1450: 61 62 6c 65 28 64 62 2c 20 70 50 61 72 73 65 2d  able(db, pParse-
1460: 3e 61 70 56 74 61 62 4c 6f 63 6b 5b 69 5d 29 3b  >apVtabLock[i]);
1470: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1480: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1490: 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c 20 30 2c  OP_VBegin, 0, 0,
14a0: 20 30 2c 20 76 74 61 62 2c 20 50 34 5f 56 54 41   0, vtab, P4_VTA
14b0: 42 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  B);.        }.  
14c0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
14d0: 74 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20  tabLock = 0;.   
14e0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
14f0: 20 20 20 2f 2a 20 4f 6e 63 65 20 61 6c 6c 20 74     /* Once all t
1500: 68 65 20 63 6f 6f 6b 69 65 73 20 68 61 76 65 20  he cookies have 
1510: 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 61 6e  been verified an
1520: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f  d transactions o
1530: 70 65 6e 65 64 2c 20 0a 20 20 20 20 20 20 2a 2a  pened, .      **
1540: 20 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71 75   obtain the requ
1550: 69 72 65 64 20 74 61 62 6c 65 2d 6c 6f 63 6b 73  ired table-locks
1560: 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
1570: 70 20 75 6e 6c 65 73 73 20 74 68 65 20 0a 20 20  p unless the .  
1580: 20 20 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61      ** shared-ca
1590: 63 68 65 20 66 65 61 74 75 72 65 20 69 73 20 65  che feature is e
15a0: 6e 61 62 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f  nabled..      */
15b0: 0a 20 20 20 20 20 20 63 6f 64 65 54 61 62 6c 65  .      codeTable
15c0: 4c 6f 63 6b 73 28 70 50 61 72 73 65 29 3b 0a 0a  Locks(pParse);..
15d0: 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
15e0: 69 7a 65 20 61 6e 79 20 41 55 54 4f 49 4e 43 52  ize any AUTOINCR
15f0: 45 4d 45 4e 54 20 64 61 74 61 20 73 74 72 75 63  EMENT data struc
1600: 74 75 72 65 73 20 72 65 71 75 69 72 65 64 2e 0a  tures required..
1610: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
1620: 71 6c 69 74 65 33 41 75 74 6f 69 6e 63 72 65 6d  qlite3Autoincrem
1630: 65 6e 74 42 65 67 69 6e 28 70 50 61 72 73 65 29  entBegin(pParse)
1640: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 61  ;..      /* Fina
1650: 6c 6c 79 2c 20 6a 75 6d 70 20 62 61 63 6b 20 74  lly, jump back t
1660: 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
1670: 6f 66 20 74 68 65 20 65 78 65 63 75 74 61 62 6c  of the executabl
1680: 65 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20  e code. */.     
1690: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16a0: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
16b0: 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  , pParse->cookie
16c0: 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Goto);.    }.  }
16d0: 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  ...  /* Get the 
16e0: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 72 65 61  VDBE program rea
16f0: 64 79 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  dy for execution
1700: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26  .  */.  if( v &&
1710: 20 41 4c 57 41 59 53 28 70 50 61 72 73 65 2d 3e   ALWAYS(pParse->
1720: 6e 45 72 72 3d 3d 30 29 20 26 26 20 21 64 62 2d  nErr==0) && !db-
1730: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
1740: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1750: 45 42 55 47 0a 20 20 20 20 46 49 4c 45 20 2a 74  EBUG.    FILE *t
1760: 72 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67  race = (db->flag
1770: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54  s & SQLITE_VdbeT
1780: 72 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75  race)!=0 ? stdou
1790: 74 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  t : 0;.    sqlit
17a0: 65 33 56 64 62 65 54 72 61 63 65 28 76 2c 20 74  e3VdbeTrace(v, t
17b0: 72 61 63 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  race);.#endif.  
17c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
17d0: 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 30  ->iCacheLevel==0
17e0: 20 29 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 73   );  /* Disables
17f0: 20 61 6e 64 20 72 65 2d 65 6e 61 62 6c 65 73 20   and re-enables 
1800: 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 2f 2a 20  match */.    /* 
1810: 41 20 6d 69 6e 69 6d 75 6d 20 6f 66 20 6f 6e 65  A minimum of one
1820: 20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 69   cursor is requi
1830: 72 65 64 20 69 66 20 61 75 74 6f 69 6e 63 72 65  red if autoincre
1840: 6d 65 6e 74 20 69 73 20 75 73 65 64 0a 20 20 20  ment is used.   
1850: 20 2a 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b   *  See ticket [
1860: 61 36 39 36 33 37 39 63 31 66 30 38 38 36 36 5d  a696379c1f08866]
1870: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 72   */.    if( pPar
1880: 73 65 2d 3e 70 41 69 6e 63 21 3d 30 20 26 26 20  se->pAinc!=0 && 
1890: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 30 20  pParse->nTab==0 
18a0: 29 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d  ) pParse->nTab =
18b0: 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   1;.    sqlite3V
18c0: 64 62 65 4d 61 6b 65 52 65 61 64 79 28 76 2c 20  dbeMakeReady(v, 
18d0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 70 50  pParse->nVar, pP
18e0: 61 72 73 65 2d 3e 6e 4d 65 6d 2c 0a 20 20 20 20  arse->nMem,.    
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1900: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61       pParse->nTa
1910: 62 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41  b, pParse->nMaxA
1920: 72 67 2c 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  rg, pParse->expl
1930: 61 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ain,.           
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
1950: 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69  arse->isMultiWri
1960: 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61  te && pParse->ma
1970: 79 41 62 6f 72 74 29 3b 0a 20 20 20 20 70 50 61  yAbort);.    pPa
1980: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
1990: 5f 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73  _DONE;.    pPars
19a0: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d  e->colNamesSet =
19b0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
19c0: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
19d0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
19e0: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
19f0: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d   0;.  pParse->nM
1a00: 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  em = 0;.  pParse
1a10: 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70 50  ->nSet = 0;.  pP
1a20: 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a  arse->nVar = 0;.
1a30: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
1a40: 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 72  Mask = 0;.  pPar
1a50: 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d  se->cookieGoto =
1a60: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e   0;.}../*.** Run
1a70: 20 74 68 65 20 70 61 72 73 65 72 20 61 6e 64 20   the parser and 
1a80: 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 72  code generator r
1a90: 65 63 75 72 73 69 76 65 6c 79 20 69 6e 20 6f 72  ecursively in or
1aa0: 64 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a  der to generate.
1ab0: 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  ** code for the 
1ac0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 67 69  SQL statement gi
1ad0: 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ven onto the end
1ae0: 20 6f 66 20 74 68 65 20 70 50 61 72 73 65 20 63   of the pParse c
1af0: 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72 72 65 6e  ontext.** curren
1b00: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
1b10: 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 68  uction.  When th
1b20: 65 20 70 61 72 73 65 72 20 69 73 20 72 75 6e 20  e parser is run 
1b30: 72 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20 74  recursively.** t
1b40: 68 69 73 20 77 61 79 2c 20 74 68 65 20 66 69 6e  his way, the fin
1b50: 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73 20 6e 6f  al OP_Halt is no
1b60: 74 20 61 70 70 65 6e 64 65 64 20 61 6e 64 20 6f  t appended and o
1b70: 74 68 65 72 20 69 6e 69 74 69 61 6c 69 7a 61 74  ther initializat
1b80: 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e 61 6c  ion.** and final
1b90: 69 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 61 72  ization steps ar
1ba0: 65 20 6f 6d 69 74 74 65 64 20 62 65 63 61 75 73  e omitted becaus
1bb0: 65 20 74 68 6f 73 65 20 61 72 65 20 68 61 6e 64  e those are hand
1bc0: 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20 6f  ling by the.** o
1bd0: 75 74 65 72 6d 6f 73 74 20 70 61 72 73 65 72 2e  utermost parser.
1be0: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65 72 79  .**.** Not every
1bf0: 74 68 69 6e 67 20 69 73 20 6e 65 73 74 61 62 6c  thing is nestabl
1c00: 65 2e 20 20 54 68 69 73 20 66 61 63 69 6c 69 74  e.  This facilit
1c10: 79 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f  y is designed to
1c20: 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e 53 45 52   permit.** INSER
1c30: 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64 20 44  T, UPDATE, and D
1c40: 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73  ELETE operations
1c50: 20 61 67 61 69 6e 73 74 20 53 51 4c 49 54 45 5f   against SQLITE_
1c60: 4d 41 53 54 45 52 2e 20 20 55 73 65 0a 2a 2a 20  MASTER.  Use.** 
1c70: 63 61 72 65 20 69 66 20 79 6f 75 20 64 65 63 69  care if you deci
1c80: 64 65 20 74 6f 20 74 72 79 20 74 6f 20 75 73 65  de to try to use
1c90: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 6f   this routine fo
1ca0: 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72  r some other pur
1cb0: 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  poses..*/.void s
1cc0: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
1cd0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1ce0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
1cf0: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
1d00: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72  _list ap;.  char
1d10: 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a   *zSql;.  char *
1d20: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 73  zErrMsg = 0;.  s
1d30: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1d40: 72 73 65 2d 3e 64 62 3b 0a 23 20 64 65 66 69 6e  rse->db;.# defin
1d50: 65 20 53 41 56 45 5f 53 5a 20 20 28 73 69 7a 65  e SAVE_SZ  (size
1d60: 6f 66 28 50 61 72 73 65 29 20 2d 20 6f 66 66 73  of(Parse) - offs
1d70: 65 74 6f 66 28 50 61 72 73 65 2c 6e 56 61 72 29  etof(Parse,nVar)
1d80: 29 0a 20 20 63 68 61 72 20 73 61 76 65 42 75 66  ).  char saveBuf
1d90: 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66  [SAVE_SZ];..  if
1da0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
1db0: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
1dc0: 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  t( pParse->neste
1dd0: 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65 73 74  d<10 );  /* Nest
1de0: 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ing should only 
1df0: 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20 64 65  be of limited de
1e00: 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74 61 72  pth */.  va_star
1e10: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
1e20: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
1e30: 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a 46 6f  VMPrintf(db, zFo
1e40: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
1e50: 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a  end(ap);.  if( z
1e60: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Sql==0 ){.    re
1e70: 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d 61 6c  turn;   /* A mal
1e80: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
1e90: 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 50  iled */.  }.  pP
1ea0: 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a  arse->nested++;.
1eb0: 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42 75 66    memcpy(saveBuf
1ec0: 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  , &pParse->nVar,
1ed0: 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d   SAVE_SZ);.  mem
1ee0: 73 65 74 28 26 70 50 61 72 73 65 2d 3e 6e 56 61  set(&pParse->nVa
1ef0: 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a  r, 0, SAVE_SZ);.
1f00: 20 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73    sqlite3RunPars
1f10: 65 72 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c  er(pParse, zSql,
1f20: 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71   &zErrMsg);.  sq
1f30: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1f40: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  zErrMsg);.  sqli
1f50: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
1f60: 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70  ql);.  memcpy(&p
1f70: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 73 61 76  Parse->nVar, sav
1f80: 65 42 75 66 2c 20 53 41 56 45 5f 53 5a 29 3b 0a  eBuf, SAVE_SZ);.
1f90: 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64    pParse->nested
1fa0: 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  --;.}../*.** Loc
1fb0: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
1fc0: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
1fd0: 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72   describes a par
1fe0: 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
1ff0: 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20  .** table given 
2000: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74  the name of that
2010: 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69   table and (opti
2020: 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65  onally) the name
2030: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
2040: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
2050: 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
2060: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
2070: 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44  und..**.** If zD
2080: 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c  atabase is 0, al
2090: 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  l databases are 
20a0: 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65  searched for the
20b0: 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a 2a   table and the.*
20c0: 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  * first matching
20d0: 20 74 61 62 6c 65 20 69 73 20 72 65 74 75 72 6e   table is return
20e0: 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e  ed.  (No checkin
20f0: 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  g for duplicate 
2100: 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 69  table.** names i
2110: 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65  s done.)  The se
2120: 61 72 63 68 20 6f 72 64 65 72 20 69 73 20 54 45  arch order is TE
2130: 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d  MP first, then M
2140: 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a  AIN, then any.**
2150: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
2160: 61 73 65 73 20 61 64 64 65 64 20 75 73 69 6e 67  ases added using
2170: 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d   the ATTACH comm
2180: 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  and..**.** See a
2190: 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  lso sqlite3Locat
21a0: 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62  eTable()..*/.Tab
21b0: 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 54  le *sqlite3FindT
21c0: 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62  able(sqlite3 *db
21d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
21e0: 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
21f0: 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20 54  *zDatabase){.  T
2200: 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20 69  able *p = 0;.  i
2210: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d  nt i;.  int nNam
2220: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 4e 61  e;.  assert( zNa
2230: 6d 65 21 3d 30 20 29 3b 0a 20 20 6e 4e 61 6d 65  me!=0 );.  nName
2240: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2250: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72  30(zName);.  for
2260: 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20  (i=OMIT_TEMPDB; 
2270: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
2280: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c  .    int j = (i<
2290: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20  2) ? i^1 : i;   
22a0: 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62  /* Search TEMP b
22b0: 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20  efore MAIN */.  
22c0: 20 20 69 66 28 20 7a 44 61 74 61 62 61 73 65 21    if( zDatabase!
22d0: 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  =0 && sqlite3Str
22e0: 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65 2c 20  ICmp(zDatabase, 
22f0: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65  db->aDb[j].zName
2300: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
2310: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
2320: 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a  hFind(&db->aDb[j
2330: 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ].pSchema->tblHa
2340: 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  sh, zName, nName
2350: 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20 62  );.    if( p ) b
2360: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
2370: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn p;.}../*.** L
2380: 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ocate the in-mem
2390: 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68  ory structure th
23a0: 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70  at describes a p
23b0: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
23c0: 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65  se.** table give
23d0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
23e0: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
23f0: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
2400: 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  me of the.** dat
2410: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
2420: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
2430: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
2440: 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61  found.  Also lea
2450: 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d  ve an.** error m
2460: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
2470: 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a  ->zErrMsg..**.**
2480: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
2490: 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
24a0: 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33  tine and sqlite3
24b0: 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73 20 74  FindTable() is t
24c0: 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hat this.** rout
24d0: 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72  ine leaves an er
24e0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
24f0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77  Parse->zErrMsg w
2500: 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46  here.** sqlite3F
2510: 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20  indTable() does 
2520: 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  not..*/.Table *s
2530: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
2540: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
2550: 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 63  se,         /* c
2560: 6f 6e 74 65 78 74 20 69 6e 20 77 68 69 63 68 20  ontext in which 
2570: 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73  to report errors
2580: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77   */.  int isView
2590: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
25a0: 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69 6e 67 20  True if looking 
25b0: 66 6f 72 20 61 20 56 49 45 57 20 72 61 74 68 65  for a VIEW rathe
25c0: 72 20 74 68 61 6e 20 61 20 54 41 42 4c 45 20 2a  r than a TABLE *
25d0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
25e0: 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61  zName,     /* Na
25f0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
2600: 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66  we are looking f
2610: 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  or */.  const ch
2620: 61 72 20 2a 7a 44 62 61 73 65 20 20 20 20 20 2f  ar *zDbase     /
2630: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
2640: 74 61 62 61 73 65 2e 20 20 4d 69 67 68 74 20 62  tabase.  Might b
2650: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54  e NULL */.){.  T
2660: 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52  able *p;..  /* R
2670: 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
2680: 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65   schema. If an e
2690: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61  rror occurs, lea
26a0: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
26b0: 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64  age.  ** and cod
26c0: 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
26d0: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a  return NULL. */.
26e0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
26f0: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
2700: 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
2710: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2720: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69  .  p = sqlite3Fi
2730: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
2740: 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73  db, zName, zDbas
2750: 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  e);.  if( p==0 )
2760: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2770: 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69 65 77 20   *zMsg = isView 
2780: 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65 77 22  ? "no such view"
2790: 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c   : "no such tabl
27a0: 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 61  e";.    if( zDba
27b0: 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  se ){.      sqli
27c0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
27d0: 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c  se, "%s: %s.%s",
27e0: 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a   zMsg, zDbase, z
27f0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
2800: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2810: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2820: 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20  "%s: %s", zMsg, 
2830: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
2840: 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
2850: 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20  chema = 1;.  }. 
2860: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
2870: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
2880: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
2890: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
28a0: 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c  s .** a particul
28b0: 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74  ar index given t
28c0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
28d0: 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65  index.** and the
28e0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
28f0: 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61  abase that conta
2900: 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ins the index..*
2910: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
2920: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
2930: 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69  * If zDatabase i
2940: 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73  s 0, all databas
2950: 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20  es are searched 
2960: 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  for the.** table
2970: 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d   and the first m
2980: 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73  atching index is
2990: 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20   returned.  (No 
29a0: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20  checking.** for 
29b0: 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20  duplicate index 
29c0: 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20  names is done.) 
29d0: 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65   The search orde
29e0: 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72  r is.** TEMP fir
29f0: 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74  st, then MAIN, t
2a00: 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72  hen any auxiliar
2a10: 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65  y databases adde
2a20: 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41  d.** using the A
2a30: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TTACH command..*
2a40: 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33  /.Index *sqlite3
2a50: 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65  FindIndex(sqlite
2a60: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
2a70: 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20  r *zName, const 
2a80: 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e  char *zDb){.  In
2a90: 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e  dex *p = 0;.  in
2aa0: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  t i;.  int nName
2ab0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2ac0: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72  30(zName);.  for
2ad0: 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20  (i=OMIT_TEMPDB; 
2ae0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
2af0: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c  .    int j = (i<
2b00: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f  2) ? i^1 : i;  /
2b10: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
2b20: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
2b30: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
2b40: 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53   = db->aDb[j].pS
2b50: 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72  chema;.    asser
2b60: 74 28 20 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  t( pSchema );.  
2b70: 20 20 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c    if( zDb && sql
2b80: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c  ite3StrICmp(zDb,
2b90: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d   db->aDb[j].zNam
2ba0: 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
2bb0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
2bc0: 73 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d  shFind(&pSchema-
2bd0: 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  >idxHash, zName,
2be0: 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   nName);.    if(
2bf0: 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a   p ) break;.  }.
2c00: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
2c10: 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74 68 65  *.** Reclaim the
2c20: 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
2c30: 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74  an index.*/.stat
2c40: 69 63 20 76 6f 69 64 20 66 72 65 65 49 6e 64 65  ic void freeInde
2c50: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  x(sqlite3 *db, I
2c60: 6e 64 65 78 20 2a 70 29 7b 0a 23 69 66 6e 64 65  ndex *p){.#ifnde
2c70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e  f SQLITE_OMIT_AN
2c80: 41 4c 59 5a 45 0a 20 20 73 71 6c 69 74 65 33 44  ALYZE.  sqlite3D
2c90: 65 6c 65 74 65 49 6e 64 65 78 53 61 6d 70 6c 65  eleteIndexSample
2ca0: 73 28 64 62 2c 20 70 29 3b 0a 23 65 6e 64 69 66  s(db, p);.#endif
2cb0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
2cc0: 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66 29  (db, p->zColAff)
2cd0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
2ce0: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
2cf0: 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78  ** For the index
2d00: 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65   called zIdxName
2d10: 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20   which is found 
2d20: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2d30: 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74  iDb,.** unlike t
2d40: 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69  hat index from i
2d50: 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65  ts Table then re
2d60: 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 66  move the index f
2d70: 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  rom.** the index
2d80: 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20   hash table and 
2d90: 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  free all memory 
2da0: 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
2db0: 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
2dc0: 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64  e index..*/.void
2dd0: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
2de0: 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c  dDeleteIndex(sql
2df0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
2e00: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
2e10: 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65  IdxName){.  Inde
2e20: 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74  x *pIndex;.  int
2e30: 20 6c 65 6e 3b 0a 20 20 48 61 73 68 20 2a 70 48   len;.  Hash *pH
2e40: 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  ash = &db->aDb[i
2e50: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db].pSchema->idx
2e60: 48 61 73 68 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73  Hash;..  len = s
2e70: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2e80: 49 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64  IdxName);.  pInd
2e90: 65 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ex = sqlite3Hash
2ea0: 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49  Insert(pHash, zI
2eb0: 64 78 4e 61 6d 65 2c 20 6c 65 6e 2c 20 30 29 3b  dxName, len, 0);
2ec0: 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b  .  if( pIndex ){
2ed0: 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d  .    if( pIndex-
2ee0: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d  >pTable->pIndex=
2ef0: 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20  =pIndex ){.     
2f00: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
2f10: 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
2f20: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
2f30: 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
2f40: 2a 70 3b 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73  *p;.      /* Jus
2f50: 74 69 66 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c  tification of AL
2f60: 57 41 59 53 28 29 3b 20 20 54 68 65 20 69 6e 64  WAYS();  The ind
2f70: 65 78 20 6d 75 73 74 20 62 65 20 6f 6e 20 74 68  ex must be on th
2f80: 65 20 6c 69 73 74 20 6f 66 0a 20 20 20 20 20 20  e list of.      
2f90: 2a 2a 20 69 6e 64 69 63 65 73 2e 20 2a 2f 0a 20  ** indices. */. 
2fa0: 20 20 20 20 20 70 20 3d 20 70 49 6e 64 65 78 2d       p = pIndex-
2fb0: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b  >pTable->pIndex;
2fc0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c  .      while( AL
2fd0: 57 41 59 53 28 70 29 20 26 26 20 70 2d 3e 70 4e  WAYS(p) && p->pN
2fe0: 65 78 74 21 3d 70 49 6e 64 65 78 20 29 7b 20 70  ext!=pIndex ){ p
2ff0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20   = p->pNext; }. 
3000: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
3010: 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70  p && p->pNext==p
3020: 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20  Index) ){.      
3030: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e    p->pNext = pIn
3040: 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  dex->pNext;.    
3050: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72    }.    }.    fr
3060: 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  eeIndex(db, pInd
3070: 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66  ex);.  }.  db->f
3080: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
3090: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a  nternChanges;.}.
30a0: 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c  ./*.** Erase all
30b0: 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74   schema informat
30c0: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d  ion from the in-
30d0: 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c  memory hash tabl
30e0: 65 73 20 6f 66 0a 2a 2a 20 61 20 73 69 6e 67 6c  es of.** a singl
30f0: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
3100: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
3110: 6c 65 64 20 74 6f 20 72 65 63 6c 61 69 6d 20 6d  led to reclaim m
3120: 65 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f 72 65 20  emory.** before 
3130: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6c 6f  the database clo
3140: 73 65 73 2e 20 20 49 74 20 69 73 20 61 6c 73 6f  ses.  It is also
3150: 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 61   called during a
3160: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66 20   rollback.** if 
3170: 74 68 65 72 65 20 77 65 72 65 20 73 63 68 65 6d  there were schem
3180: 61 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67  a changes during
3190: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
31a0: 20 6f 72 20 69 66 20 61 0a 2a 2a 20 73 63 68 65   or if a.** sche
31b0: 6d 61 2d 63 6f 6f 6b 69 65 20 6d 69 73 6d 61 74  ma-cookie mismat
31c0: 63 68 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  ch occurs..**.**
31d0: 20 49 66 20 69 44 62 3d 3d 30 20 74 68 65 6e 20   If iDb==0 then 
31e0: 72 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e  reset the intern
31f0: 61 6c 20 73 63 68 65 6d 61 20 74 61 62 6c 65 73  al schema tables
3200: 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73   for all databas
3210: 65 0a 2a 2a 20 66 69 6c 65 73 2e 20 20 49 66 20  e.** files.  If 
3220: 69 44 62 3e 3d 31 20 74 68 65 6e 20 72 65 73 65  iDb>=1 then rese
3230: 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  t the internal s
3240: 63 68 65 6d 61 20 66 6f 72 20 6f 6e 6c 79 20 74  chema for only t
3250: 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 66 69 6c  he.** single fil
3260: 65 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a  e indicated..*/.
3270: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65  void sqlite3Rese
3280: 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28  tInternalSchema(
3290: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
32a0: 20 69 44 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20   iDb){.  int i, 
32b0: 6a 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  j;.  assert( iDb
32c0: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
32d0: 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62  Db );..  if( iDb
32e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
32f0: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
3300: 64 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  db);.  }.  for(i
3310: 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  =iDb; i<db->nDb;
3320: 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70   i++){.    Db *p
3330: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
3340: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
3350: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
3360: 61 73 73 65 72 74 28 69 3d 3d 31 20 7c 7c 20 28  assert(i==1 || (
3370: 70 44 62 2d 3e 70 42 74 20 26 26 20 73 71 6c 69  pDb->pBt && sqli
3380: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
3390: 65 78 28 70 44 62 2d 3e 70 42 74 29 29 29 3b 0a  ex(pDb->pBt)));.
33a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 68        sqlite3Sch
33b0: 65 6d 61 46 72 65 65 28 70 44 62 2d 3e 70 53 63  emaFree(pDb->pSc
33c0: 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hema);.    }.   
33d0: 20 69 66 28 20 69 44 62 3e 30 20 29 20 72 65 74   if( iDb>0 ) ret
33e0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
33f0: 74 28 20 69 44 62 3d 3d 30 20 29 3b 0a 20 20 64  t( iDb==0 );.  d
3400: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
3410: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
3420: 73 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  s;.  sqlite3Vtab
3430: 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a  UnlockList(db);.
3440: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
3450: 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f  aveAll(db);..  /
3460: 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  * If one or more
3470: 20 6f 66 20 74 68 65 20 61 75 78 69 6c 69 61 72   of the auxiliar
3480: 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  y database files
3490: 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64   has been closed
34a0: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 6d 6f  ,.  ** then remo
34b0: 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65  ve them from the
34c0: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
34d0: 61 73 65 20 6c 69 73 74 2e 20 20 57 65 20 74 61  ase list.  We ta
34e0: 6b 65 20 74 68 65 0a 20 20 2a 2a 20 6f 70 70 6f  ke the.  ** oppo
34f0: 72 74 75 6e 69 74 79 20 74 6f 20 64 6f 20 74 68  rtunity to do th
3500: 69 73 20 68 65 72 65 20 73 69 6e 63 65 20 77 65  is here since we
3510: 20 68 61 76 65 20 6a 75 73 74 20 64 65 6c 65 74   have just delet
3520: 65 64 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20  ed all of the.  
3530: 2a 2a 20 73 63 68 65 6d 61 20 68 61 73 68 20 74  ** schema hash t
3540: 61 62 6c 65 73 20 61 6e 64 20 74 68 65 72 65 66  ables and theref
3550: 6f 72 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  ore do not have 
3560: 74 6f 20 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e  to make any chan
3570: 67 65 73 0a 20 20 2a 2a 20 74 6f 20 61 6e 79 20  ges.  ** to any 
3580: 6f 66 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e  of those tables.
3590: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6a 3d  .  */.  for(i=j=
35a0: 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  2; i<db->nDb; i+
35b0: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44  +){.    struct D
35c0: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
35d0: 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
35e0: 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  b->pBt==0 ){.   
35f0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3600: 28 64 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29  (db, pDb->zName)
3610: 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61  ;.      pDb->zNa
3620: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f  me = 0;.      co
3630: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
3640: 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20    if( j<i ){.   
3650: 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20     db->aDb[j] = 
3660: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
3670: 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20  }.    j++;.  }. 
3680: 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61 44 62   memset(&db->aDb
3690: 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e 44 62  [j], 0, (db->nDb
36a0: 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61  -j)*sizeof(db->a
36b0: 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e  Db[j]));.  db->n
36c0: 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62  Db = j;.  if( db
36d0: 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e  ->nDb<=2 && db->
36e0: 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61 74  aDb!=db->aDbStat
36f0: 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  ic ){.    memcpy
3700: 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c 20  (db->aDbStatic, 
3710: 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f  db->aDb, 2*sizeo
3720: 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a  f(db->aDb[0]));.
3730: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
3740: 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 29 3b 0a  e(db, db->aDb);.
3750: 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62      db->aDb = db
3760: 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20 7d  ->aDbStatic;.  }
3770: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
3780: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
3790: 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f   when a commit o
37a0: 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ccurs..*/.void s
37b0: 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65  qlite3CommitInte
37c0: 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69  rnalChanges(sqli
37d0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e  te3 *db){.  db->
37e0: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
37f0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
3800: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
3810: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64  memory allocated
3820: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
3830: 6e 61 6d 65 73 20 6f 66 20 61 20 74 61 62 6c 65  names of a table
3840: 20 6f 72 20 76 69 65 77 20 28 74 68 65 0a 2a 2a   or view (the.**
3850: 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61 72   Table.aCol[] ar
3860: 72 61 79 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ray)..*/.static 
3870: 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74  void sqliteDelet
3880: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 73 71 6c  eColumnNames(sql
3890: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
38a0: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20  *pTable){.  int 
38b0: 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  i;.  Column *pCo
38c0: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  l;.  assert( pTa
38d0: 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ble!=0 );.  if( 
38e0: 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e  (pCol = pTable->
38f0: 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  aCol)!=0 ){.    
3900: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c  for(i=0; i<pTabl
3910: 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  e->nCol; i++, pC
3920: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c  ol++){.      sql
3930: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3940: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
3950: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
3960: 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70  lete(db, pCol->p
3970: 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Dflt);.      sql
3980: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3990: 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20 20  Col->zDflt);.   
39a0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
39b0: 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  (db, pCol->zType
39c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
39d0: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
39e0: 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20  >zColl);.    }. 
39f0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3a00: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f  (db, pTable->aCo
3a10: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
3a20: 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f   Remove the memo
3a30: 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ry data structur
3a40: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
3a50: 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  th the given.** 
3a60: 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67  Table.  No chang
3a70: 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64  es are made to d
3a80: 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74  isk by this rout
3a90: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ine..**.** This 
3aa0: 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c  routine just del
3ab0: 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73 74  etes the data st
3ac0: 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65  ructure.  It doe
3ad0: 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20  s not unlink.** 
3ae0: 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20 73  the table data s
3af0: 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
3b00: 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42  e hash table.  B
3b10: 75 74 20 69 74 20 64 6f 65 73 20 64 65 73 74 72  ut it does destr
3b20: 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72  oy.** memory str
3b30: 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20 69  uctures of the i
3b40: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
3b50: 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74  gn keys associat
3b60: 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20  ed with .** the 
3b70: 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
3b80: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
3b90: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  e(sqlite3 *db, T
3ba0: 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20  able *pTable){. 
3bb0: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20   Index *pIndex, 
3bc0: 2a 70 4e 65 78 74 3b 0a 0a 20 20 61 73 73 65 72  *pNext;..  asser
3bd0: 74 28 20 21 70 54 61 62 6c 65 20 7c 7c 20 70 54  t( !pTable || pT
3be0: 61 62 6c 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  able->nRef>0 );.
3bf0: 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65 6c  .  /* Do not del
3c00: 65 74 65 20 74 68 65 20 74 61 62 6c 65 20 75 6e  ete the table un
3c10: 74 69 6c 20 74 68 65 20 72 65 66 65 72 65 6e 63  til the referenc
3c20: 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  e count reaches 
3c30: 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 21  zero. */.  if( !
3c40: 70 54 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b  pTable ) return;
3c50: 0a 20 20 69 66 28 20 28 28 21 64 62 20 7c 7c 20  .  if( ((!db || 
3c60: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
3c70: 3d 3d 30 29 20 26 26 20 28 2d 2d 70 54 61 62 6c  ==0) && (--pTabl
3c80: 65 2d 3e 6e 52 65 66 29 3e 30 29 20 29 20 72 65  e->nRef)>0) ) re
3c90: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  turn;..  /* Dele
3ca0: 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61  te all indices a
3cb0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
3cc0: 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  his table. */.  
3cd0: 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61  for(pIndex = pTa
3ce0: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e  ble->pIndex; pIn
3cf0: 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78  dex; pIndex=pNex
3d00: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
3d10: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
3d20: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65     assert( pInde
3d30: 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  x->pSchema==pTab
3d40: 6c 65 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20  le->pSchema );. 
3d50: 20 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62     if( !db || db
3d60: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
3d70: 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  0 ){.      char 
3d80: 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e 64 65 78 2d  *zName = pIndex-
3d90: 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20 20 20 20 54  >zName; .      T
3da0: 45 53 54 4f 4e 4c 59 20 28 20 49 6e 64 65 78 20  ESTONLY ( Index 
3db0: 2a 70 4f 6c 64 20 3d 20 29 20 73 71 6c 69 74 65  *pOld = ) sqlite
3dc0: 33 48 61 73 68 49 6e 73 65 72 74 28 0a 09 20 20  3HashInsert(..  
3dd0: 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61  &pIndex->pSchema
3de0: 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65  ->idxHash, zName
3df0: 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
3e00: 30 28 7a 4e 61 6d 65 29 2c 20 30 0a 20 20 20 20  0(zName), 0.    
3e10: 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
3e20: 74 28 20 70 4f 6c 64 3d 3d 70 49 6e 64 65 78 20  t( pOld==pIndex 
3e30: 7c 7c 20 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20  || pOld==0 );.  
3e40: 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65    }.    freeInde
3e50: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
3e60: 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
3e70: 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  any foreign keys
3e80: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 69   attached to thi
3e90: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71  s table. */.  sq
3ea0: 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28 64 62  lite3FkDelete(db
3eb0: 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a  , pTable);..  /*
3ec0: 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c   Delete the Tabl
3ed0: 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  e structure itse
3ee0: 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  lf..  */.  sqlit
3ef0: 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d  eDeleteColumnNam
3f00: 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  es(db, pTable);.
3f10: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3f20: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  db, pTable->zNam
3f30: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
3f40: 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  ree(db, pTable->
3f50: 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69  zColAff);.  sqli
3f60: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
3f70: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  db, pTable->pSel
3f80: 65 63 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ect);.#ifndef SQ
3f90: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
3fa0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
3fb0: 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  ete(db, pTable->
3fc0: 70 43 68 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a  pCheck);.#endif.
3fd0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3fe0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
3ff0: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c  .  sqlite3VtabCl
4000: 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ear(db, pTable);
4010: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
4020: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
4030: 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  le);.}../*.** Un
4040: 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74  link the given t
4050: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61  able from the ha
4060: 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68  sh tables and th
4070: 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20  e delete the.** 
4080: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
4090: 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64  with all its ind
40a0: 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e  ices and foreign
40b0: 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   keys..*/.void s
40c0: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
40d0: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
40e0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
40f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
4100: 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20  bName){.  Table 
4110: 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a  *p;.  Db *pDb;..
4120: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
4130: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
4140: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
4150: 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
4160: 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20 74 65  zTabName );.  te
4170: 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61 6d 65  stcase( zTabName
4180: 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a 65  [0]==0 );  /* Ze
4190: 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c 65 20  ro-length table 
41a0: 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f 77 65  names are allowe
41b0: 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62  d */.  pDb = &db
41c0: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20  ->aDb[iDb];.  p 
41d0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
41e0: 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  ert(&pDb->pSchem
41f0: 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61 62  a->tblHash, zTab
4200: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
4210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
4220: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
4230: 61 62 4e 61 6d 65 29 2c 30 29 3b 0a 20 20 73 71  abName),0);.  sq
4240: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
4250: 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d 3e 66  (db, p);.  db->f
4260: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
4270: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a  nternChanges;.}.
4280: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74  ./*.** Given a t
4290: 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73  oken, return a s
42a0: 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69  tring that consi
42b0: 73 74 73 20 6f 66 20 74 68 65 20 74 65 78 74 20  sts of the text 
42c0: 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e  of that.** token
42d0: 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
42e0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
42f0: 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69  ring.** is obtai
4300: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
4310: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
4320: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
4330: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
4340: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  tion..**.** Any 
4350: 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 20  quotation marks 
4360: 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20 27 6e  (ex:  "name", 'n
4370: 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72  ame', [name], or
4380: 20 60 6e 61 6d 65 60 29 20 74 68 61 74 0a 2a 2a   `name`) that.**
4390: 20 73 75 72 72 6f 75 6e 64 20 74 68 65 20 62 6f   surround the bo
43a0: 64 79 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20  dy of the token 
43b0: 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a  are removed..**.
43c0: 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66  ** Tokens are of
43d0: 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65 72  ten just pointer
43e0: 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69  s into the origi
43f0: 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64  nal SQL text and
4400: 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c   so.** are not \
4410: 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61  000 terminated a
4420: 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69  nd are not persi
4430: 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75  stent.  The retu
4440: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
4450: 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65  s \000 terminate
4460: 64 20 61 6e 64 20 69 73 20 70 65 72 73 69 73 74  d and is persist
4470: 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  ent..*/.char *sq
4480: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
4490: 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  en(sqlite3 *db, 
44a0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
44b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
44c0: 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20  if( pName ){.   
44d0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
44e0: 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
44f0: 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70  har*)pName->z, p
4500: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71  Name->n);.    sq
4510: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61  lite3Dequote(zNa
4520: 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me);.  }else{.  
4530: 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d    zName = 0;.  }
4540: 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
4550: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  .}../*.** Open t
4560: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
4570: 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e   table stored in
4580: 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   database number
4590: 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74   iDb for.** writ
45a0: 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69  ing. The table i
45b0: 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63  s opened using c
45c0: 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ursor 0..*/.void
45d0: 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74   sqlite3OpenMast
45e0: 65 72 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  erTable(Parse *p
45f0: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
4600: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
4610: 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73 71 6c  etVdbe(p);.  sql
4620: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  ite3TableLock(p,
4630: 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f 4f   iDb, MASTER_ROO
4640: 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54 41 42  T, 1, SCHEMA_TAB
4650: 4c 45 28 69 44 62 29 29 3b 0a 20 20 73 71 6c 69  LE(iDb));.  sqli
4660: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4670: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30   OP_OpenWrite, 0
4680: 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 69  , MASTER_ROOT, i
4690: 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Db);.  sqlite3Vd
46a0: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
46b0: 2c 20 28 63 68 61 72 20 2a 29 35 2c 20 50 34 5f  , (char *)5, P4_
46c0: 49 4e 54 33 32 29 3b 20 20 2f 2a 20 35 20 63 6f  INT32);  /* 5 co
46d0: 6c 75 6d 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20  lumn table */.  
46e0: 69 66 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29  if( p->nTab==0 )
46f0: 7b 0a 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20  {.    p->nTab = 
4700: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
4710: 50 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20  Parameter zName 
4720: 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d  points to a nul-
4730: 74 65 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65  terminated buffe
4740: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
4750: 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61   name.** of a da
4760: 74 61 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20  tabase ("main", 
4770: 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61  "temp" or the na
4780: 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65  me of an attache
4790: 64 20 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66  d db). This.** f
47a0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
47b0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
47c0: 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20   named database 
47d0: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72  in db->aDb[], or
47e0: 0a 2a 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61  .** -1 if the na
47f0: 6d 65 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65  med db cannot be
4800: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73   found..*/.int s
4810: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
4820: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
4830: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
4840: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20  {.  int i = -1; 
4850: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
4860: 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ase number */.  
4870: 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
4880: 20 44 62 20 2a 70 44 62 3b 0a 20 20 20 20 69 6e   Db *pDb;.    in
4890: 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t n = sqlite3Str
48a0: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20  len30(zName);.  
48b0: 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62    for(i=(db->nDb
48c0: 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44  -1), pDb=&db->aD
48d0: 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  b[i]; i>=0; i--,
48e0: 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69   pDb--){.      i
48f0: 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44 42  f( (!OMIT_TEMPDB
4900: 20 7c 7c 20 69 21 3d 31 20 29 20 26 26 20 6e 3d   || i!=1 ) && n=
4910: 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
4920: 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20  (pDb->zName) && 
4930: 0a 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71  .          0==sq
4940: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 44 62  lite3StrICmp(pDb
4950: 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20  ->zName, zName) 
4960: 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
4970: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4980: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
4990: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b  }../*.** The tok
49a0: 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69  en *pName contai
49b0: 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ns the name of a
49c0: 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65   database (eithe
49d0: 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22  r "main" or.** "
49e0: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
49f0: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
4a00: 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69   db). This routi
4a10: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
4a20: 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  * index of the n
4a30: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
4a40: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d   db->aDb[], or -
4a50: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
4a60: 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  b .** does not e
4a70: 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  xist..*/.int sql
4a80: 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74  ite3FindDb(sqlit
4a90: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
4aa0: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Name){.  int i; 
4ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4ad0: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
4ae0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
4af0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
4b00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
4b10: 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63 68  me we are search
4b20: 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61  ing for */.  zNa
4b30: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
4b40: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
4b50: 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69  ame);.  i = sqli
4b60: 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
4b70: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  , zName);.  sqli
4b80: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
4b90: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ame);.  return i
4ba0: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c  ;.}../* The tabl
4bb0: 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69  e or view or tri
4bc0: 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73  gger name is pas
4bd0: 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74  sed to this rout
4be0: 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a  ine via tokens.*
4bf0: 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61  * pName1 and pNa
4c00: 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c  me2. If the tabl
4c10: 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79  e name was fully
4c20: 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20   qualified, for 
4c30: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43  example:.**.** C
4c40: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e  REATE TABLE xxx.
4c50: 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a  yyy (...);.** .*
4c60: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
4c70: 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e   set to "xxx" an
4c80: 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20  d pName2 "yyy". 
4c90: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
4ca0: 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  d if.** the tabl
4cb0: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75  e name is not fu
4cc0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69  lly qualified, i
4cd0: 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  .e.:.**.** CREAT
4ce0: 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29  E TABLE yyy(...)
4cf0: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61  ;.**.** Then pNa
4d00: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79  me1 is set to "y
4d10: 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69  yy" and pName2 i
4d20: 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  s ""..**.** This
4d30: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
4d40: 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e  e *ppUnqual poin
4d50: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
4d60: 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65  the token (pName
4d70: 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20  1 or.** pName2) 
4d80: 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20  that stores the 
4d90: 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  unqualified tabl
4da0: 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64  e name.  The ind
4db0: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ex of the.** dat
4dc0: 61 62 61 73 65 20 22 78 78 78 22 20 69 73 20 72  abase "xxx" is r
4dd0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
4de0: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
4df0: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
4e00: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
4e10: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
4e20: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
4e30: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
4e40: 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  me1,      /* The
4e50: 20 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61   "xxx" in the na
4e60: 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20  me "xxx.yyy" or 
4e70: 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  "xxx" */.  Token
4e80: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f   *pName2,      /
4e90: 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e 20 74  * The "yyy" in t
4ea0: 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79  he name "xxx.yyy
4eb0: 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70  " */.  Token **p
4ec0: 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72  Unqual     /* Wr
4ed0: 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66  ite the unqualif
4ee0: 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ied object name 
4ef0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
4f00: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
4f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
4f20: 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  base holding the
4f30: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
4f40: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
4f50: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 41 4c  e->db;..  if( AL
4f60: 57 41 59 53 28 70 4e 61 6d 65 32 21 3d 30 29 20  WAYS(pName2!=0) 
4f70: 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29  && pName2->n>0 )
4f80: 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e  {.    if( db->in
4f90: 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20 20 20  it.busy ) {.    
4fa0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4fb0: 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72 72 75  g(pParse, "corru
4fc0: 70 74 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20  pt database");. 
4fd0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
4fe0: 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  r++;.      retur
4ff0: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n -1;.    }.    
5000: 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65  *pUnqual = pName
5010: 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  2;.    iDb = sql
5020: 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70  ite3FindDb(db, p
5030: 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20  Name1);.    if( 
5040: 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73  iDb<0 ){.      s
5050: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
5060: 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20  Parse, "unknown 
5070: 64 61 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e  database %T", pN
5080: 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 70 50 61  ame1);.      pPa
5090: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
50a0: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
50b0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
50c0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69   assert( db->ini
50d0: 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e  t.iDb==0 || db->
50e0: 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20  init.busy );.   
50f0: 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e   iDb = db->init.
5100: 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61  iDb;.    *pUnqua
5110: 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a  l = pName1;.  }.
5120: 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a    return iDb;.}.
5130: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
5140: 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 63  ine is used to c
5150: 68 65 63 6b 20 69 66 20 74 68 65 20 55 54 46 2d  heck if the UTF-
5160: 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69  8 string zName i
5170: 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71  s a legal.** unq
5180: 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 66 6f  ualified name fo
5190: 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61 20 6f  r a new schema o
51a0: 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20 69 6e  bject (table, in
51b0: 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20  dex, view or.** 
51c0: 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61  trigger). All na
51d0: 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20 65 78  mes are legal ex
51e0: 63 65 70 74 20 74 68 6f 73 65 20 74 68 61 74 20  cept those that 
51f0: 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 73  begin with the s
5200: 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65  tring.** "sqlite
5210: 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f  _" (in upper, lo
5220: 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63 61 73  wer or mixed cas
5230: 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69 6f 6e  e). This portion
5240: 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70 61 63   of the namespac
5250: 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76 65 64  e.** is reserved
5260: 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73   for internal us
5270: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
5280: 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65  3CheckObjectName
5290: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
52a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
52b0: 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61 72 73  e){.  if( !pPars
52c0: 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  e->db->init.busy
52d0: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74   && pParse->nest
52e0: 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  ed==0 .         
52f0: 20 26 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d   && (pParse->db-
5300: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
5310: 57 72 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a  WriteSchema)==0.
5320: 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d            && 0==
5330: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
5340: 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22  zName, "sqlite_"
5350: 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  , 7) ){.    sqli
5360: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5370: 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65  se, "object name
5380: 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e   reserved for in
5390: 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c  ternal use: %s",
53a0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74   zName);.    ret
53b0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
53c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
53d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
53e0: 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75  ** Begin constru
53f0: 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c  cting a new tabl
5400: 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
5410: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
5420: 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  s is.** the firs
5430: 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74  t of several act
5440: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ion routines tha
5450: 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20  t get called in 
5460: 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61  response.** to a
5470: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
5480: 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72  atement.  In par
5490: 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f  ticular, this ro
54a0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a  utine is called.
54b0: 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67 20  ** after seeing 
54c0: 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20  tokens "CREATE" 
54d0: 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20  and "TABLE" and 
54e0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  the table name. 
54f0: 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c  The isTemp.** fl
5500: 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  ag is true if th
5510: 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62  e table should b
5520: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
5530: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
5540: 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65  se.** file inste
5550: 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69  ad of in the mai
5560: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
5570: 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
5580: 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77  ly the case.** w
5590: 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f  hen the "TEMP" o
55a0: 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65  r "TEMPORARY" ke
55b0: 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20  yword occurs in 
55c0: 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54  between.** CREAT
55d0: 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a  E and TABLE..**.
55e0: 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65  ** The new table
55f0: 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69   record is initi
5600: 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69  alized and put i
5610: 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  n pParse->pNewTa
5620: 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20  ble..** As more 
5630: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
5640: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73  BLE statement is
5650: 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f   parsed, additio
5660: 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f  nal action.** ro
5670: 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63  utines will be c
5680: 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72  alled to add mor
5690: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
56a0: 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a   this record..**
56b0: 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   At the end of t
56c0: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
56d0: 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73  statement, the s
56e0: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29  qlite3EndTable()
56f0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
5700: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74  alled to complet
5710: 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69  e the constructi
5720: 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  on of the new ta
5730: 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76  ble record..*/.v
5740: 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61 72 74  oid sqlite3Start
5750: 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a  Table(.  Parse *
5760: 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72  pParse,   /* Par
5770: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
5780: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
5790: 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20    /* First part 
57a0: 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  of the name of t
57b0: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
57c0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
57d0: 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64  me2,   /* Second
57e0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d   part of the nam
57f0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  e of the table o
5800: 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  r view */.  int 
5810: 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20  isTemp,      /* 
5820: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
5830: 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a  a TEMP table */.
5840: 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20    int isView,   
5850: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
5860: 69 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a  is is a VIEW */.
5870: 20 20 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c    int isVirtual,
5880: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
5890: 69 73 20 69 73 20 61 20 56 49 52 54 55 41 4c 20  is is a VIRTUAL 
58a0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  table */.  int n
58b0: 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44  oErr        /* D
58c0: 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62  o nothing if tab
58d0: 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
58e0: 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  s */.){.  Table 
58f0: 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20  *pTable;.  char 
5900: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54  *zName = 0; /* T
5910: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e  he name of the n
5920: 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  ew table */.  sq
5930: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
5940: 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
5950: 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  v;.  int iDb;   
5960: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
5970: 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61  e number to crea
5980: 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20  te the table in 
5990: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
59a0: 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69  e;    /* Unquali
59b0: 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65  fied name of the
59c0: 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65   table to create
59d0: 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61   */..  /* The ta
59e0: 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65  ble or view name
59f0: 20 74 6f 20 63 72 65 61 74 65 20 69 73 20 70 61   to create is pa
5a00: 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75  ssed to this rou
5a10: 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a  tine via tokens.
5a20: 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20    ** pName1 and 
5a30: 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74  pName2. If the t
5a40: 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75  able name was fu
5a50: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66  lly qualified, f
5a60: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  or example:.  **
5a70: 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42  .  ** CREATE TAB
5a80: 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29  LE xxx.yyy (...)
5a90: 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65  ;.  ** .  ** The
5aa0: 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20  n pName1 is set 
5ab0: 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61  to "xxx" and pNa
5ac0: 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68  me2 "yyy". On th
5ad0: 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a  e other hand if.
5ae0: 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e    ** the table n
5af0: 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79  ame is not fully
5b00: 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e   qualified, i.e.
5b10: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41  :.  **.  ** CREA
5b20: 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e  TE TABLE yyy(...
5b30: 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  );.  **.  ** The
5b40: 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20  n pName1 is set 
5b50: 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61  to "yyy" and pNa
5b60: 6d 65 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a  me2 is ""..  **.
5b70: 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62 65    ** The call be
5b80: 6c 6f 77 20 73 65 74 73 20 74 68 65 20 70 4e 61  low sets the pNa
5b90: 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f  me pointer to po
5ba0: 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e  int at the token
5bb0: 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a   (pName1 or.  **
5bc0: 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74   pName2) that st
5bd0: 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69  ores the unquali
5be0: 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e  fied table name.
5bf0: 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 69 44   The variable iD
5c00: 62 20 69 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f  b is.  ** set to
5c10: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
5c20: 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  e database that 
5c30: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
5c40: 77 20 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20  w is to be.  ** 
5c50: 63 72 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f  created in..  */
5c60: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
5c70: 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
5c80: 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
5c90: 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69  e2, &pName);.  i
5ca0: 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72  f( iDb<0 ) retur
5cb0: 6e 3b 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  n;.  if( !OMIT_T
5cc0: 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20  EMPDB && isTemp 
5cd0: 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26  && pName2->n>0 &
5ce0: 26 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20  & iDb!=1 ){.    
5cf0: 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61  /* If creating a
5d00: 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65   temp table, the
5d10: 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65   name may not be
5d20: 20 71 75 61 6c 69 66 69 65 64 2e 20 55 6e 6c 65   qualified. Unle
5d30: 73 73 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 64  ss .    ** the d
5d40: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20  atabase name is 
5d50: 22 74 65 6d 70 22 20 61 6e 79 77 61 79 2e 20 20  "temp" anyway.  
5d60: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  */.    sqlite3Er
5d70: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
5d80: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
5d90: 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71  name must be unq
5da0: 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20  ualified");.    
5db0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
5dc0: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
5dd0: 26 20 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d  & isTemp ) iDb =
5de0: 20 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73   1;..  pParse->s
5df0: 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61  NameToken = *pNa
5e00: 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71  me;.  zName = sq
5e10: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
5e20: 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  en(db, pName);. 
5e30: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
5e40: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51  return;.  if( SQ
5e50: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
5e60: 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
5e70: 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29  pParse, zName) )
5e80: 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e  {.    goto begin
5e90: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
5ea0: 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  }.  if( db->init
5eb0: 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70  .iDb==1 ) isTemp
5ec0: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
5ed0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
5ee0: 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74  IZATION.  assert
5ef0: 28 20 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d  ( (isTemp & 1)==
5f00: 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20  isTemp );.  {.  
5f10: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20    int code;.    
5f20: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
5f30: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
5f40: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
5f50: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
5f60: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
5f70: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54  SCHEMA_TABLE(isT
5f80: 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b  emp), 0, zDb) ){
5f90: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
5fa0: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
5fb0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56     }.    if( isV
5fc0: 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28  iew ){.      if(
5fd0: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
5fe0: 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20   isTemp ){.     
5ff0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
6000: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45  _CREATE_TEMP_VIE
6010: 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  W;.      }else{.
6020: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
6030: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45  QLITE_CREATE_VIE
6040: 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  W;.      }.    }
6050: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
6060: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
6070: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
6080: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
6090: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c  CREATE_TEMP_TABL
60a0: 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
60b0: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
60c0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42  QLITE_CREATE_TAB
60d0: 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LE;.      }.    
60e0: 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 72  }.    if( !isVir
60f0: 74 75 61 6c 20 26 26 20 73 71 6c 69 74 65 33 41  tual && sqlite3A
6100: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
6110: 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c   code, zName, 0,
6120: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
6130: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
6140: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  error;.    }.  }
6150: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61  .#endif..  /* Ma
6160: 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20  ke sure the new 
6170: 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20  table name does 
6180: 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68  not collide with
6190: 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a   an existing.  *
61a0: 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
61b0: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61 6d   name in the sam
61c0: 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 73 73  e database.  Iss
61d0: 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ue an error mess
61e0: 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20 64  age if.  ** it d
61f0: 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70 74 69  oes. The excepti
6200: 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73 74 61  on is if the sta
6210: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70 61 72  tement being par
6220: 73 65 64 20 77 61 73 20 70 61 73 73 65 64 0a 20  sed was passed. 
6230: 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74 65   ** to an sqlite
6240: 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29  3_declare_vtab()
6250: 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63   call. In that c
6260: 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c  ase only the col
6270: 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61  umn names.  ** a
6280: 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20 62 65  nd types will be
6290: 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72 65 20   used, so there 
62a0: 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65  is no need to te
62b0: 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61 63 65  st for namespace
62c0: 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73  .  ** collisions
62d0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e  ..  */.  if( !IN
62e0: 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b  _DECLARE_VTAB ){
62f0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d  .    char *zDb =
6300: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
6310: 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  ame;.    if( SQL
6320: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
6330: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
6340: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
6350: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
6360: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  r;.    }.    pTa
6370: 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ble = sqlite3Fin
6380: 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
6390: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , zDb);.    if( 
63a0: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  pTable ){.      
63b0: 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20  if( !noErr ){.  
63c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
63d0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
63e0: 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20  able %T already 
63f0: 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b  exists", pName);
6400: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
6410: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
6420: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
6430: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
6440: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
6450: 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20   zDb)!=0 ){.    
6460: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
6470: 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
6480: 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69   is already an i
6490: 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20  ndex named %s", 
64a0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  zName);.      go
64b0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
64c0: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
64d0: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
64e0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
64f0: 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
6500: 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65  ));.  if( pTable
6510: 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  ==0 ){.    db->m
6520: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
6530: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
6540: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
6550: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
6560: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67  ++;.    goto beg
6570: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
6580: 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e    }.  pTable->zN
6590: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70  ame = zName;.  p
65a0: 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d  Table->iPKey = -
65b0: 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63  1;.  pTable->pSc
65c0: 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69  hema = db->aDb[i
65d0: 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70  Db].pSchema;.  p
65e0: 54 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b  Table->nRef = 1;
65f0: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 45  .  pTable->nRowE
6600: 73 74 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20  st = 1000000;.  
6610: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
6620: 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  pNewTable==0 );.
6630: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
6640: 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20  ble = pTable;.. 
6650: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
6660: 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f  he magic sqlite_
6670: 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75  sequence table u
6680: 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65  sed by autoincre
6690: 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  ment,.  ** then 
66a0: 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72  record a pointer
66b0: 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69   to this table i
66c0: 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
66d0: 61 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20  ase structure.  
66e0: 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52  ** so that INSER
66f0: 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74  T can find the t
6700: 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a  able easily..  *
6710: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
6720: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
6730: 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72 73  ENT.  if( !pPars
6740: 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72  e->nested && str
6750: 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  cmp(zName, "sqli
6760: 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30  te_sequence")==0
6770: 20 29 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e   ){.    pTable->
6780: 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62  pSchema->pSeqTab
6790: 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23   = pTable;.  }.#
67a0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69  endif..  /* Begi
67b0: 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65  n generating the
67c0: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
67d0: 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65  insert the table
67e0: 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a   record into.  *
67f0: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  * the SQLITE_MAS
6800: 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65  TER table.  Note
6810: 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74   in particular t
6820: 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61  hat we must go a
6830: 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c  head.  ** and al
6840: 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72  locate the recor
6850: 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  d number for the
6860: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77   table entry now
6870: 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20  .  Before any.  
6880: 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  ** PRIMARY KEY o
6890: 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64  r UNIQUE keyword
68a0: 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54  s are parsed.  T
68b0: 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69  hose keywords wi
68c0: 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e  ll cause.  ** in
68d0: 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61  dices to be crea
68e0: 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c  ted and the tabl
68f0: 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f  e record must co
6900: 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20  me before the . 
6910: 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65   ** indices.  He
6920: 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20  nce, the record 
6930: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
6940: 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c  able must be all
6950: 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e  ocated.  ** now.
6960: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
6970: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76  >init.busy && (v
6980: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
6990: 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b  e(pParse))!=0 ){
69a0: 0a 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20 20  .    int j1;.   
69b0: 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b   int fileFormat;
69c0: 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20 72  .    int reg1, r
69d0: 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20 73  eg2, reg3;.    s
69e0: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
69f0: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
6a00: 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e  , 0, iDb);..#ifn
6a10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6a20: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
6a30: 20 69 66 28 20 69 73 56 69 72 74 75 61 6c 20 29   if( isVirtual )
6a40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
6a50: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
6a60: 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 23  VBegin);.    }.#
6a70: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
6a80: 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74   the file format
6a90: 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e   and encoding in
6aa0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
6ab0: 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c  ve not been set,
6ac0: 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65   .    ** set the
6ad0: 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  m now..    */.  
6ae0: 20 20 72 65 67 31 20 3d 20 70 50 61 72 73 65 2d    reg1 = pParse-
6af0: 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50  >regRowid = ++pP
6b00: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
6b10: 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e 72  reg2 = pParse->r
6b20: 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72 73  egRoot = ++pPars
6b30: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67  e->nMem;.    reg
6b40: 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  3 = ++pParse->nM
6b50: 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
6b60: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6b70: 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  ReadCookie, iDb,
6b80: 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46 49 4c   reg3, BTREE_FIL
6b90: 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20 73  E_FORMAT);.    s
6ba0: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
6bb0: 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20  ree(v, iDb);.   
6bc0: 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
6bd0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
6be0: 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 66 69 6c  , reg3);.    fil
6bf0: 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66  eFormat = (db->f
6c00: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 65  lags & SQLITE_Le
6c10: 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30 20  gacyFileFmt)!=0 
6c20: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
6c30: 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d      1 : SQLITE_M
6c40: 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a  AX_FILE_FORMAT;.
6c50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6c60: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
6c70: 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61 74 2c  ger, fileFormat,
6c80: 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69   reg3);.    sqli
6c90: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6ca0: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
6cb0: 44 62 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46  Db, BTREE_FILE_F
6cc0: 4f 52 4d 41 54 2c 20 72 65 67 33 29 3b 0a 20 20  ORMAT, reg3);.  
6cd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6ce0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
6cf0: 72 2c 20 45 4e 43 28 64 62 29 2c 20 72 65 67 33  r, ENC(db), reg3
6d00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6d10: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
6d20: 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42  etCookie, iDb, B
6d30: 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49  TREE_TEXT_ENCODI
6d40: 4e 47 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73  NG, reg3);.    s
6d50: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
6d60: 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 20 20  re(v, j1);..    
6d70: 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72 65  /* This just cre
6d80: 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c  ates a place-hol
6d90: 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68  der record in th
6da0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
6db0: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68  table..    ** Th
6dc0: 65 20 72 65 63 6f 72 64 20 63 72 65 61 74 65 64  e record created
6dd0: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
6de0: 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20  n anything yet. 
6df0: 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c   It will be repl
6e00: 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  aced.    ** by t
6e10: 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e  he real entry in
6e20: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
6e30: 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  at sqlite3EndTab
6e40: 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  le()..    **.   
6e50: 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f   ** The rowid fo
6e60: 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  r the new entry 
6e70: 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73  is left in regis
6e80: 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52  ter pParse->regR
6e90: 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65  owid..    ** The
6ea0: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
6eb0: 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  r of the new tab
6ec0: 6c 65 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65  le is left in re
6ed0: 67 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f  g pParse->regRoo
6ee0: 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  t..    ** The ro
6ef0: 77 69 64 20 61 6e 64 20 72 6f 6f 74 20 70 61 67  wid and root pag
6f00: 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 65 73 20  e number values 
6f10: 61 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68  are needed by th
6f20: 65 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20  e code that.    
6f30: 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  ** sqlite3EndTab
6f40: 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  le will generate
6f50: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64 65  ..    */.#if !de
6f60: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6f70: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
6f80: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
6f90: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
6fa0: 20 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c 20    if( isView || 
6fb0: 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20  isVirtual ){.   
6fc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6fd0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
6fe0: 65 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20 20  er, 0, reg2);.  
6ff0: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
7000: 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74     {.      sqlit
7010: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7020: 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20  OP_CreateTable, 
7030: 69 44 62 2c 20 72 65 67 32 29 3b 0a 20 20 20 20  iDb, reg2);.    
7040: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65  }.    sqlite3Ope
7050: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50 61  nMasterTable(pPa
7060: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  rse, iDb);.    s
7070: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7080: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
7090: 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73   0, reg1);.    s
70a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
70b0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
70c0: 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74  reg3);.    sqlit
70d0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
70e0: 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 72 65  OP_Insert, 0, re
70f0: 67 33 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73  g3, reg1);.    s
7100: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
7110: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
7120: 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  END);.    sqlite
7130: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
7140: 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a 20  P_Close);.  }.. 
7150: 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d   /* Normal (non-
7160: 65 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a  error) return. *
7170: 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  /.  return;..  /
7180: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
7190: 63 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68 65  curs, we jump he
71a0: 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c  re */.begin_tabl
71b0: 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74  e_error:.  sqlit
71c0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
71d0: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  me);.  return;.}
71e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63  ../*.** This mac
71f0: 72 6f 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  ro is used to co
7200: 6d 70 61 72 65 20 74 77 6f 20 73 74 72 69 6e 67  mpare two string
7210: 73 20 69 6e 20 61 20 63 61 73 65 2d 69 6e 73 65  s in a case-inse
7220: 6e 73 69 74 69 76 65 20 6d 61 6e 6e 65 72 2e 0a  nsitive manner..
7230: 2a 2a 20 49 74 20 69 73 20 73 6c 69 67 68 74 6c  ** It is slightl
7240: 79 20 66 61 73 74 65 72 20 74 68 61 6e 20 63 61  y faster than ca
7250: 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 53 74 72  lling sqlite3Str
7260: 49 43 6d 70 28 29 20 64 69 72 65 63 74 6c 79 2c  ICmp() directly,
7270: 20 62 75 74 0a 2a 2a 20 70 72 6f 64 75 63 65 73   but.** produces
7280: 20 6c 61 72 67 65 72 20 63 6f 64 65 2e 0a 2a 2a   larger code..**
7290: 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68 69  .** WARNING: Thi
72a0: 73 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 63  s macro is not c
72b0: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
72c0: 68 65 20 73 74 72 63 6d 70 28 29 20 66 61 6d 69  he strcmp() fami
72d0: 6c 79 2e 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e  ly. It.** return
72e0: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74 77  s true if the tw
72f0: 6f 20 73 74 72 69 6e 67 73 20 61 72 65 20 65 71  o strings are eq
7300: 75 61 6c 2c 20 6f 74 68 65 72 77 69 73 65 20 66  ual, otherwise f
7310: 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  alse..*/.#define
7320: 20 53 54 52 49 43 4d 50 28 78 2c 20 79 29 20 28   STRICMP(x, y) (
7330: 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f  \.sqlite3UpperTo
7340: 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64  Lower[*(unsigned
7350: 20 63 68 61 72 20 2a 29 28 78 29 5d 3d 3d 20 20   char *)(x)]==  
7360: 20 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54   \.sqlite3UpperT
7370: 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65  oLower[*(unsigne
7380: 64 20 63 68 61 72 20 2a 29 28 79 29 5d 20 20 20  d char *)(y)]   
7390: 20 20 5c 0a 26 26 20 73 71 6c 69 74 65 33 53 74    \.&& sqlite3St
73a0: 72 49 43 6d 70 28 28 78 29 2b 31 2c 28 79 29 2b  rICmp((x)+1,(y)+
73b0: 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41  1)==0 )../*.** A
73c0: 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20  dd a new column 
73d0: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
73e0: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e  rently being con
73f0: 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  structed..**.** 
7400: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
7410: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   this routine on
7420: 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ce for each colu
7430: 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  mn declaration.*
7440: 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41  * in a CREATE TA
7450: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
7460: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
7470: 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a  e() gets called.
7480: 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74 20  ** first to get 
7490: 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54  things going.  T
74a0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
74b0: 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65   is called for e
74c0: 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a  ach.** column..*
74d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
74e0: 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70  dColumn(Parse *p
74f0: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
7500: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
7510: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
7520: 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  r *z;.  Column *
7530: 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20  pCol;.  sqlite3 
7540: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
7550: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
7560: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
7570: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66  =0 ) return;.#if
7580: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
7590: 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c  MN.  if( p->nCol
75a0: 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  +1>db->aLimit[SQ
75b0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
75c0: 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  N] ){.    sqlite
75d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
75e0: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
75f0: 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a  mns on %s", p->z
7600: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
7610: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  n;.  }.#endif.  
7620: 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  z = sqlite3NameF
7630: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61  romToken(db, pNa
7640: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  me);.  if( z==0 
7650: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
7660: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
7670: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 54  i++){.    if( ST
7680: 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43 6f 6c  RICMP(z, p->aCol
7690: 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  [i].zName) ){.  
76a0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
76b0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75 70  Msg(pParse, "dup
76c0: 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61  licate column na
76d0: 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20  me: %s", z);.   
76e0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
76f0: 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72  (db, z);.      r
7700: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
7710: 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20  .  if( (p->nCol 
7720: 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20  & 0x7)==0 ){.   
7730: 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20   Column *aNew;. 
7740: 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65     aNew = sqlite
7750: 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70 2d  3DbRealloc(db,p-
7760: 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38  >aCol,(p->nCol+8
7770: 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  )*sizeof(p->aCol
7780: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61  [0]));.    if( a
7790: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
77a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
77b0: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , z);.      retu
77c0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  rn;.    }.    p-
77d0: 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20  >aCol = aNew;.  
77e0: 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61  }.  pCol = &p->a
77f0: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20  Col[p->nCol];.  
7800: 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20  memset(pCol, 0, 
7810: 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30  sizeof(p->aCol[0
7820: 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61  ]));.  pCol->zNa
7830: 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49  me = z;. .  /* I
7840: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79  f there is no ty
7850: 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f  pe specified, co
7860: 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64  lumns have the d
7870: 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a  efault affinity.
7880: 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20    ** 'NONE'. If 
7890: 74 68 65 72 65 20 69 73 20 61 20 74 79 70 65 20  there is a type 
78a0: 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20  specified, then 
78b0: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
78c0: 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a  Type() will.  **
78d0: 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78 74 20   be called next 
78e0: 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66  to set pCol->aff
78f0: 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c 79 2e  inity correctly.
7900: 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66  .  */.  pCol->af
7910: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
7920: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 6e  AFF_NONE;.  p->n
7930: 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Col++;.}../*.** 
7940: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
7950: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
7960: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
7970: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
7980: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
7990: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
79a0: 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63    A "NOT NULL" c
79b0: 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a  onstraint has.**
79c0: 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20   been seen on a 
79d0: 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f  column.  This ro
79e0: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e  utine sets the n
79f0: 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a  otNull flag on.*
7a00: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72  * the column cur
7a10: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
7a20: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
7a30: 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74  id sqlite3AddNot
7a40: 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72  Null(Parse *pPar
7a50: 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29  se, int onError)
7a60: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
7a70: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
7a80: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
7a90: 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43  0 || NEVER(p->nC
7aa0: 6f 6c 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a  ol<1) ) return;.
7ab0: 20 20 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f    p->aCol[p->nCo
7ac0: 6c 2d 31 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28  l-1].notNull = (
7ad0: 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f  u8)onError;.}../
7ae0: 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f  *.** Scan the co
7af0: 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a  lumn type name z
7b00: 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79  Type (length nTy
7b10: 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74  pe) and return t
7b20: 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  he.** associated
7b30: 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a   affinity type..
7b40: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
7b50: 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69  ne does a case-i
7b60: 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63  ndependent searc
7b70: 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74  h of zType for t
7b80: 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67  he .** substring
7b90: 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s in the followi
7ba0: 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65  ng table. If one
7bb0: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
7bc0: 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20  gs is.** found, 
7bd0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
7be0: 67 20 61 66 66 69 6e 69 74 79 20 69 73 20 72 65  g affinity is re
7bf0: 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65  turned. If zType
7c00: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72   contains.** mor
7c10: 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68  e than one of th
7c20: 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e  e substrings, en
7c30: 74 72 69 65 73 20 74 6f 77 61 72 64 20 74 68 65  tries toward the
7c40: 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20   top of .** the 
7c50: 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72  table take prior
7c60: 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ity. For example
7c70: 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20 27 42  , if zType is 'B
7c80: 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c  LOBINT', .** SQL
7c90: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
7ca0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
7cb0: 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20 20  ** Substring    
7cc0: 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d   | Affinity.** -
7cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
7cf0: 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20 20  ** 'INT'        
7d00: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   | SQLITE_AFF_IN
7d10: 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20  TEGER.** 'CHAR' 
7d20: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
7d30: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f  AFF_TEXT.** 'CLO
7d40: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
7d50: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
7d60: 54 45 58 54 27 20 20 20 20 20 20 20 20 7c 20 53  TEXT'        | S
7d70: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a  QLITE_AFF_TEXT.*
7d80: 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20  * 'BLOB'        
7d90: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  | SQLITE_AFF_NON
7da0: 45 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20  E.** 'REAL'     
7db0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
7dc0: 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20  REAL.** 'FLOA'  
7dd0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
7de0: 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42  FF_REAL.** 'DOUB
7df0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
7e00: 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a  E_AFF_REAL.**.**
7e10: 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   If none of the 
7e20: 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68  substrings in th
7e30: 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72  e above table ar
7e40: 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49  e found,.** SQLI
7e50: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69  TE_AFF_NUMERIC i
7e60: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63  s returned..*/.c
7e70: 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e  har sqlite3Affin
7e80: 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68  ityType(const ch
7e90: 61 72 20 2a 7a 49 6e 29 7b 0a 20 20 75 33 32 20  ar *zIn){.  u32 
7ea0: 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66  h = 0;.  char af
7eb0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  f = SQLITE_AFF_N
7ec0: 55 4d 45 52 49 43 3b 0a 0a 20 20 69 66 28 20 7a  UMERIC;..  if( z
7ed0: 49 6e 20 29 20 77 68 69 6c 65 28 20 7a 49 6e 5b  In ) while( zIn[
7ee0: 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20 28 68  0] ){.    h = (h
7ef0: 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55 70  <<8) + sqlite3Up
7f00: 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e  perToLower[(*zIn
7f10: 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49 6e  )&0xff];.    zIn
7f20: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28  ++;.    if( h==(
7f30: 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c  ('c'<<24)+('h'<<
7f40: 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27  16)+('a'<<8)+'r'
7f50: 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  ) ){            
7f60: 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20   /* CHAR */.    
7f70: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
7f80: 46 46 5f 54 45 58 54 3b 20 0a 20 20 20 20 7d 65  FF_TEXT; .    }e
7f90: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27  lse if( h==(('c'
7fa0: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
7fb0: 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b  ('o'<<8)+'b') ){
7fc0: 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a         /* CLOB *
7fd0: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
7fe0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
7ff0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
8000: 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c  (('t'<<24)+('e'<
8010: 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74  <16)+('x'<<8)+'t
8020: 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54  ') ){       /* T
8030: 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  EXT */.      aff
8040: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   = SQLITE_AFF_TE
8050: 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  XT;.    }else if
8060: 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b  ( h==(('b'<<24)+
8070: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
8080: 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20  8)+'b')         
8090: 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20   /* BLOB */.    
80a0: 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c      && (aff==SQL
80b0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
80c0: 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
80d0: 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20 20  FF_REAL) ){.    
80e0: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
80f0: 46 46 5f 4e 4f 4e 45 3b 0a 23 69 66 6e 64 65 66  FF_NONE;.#ifndef
8100: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
8110: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
8120: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
8130: 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36  r'<<24)+('e'<<16
8140: 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20  )+('a'<<8)+'l') 
8150: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41 4c           /* REAL
8160: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
8170: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
8180: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
8190: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
81a0: 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _REAL;.    }else
81b0: 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32   if( h==(('f'<<2
81c0: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
81d0: 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20 20 20  '<<8)+'a')      
81e0: 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20      /* FLOA */. 
81f0: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
8200: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
8210: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
8220: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
8230: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8240: 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28 27  h==(('d'<<24)+('
8250: 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29  o'<<16)+('u'<<8)
8260: 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'b')          /
8270: 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20  * DOUB */.      
8280: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
8290: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
82a0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
82b0: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e  TE_AFF_REAL;.#en
82c0: 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  dif.    }else if
82d0: 28 20 28 68 26 30 78 30 30 46 46 46 46 46 46 29  ( (h&0x00FFFFFF)
82e0: 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e  ==(('i'<<16)+('n
82f0: 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20  '<<8)+'t') ){   
8300: 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20   /* INT */.     
8310: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
8320: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20  F_INTEGER;.     
8330: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
8340: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b  }..  return aff;
8350: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
8360: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8370: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
8380: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
8390: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
83a0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
83b0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
83c0: 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73 20  pFirst token is 
83d0: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b  the first.** tok
83e0: 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e  en in the sequen
83f0: 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61  ce of tokens tha
8400: 74 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74  t describe the t
8410: 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  ype of the.** co
8420: 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75  lumn currently u
8430: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
8440: 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74 68  n.   pLast is th
8450: 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20  e last token.** 
8460: 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 2e  in the sequence.
8470: 20 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f 72    Use this infor
8480: 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72  mation to constr
8490: 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20  uct a string.** 
84a0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
84b0: 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74 68  e typename of th
84c0: 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f  e column and sto
84d0: 72 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a 2a  re that string.*
84e0: 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a  * in zType..*/ .
84f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
8500: 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20  olumnType(Parse 
8510: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
8520: 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20  pType){.  Table 
8530: 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *p;.  Column *pC
8540: 6f 6c 3b 0a 0a 20 20 70 20 3d 20 70 50 61 72 73  ol;..  p = pPars
8550: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
8560: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45  if( p==0 || NEVE
8570: 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72  R(p->nCol<1) ) r
8580: 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20  eturn;.  pCol = 
8590: 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c  &p->aCol[p->nCol
85a0: 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  -1];.  assert( p
85b0: 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20 29 3b  Col->zType==0 );
85c0: 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d  .  pCol->zType =
85d0: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
85e0: 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62  Token(pParse->db
85f0: 2c 20 70 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c  , pType);.  pCol
8600: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c  ->affinity = sql
8610: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
8620: 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 7d  (pCol->zType);.}
8630: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72  ../*.** The expr
8640: 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65  ession is the de
8650: 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
8660: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
8670: 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a  y added column.*
8680: 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  * of the table c
8690: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
86a0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a  onstruction..**.
86b0: 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65  ** Default value
86c0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73   expressions mus
86d0: 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20  t be constant.  
86e0: 52 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69  Raise an excepti
86f0: 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73  on if this.** is
8700: 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a   not the case..*
8710: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8720: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
8730: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
8740: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
8750: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
8760: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
8770: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
8780: 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56  lite3AddDefaultV
8790: 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72  alue(Parse *pPar
87a0: 73 65 2c 20 45 78 70 72 53 70 61 6e 20 2a 70 53  se, ExprSpan *pS
87b0: 70 61 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  pan){.  Table *p
87c0: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
87d0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
87e0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
87f0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
8800: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d  Table;.  if( p!=
8810: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20  0 ){.    pCol = 
8820: 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f  &(p->aCol[p->nCo
8830: 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 21  l-1]);.    if( !
8840: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
8850: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
8860: 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 20 29 7b  pSpan->pExpr) ){
8870: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
8880: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8890: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66  default value of
88a0: 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20   column [%s] is 
88b0: 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20  not constant",. 
88c0: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a           pCol->z
88d0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
88e0: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 70  {.      /* A cop
88f0: 79 20 6f 66 20 70 45 78 70 72 20 69 73 20 75 73  y of pExpr is us
8900: 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ed instead of th
8910: 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20 70  e original, as p
8920: 45 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20 20  Expr contains.  
8930: 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74 68      ** tokens th
8940: 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c 61  at point to vola
8950: 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 20 54 68 65  tile memory. The
8960: 20 27 73 70 61 6e 27 20 6f 66 20 74 68 65 20 65   'span' of the e
8970: 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 20 20  xpression.      
8980: 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 20 62  ** is required b
8990: 79 20 70 72 61 67 6d 61 20 74 61 62 6c 65 5f 69  y pragma table_i
89a0: 6e 66 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  nfo..      */.  
89b0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
89c0: 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  elete(db, pCol->
89d0: 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43  pDflt);.      pC
89e0: 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69  ol->pDflt = sqli
89f0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
8a00: 53 70 61 6e 2d 3e 70 45 78 70 72 2c 20 45 58 50  Span->pExpr, EXP
8a10: 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
8a20: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8a30: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66 6c  e(db, pCol->zDfl
8a40: 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e  t);.      pCol->
8a50: 7a 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 44  zDflt = sqlite3D
8a60: 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68  bStrNDup(db, (ch
8a70: 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72  ar*)pSpan->zStar
8a80: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
8a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8aa0: 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70 53          (int)(pS
8ab0: 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61  pan->zEnd - pSpa
8ac0: 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20 20  n->zStart));.   
8ad0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
8ae0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
8af0: 53 70 61 6e 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a  Span->pExpr);.}.
8b00: 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65  ./*.** Designate
8b10: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
8b20: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20   for the table. 
8b30: 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74   pList is a list
8b40: 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66   of names .** of
8b50: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f   columns that fo
8b60: 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  rm the primary k
8b70: 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  ey.  If pList is
8b80: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a   NULL, then the.
8b90: 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  ** most recently
8ba0: 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66   added column of
8bb0: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68   the table is th
8bc0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a  e primary key..*
8bd0: 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e  *.** A table can
8be0: 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e   have at most on
8bf0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20  e primary key.  
8c00: 49 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72  If the table alr
8c10: 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72  eady has.** a pr
8c20: 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74  imary key (and t
8c30: 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e  his is the secon
8c40: 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74  d primary key) t
8c50: 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a  hen create an.**
8c60: 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66   error..**.** If
8c70: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
8c80: 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20   is on a single 
8c90: 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74  column whose dat
8ca0: 61 74 79 70 65 20 69 73 20 49 4e 54 45 47 45 52  atype is INTEGER
8cb0: 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c  ,.** then we wil
8cc0: 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 61  l try to use tha
8cd0: 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20  t column as the 
8ce0: 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65 20  rowid.  Set the 
8cf0: 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66  Table.iPKey.** f
8d00: 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c  ield of the tabl
8d10: 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
8d20: 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69  tion to be the i
8d30: 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49  ndex of the.** I
8d40: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
8d50: 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c  EY column.  Tabl
8d60: 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74  e.iPKey is set t
8d70: 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73  o -1 if there is
8d80: 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50  .** no INTEGER P
8d90: 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a  RIMARY KEY..**.*
8da0: 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20  * If the key is 
8db0: 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50  not an INTEGER P
8dc0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e  RIMARY KEY, then
8dd0: 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65   create a unique
8de0: 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68  .** index for th
8df0: 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78  e key.  No index
8e00: 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20   is created for 
8e10: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
8e20: 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  KEYs..*/.void sq
8e30: 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b  lite3AddPrimaryK
8e40: 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ey(.  Parse *pPa
8e50: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
8e60: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
8e70: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
8e80: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65    /* List of fie
8e90: 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69  ld names to be i
8ea0: 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
8eb0: 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a  onError,      /*
8ec0: 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
8ed0: 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f   a uniqueness co
8ee0: 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20  nflict */.  int 
8ef0: 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a  autoInc,      /*
8f00: 20 54 72 75 65 20 69 66 20 74 68 65 20 41 55 54   True if the AUT
8f10: 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f  OINCREMENT keywo
8f20: 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
8f30: 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
8f40: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53       /* SQLITE_S
8f50: 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f  O_ASC or SQLITE_
8f60: 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20  SO_DESC */.){.  
8f70: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50  Table *pTab = pP
8f80: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
8f90: 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d  .  char *zType =
8fa0: 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d   0;.  int iCol =
8fb0: 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20 70 54   -1, i;.  if( pT
8fc0: 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c  ab==0 || IN_DECL
8fd0: 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20  ARE_VTAB ) goto 
8fe0: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
8ff0: 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61  ;.  if( pTab->ta
9000: 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50  bFlags & TF_HasP
9010: 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20 20  rimaryKey ){.   
9020: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9030: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
9040: 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61  "table \"%s\" ha
9050: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
9060: 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54  primary key", pT
9070: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
9080: 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79  goto primary_key
9090: 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61  _exit;.  }.  pTa
90a0: 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
90b0: 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 3b  F_HasPrimaryKey;
90c0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
90d0: 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54  ){.    iCol = pT
90e0: 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20  ab->nCol - 1;.  
90f0: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f    pTab->aCol[iCo
9100: 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31  l].isPrimKey = 1
9110: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
9120: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
9130: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
9140: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
9150: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
9160: 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
9170: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
9180: 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
9190: 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43  .zName, pTab->aC
91a0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d  ol[iCol].zName)=
91b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
91c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
91d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
91e0: 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  f( iCol<pTab->nC
91f0: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  ol ){.        pT
9200: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69  ab->aCol[iCol].i
9210: 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20  sPrimKey = 1;.  
9220: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9230: 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  if( pList->nExpr
9240: 3e 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a  >1 ) iCol = -1;.
9250: 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d    }.  if( iCol>=
9260: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
9270: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70  nCol ){.    zTyp
9280: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e = pTab->aCol[i
9290: 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a  Col].zType;.  }.
92a0: 20 20 69 66 28 20 7a 54 79 70 65 20 26 26 20 73    if( zType && s
92b0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
92c0: 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d  ype, "INTEGER")=
92d0: 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 73 6f  =0.        && so
92e0: 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f  rtOrder==SQLITE_
92f0: 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 70 54  SO_ASC ){.    pT
9300: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c  ab->iPKey = iCol
9310: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43  ;.    pTab->keyC
9320: 6f 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f  onf = (u8)onErro
9330: 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  r;.    assert( a
9340: 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74  utoInc==0 || aut
9350: 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70  oInc==1 );.    p
9360: 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
9370: 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f   autoInc*TF_Auto
9380: 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 7d 65 6c  increment;.  }el
9390: 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20 29  se if( autoInc )
93a0: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
93b0: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
93c0: 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ENT.    sqlite3E
93d0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
93e0: 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69  "AUTOINCREMENT i
93f0: 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f  s only allowed o
9400: 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22 49  n an ".       "I
9410: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
9420: 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  EY");.#endif.  }
9430: 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65 78 20  else{.    Index 
9440: 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  *p;.    p = sqli
9450: 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70  te3CreateIndex(p
9460: 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20  Parse, 0, 0, 0, 
9470: 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20  pList, onError, 
9480: 30 2c 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c  0, 0, sortOrder,
9490: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29   0);.    if( p )
94a0: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 49  {.      p->autoI
94b0: 6e 64 65 78 20 3d 20 32 3b 0a 20 20 20 20 7d 0a  ndex = 2;.    }.
94c0: 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20      pList = 0;. 
94d0: 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f   }..primary_key_
94e0: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45  exit:.  sqlite3E
94f0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
9500: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29  arse->db, pList)
9510: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
9520: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 43  *.** Add a new C
9530: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
9540: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
9550: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
9560: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
9570: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 68 65  id sqlite3AddChe
9580: 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  ckConstraint(.  
9590: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
95a0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
95b0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
95c0: 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20 54  pCheckExpr  /* T
95d0: 68 65 20 63 68 65 63 6b 20 65 78 70 72 65 73 73  he check express
95e0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ion */.){.  sqli
95f0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
9600: 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51  ->db;.#ifndef SQ
9610: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
9620: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
9630: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
9640: 65 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26 26  e;.  if( pTab &&
9650: 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41   !IN_DECLARE_VTA
9660: 42 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 70  B ){.    pTab->p
9670: 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  Check = sqlite3E
9680: 78 70 72 41 6e 64 28 64 62 2c 20 70 54 61 62 2d  xprAnd(db, pTab-
9690: 3e 70 43 68 65 63 6b 2c 20 70 43 68 65 63 6b 45  >pCheck, pCheckE
96a0: 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  xpr);.  }else.#e
96b0: 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ndif.  {.    sql
96c0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
96d0: 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a  b, pCheckExpr);.
96e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
96f0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
9700: 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  unction of the m
9710: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72  ost recently par
9720: 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  sed table column
9730: 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53  .** to the CollS
9740: 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69  eq given..*/.voi
9750: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c  d sqlite3AddColl
9760: 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70  ateType(Parse *p
9770: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54  Parse, Token *pT
9780: 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a  oken){.  Table *
9790: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
97a0: 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20  ar *zColl;      
97b0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71 75 6f          /* Dequo
97c0: 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c  ted name of coll
97d0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a  ation sequence *
97e0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
97f0: 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ..  if( (p = pPa
9800: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
9810: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
9820: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
9830: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
9840: 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  zColl = sqlit
9850: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
9860: 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69  db, pToken);.  i
9870: 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75  f( !zColl ) retu
9880: 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  rn;..  if( sqlit
9890: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
98a0: 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29  pParse, zColl) )
98b0: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
98c0: 78 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69  x;.    p->aCol[i
98d0: 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b  ].zColl = zColl;
98e0: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
98f0: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c  e column is decl
9900: 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20  ared as "<name> 
9910: 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c  PRIMARY KEY COLL
9920: 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20  ATE <type>",.   
9930: 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65   ** then an inde
9940: 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  x may have been 
9950: 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20  created on this 
9960: 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68  column before th
9970: 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69  e.    ** collati
9980: 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64 65  on type was adde
9990: 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73 20  d. Correct this 
99a0: 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61 73  if it is the cas
99b0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
99c0: 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78  r(pIdx=p->pIndex
99d0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
99e0: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
99f0: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
9a00: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
9a10: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
9a20: 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20  olumn[0]==i ){. 
9a30: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
9a40: 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c  oll[0] = p->aCol
9a50: 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [i].zColl;.     
9a60: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
9a70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
9a80: 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  ree(db, zColl);.
9a90: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
9aa0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
9ab0: 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ns the collation
9ac0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61   sequence for da
9ad0: 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74 65  tabase native te
9ae0: 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69  xt.** encoding i
9af0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
9b00: 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c   string zName, l
9b10: 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a  ength nName..**.
9b20: 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ** If the reques
9b30: 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ted collation se
9b40: 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76  quence is not av
9b50: 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20  ailable, or not 
9b60: 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20  available.** in 
9b70: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 74  the database nat
9b80: 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  ive encoding, th
9b90: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
9ba0: 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  ory is invoked t
9bb0: 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e  o.** request it.
9bc0: 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   If the collatio
9bd0: 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e  n factory does n
9be0: 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20 61  ot supply such a
9bf0: 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e   sequence,.** an
9c00: 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 69  d the sequence i
9c10: 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61  s available in a
9c20: 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f  nother text enco
9c30: 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20  ding, then that 
9c40: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69  is.** returned i
9c50: 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
9c60: 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20   no versions of 
9c70: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
9c80: 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63  llations sequenc
9c90: 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c  e are available,
9ca0: 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65   or.** another e
9cb0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
9cc0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
9cd0: 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
9ce0: 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  ge written into.
9cf0: 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a  ** pParse..**.**
9d00: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
9d10: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
9d20: 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  d sqlite3FindCol
9d30: 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20 72 6f  lSeq().  This ro
9d40: 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73  utine.** invokes
9d50: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
9d60: 61 63 74 6f 72 79 20 69 66 20 74 68 65 20 6e 61  actory if the na
9d70: 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61  med collation ca
9d80: 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a  nnot be found.**
9d90: 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 20 61   and generates a
9da0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  n error message.
9db0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
9dc0: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
9dd0: 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33 47 65  Seq(), sqlite3Ge
9de0: 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43 6f  tCollSeq().*/.Co
9df0: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f  llSeq *sqlite3Lo
9e00: 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73  cateCollSeq(Pars
9e10: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
9e20: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
9e30: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9e40: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20  Parse->db;.  u8 
9e50: 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
9e60: 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20 64   u8 initbusy = d
9e70: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20  b->init.busy;.  
9e80: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
9e90: 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
9ea0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
9eb0: 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69 6e  , enc, zName, in
9ec0: 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20 21  itbusy);.  if( !
9ed0: 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70 43  initbusy && (!pC
9ee0: 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78  oll || !pColl->x
9ef0: 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c  Cmp) ){.    pCol
9f00: 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f  l = sqlite3GetCo
9f10: 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 70  llSeq(db, enc, p
9f20: 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  Coll, zName);.  
9f30: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
9f40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
9f50: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
9f60: 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e  o such collation
9f70: 20 73 65 71 75 65 6e 63 65 3a 20 25 73 22 2c 20   sequence: %s", 
9f80: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
9f90: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c  }..  return pCol
9fa0: 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  l;.}.../*.** Gen
9fb0: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
9fc0: 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74  will increment t
9fd0: 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
9fe0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65  ..**.** The sche
9ff0: 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65  ma cookie is use
a000: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  d to determine w
a010: 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66  hen the schema f
a020: 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  or the.** databa
a030: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74  se changes.  Aft
a040: 65 72 20 65 61 63 68 20 73 63 68 65 6d 61 20 63  er each schema c
a050: 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69  hange, the cooki
a060: 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67  e value.** chang
a070: 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63  es.  When a proc
a080: 65 73 73 20 66 69 72 73 74 20 72 65 61 64 73 20  ess first reads 
a090: 74 68 65 20 73 63 68 65 6d 61 20 69 74 20 72 65  the schema it re
a0a0: 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f  cords the.** coo
a0b0: 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74 65 72  kie.  Thereafter
a0c0: 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f  , whenever it go
a0d0: 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  es to access the
a0e0: 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74   database,.** it
a0f0: 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b   checks the cook
a100: 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ie to make sure 
a110: 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e  the schema has n
a120: 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69  ot changed.** si
a130: 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74 20  nce it was last 
a140: 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  read..**.** This
a150: 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d   plan is not com
a160: 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70  pletely bullet-p
a170: 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73  roof.  It is pos
a180: 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65  sible for.** the
a190: 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67   schema to chang
a1a0: 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  e multiple times
a1b0: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f   and for the coo
a1c0: 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74  kie to be.** set
a1d0: 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76   back to prior v
a1e0: 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d  alue.  But schem
a1f0: 61 20 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e  a changes are in
a200: 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20  frequent.** and 
a210: 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20  the probability 
a220: 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65 20 73  of hitting the s
a230: 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  ame cookie value
a240: 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68   is only.** 1 ch
a250: 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53  ance in 2^32.  S
a260: 6f 20 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f  o we're safe eno
a270: 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ugh..*/.void sql
a280: 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
a290: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
a2a0: 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e 74 20  int iDb){.  int 
a2b0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
a2c0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
a2d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
a2e0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64  pParse->db;.  Vd
a2f0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
a300: 70 56 64 62 65 3b 0a 20 20 73 71 6c 69 74 65 33  pVdbe;.  sqlite3
a310: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a320: 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61 44  _Integer, db->aD
a330: 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
a340: 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c  schema_cookie+1,
a350: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   r1);.  sqlite3V
a360: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
a370: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
a380: 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52  BTREE_SCHEMA_VER
a390: 53 49 4f 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c  SION, r1);.  sql
a3a0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
a3b0: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
a3c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65  }../*.** Measure
a3d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
a3e0: 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65 64  haracters needed
a3f0: 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67   to output the g
a400: 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69  iven.** identifi
a410: 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  er.  The number 
a420: 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65  returned include
a430: 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65  s any quotes use
a440: 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f  d.** but does no
a450: 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75  t include the nu
a460: 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a  ll terminator..*
a470: 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74  *.** The estimat
a480: 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69 76  e is conservativ
a490: 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65 20  e.  It might be 
a4a0: 6c 61 72 67 65 72 20 74 68 61 74 20 77 68 61 74  larger that what
a4b0: 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65   is.** really ne
a4c0: 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
a4d0: 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28  int identLength(
a4e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
a4f0: 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e    int n;.  for(n
a500: 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b  =0; *z; n++, z++
a510: 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27  ){.    if( *z=='
a520: 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d  "' ){ n++; }.  }
a530: 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b  .  return n + 2;
a540: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  .}../*.** The fi
a550: 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  rst parameter is
a560: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
a570: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 20   output buffer. 
a580: 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 70  The second .** p
a590: 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f  arameter is a po
a5a0: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65  inter to an inte
a5b0: 67 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ger that contain
a5c0: 73 20 74 68 65 20 6f 66 66 73 65 74 20 61 74 0a  s the offset at.
a5d0: 2a 2a 20 77 68 69 63 68 20 74 6f 20 77 72 69 74  ** which to writ
a5e0: 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  e into the outpu
a5f0: 74 20 62 75 66 66 65 72 2e 20 54 68 69 73 20 66  t buffer. This f
a600: 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73 20 74  unction copies t
a610: 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e  he.** nul-termin
a620: 61 74 65 64 20 73 74 72 69 6e 67 20 70 6f 69 6e  ated string poin
a630: 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 74 68  ted to by the th
a640: 69 72 64 20 70 61 72 61 6d 65 74 65 72 2c 20 7a  ird parameter, z
a650: 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a 20  SignedIdent,.** 
a660: 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64  to the specified
a670: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 62   offset in the b
a680: 75 66 66 65 72 20 61 6e 64 20 75 70 64 61 74 65  uffer and update
a690: 73 20 2a 70 49 64 78 20 74 6f 20 72 65 66 65 72  s *pIdx to refer
a6a0: 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
a6b0: 20 62 79 74 65 20 61 66 74 65 72 20 74 68 65 20   byte after the 
a6c0: 6c 61 73 74 20 62 79 74 65 20 77 72 69 74 74 65  last byte writte
a6d0: 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  n before returni
a6e0: 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  ng..** .** If th
a6f0: 65 20 73 74 72 69 6e 67 20 7a 53 69 67 6e 65 64  e string zSigned
a700: 49 64 65 6e 74 20 63 6f 6e 73 69 73 74 73 20 65  Ident consists e
a710: 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c 70 68 61  ntirely of alpha
a720: 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68 61 72  -numeric.** char
a730: 61 63 74 65 72 73 2c 20 64 6f 65 73 20 6e 6f 74  acters, does not
a740: 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 64 69   begin with a di
a750: 67 69 74 20 61 6e 64 20 69 73 20 6e 6f 74 20 61  git and is not a
a760: 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a  n SQL keyword,.*
a770: 2a 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70  * then it is cop
a780: 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ied to the outpu
a790: 74 20 62 75 66 66 65 72 20 65 78 61 63 74 6c 79  t buffer exactly
a7a0: 20 61 73 20 69 74 20 69 73 2e 20 4f 74 68 65 72   as it is. Other
a7b0: 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20 71  wise,.** it is q
a7c0: 75 6f 74 65 64 20 75 73 69 6e 67 20 64 6f 75 62  uoted using doub
a7d0: 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74  le-quotes..*/.st
a7e0: 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50  atic void identP
a7f0: 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  ut(char *z, int 
a800: 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53 69  *pIdx, char *zSi
a810: 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e  gnedIdent){.  un
a820: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 64  signed char *zId
a830: 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ent = (unsigned 
a840: 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64 65  char*)zSignedIde
a850: 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  nt;.  int i, j, 
a860: 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d  needQuote;.  i =
a870: 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72 28 6a   *pIdx;..  for(j
a880: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
a890: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73 71  ++){.    if( !sq
a8a0: 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 49 64  lite3Isalnum(zId
a8b0: 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e  ent[j]) && zIden
a8c0: 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61  t[j]!='_' ) brea
a8d0: 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f  k;.  }.  needQuo
a8e0: 74 65 20 3d 20 73 71 6c 69 74 65 33 49 73 64 69  te = sqlite3Isdi
a8f0: 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 20 7c  git(zIdent[0]) |
a900: 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64  | sqlite3Keyword
a910: 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21  Code(zIdent, j)!
a920: 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20 21 6e  =TK_ID;.  if( !n
a930: 65 65 64 51 75 6f 74 65 20 29 7b 0a 20 20 20 20  eedQuote ){.    
a940: 6e 65 65 64 51 75 6f 74 65 20 3d 20 7a 49 64 65  needQuote = zIde
a950: 6e 74 5b 6a 5d 3b 0a 20 20 7d 0a 0a 20 20 69 66  nt[j];.  }..  if
a960: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
a970: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f  i++] = '"';.  fo
a980: 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d  r(j=0; zIdent[j]
a990: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b  ; j++){.    z[i+
a9a0: 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a  +] = zIdent[j];.
a9b0: 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a      if( zIdent[j
a9c0: 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20  ]=='"' ) z[i++] 
a9d0: 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28  = '"';.  }.  if(
a9e0: 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69   needQuote ) z[i
a9f0: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69  ++] = '"';.  z[i
aa00: 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d  ] = 0;.  *pIdx =
aa10: 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   i;.}../*.** Gen
aa20: 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20 54  erate a CREATE T
aa30: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61  ABLE statement a
aa40: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
aa50: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c  he given.** tabl
aa60: 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f  e.  Memory to ho
aa70: 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20 74  ld the text of t
aa80: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
aa90: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d  obtained.** from
aaa0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
aab0: 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
aac0: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
aad0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
aae0: 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61 74  atic char *creat
aaf0: 65 54 61 62 6c 65 53 74 6d 74 28 73 71 6c 69 74  eTableStmt(sqlit
ab00: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
ab10: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e  ){.  int i, k, n
ab20: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b  ;.  char *zStmt;
ab30: 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a  .  char *zSep, *
ab40: 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20  zSep2, *zEnd;.  
ab50: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
ab60: 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f  n = 0;.  for(pCo
ab70: 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30  l = p->aCol, i=0
ab80: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
ab90: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e  , pCol++){.    n
aba0: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
abb0: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20 35  pCol->zName) + 5
abc0: 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65  ;.  }.  n += ide
abd0: 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d  ntLength(p->zNam
abe0: 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29  e);.  if( n<50 )
abf0: 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22  { .    zSep = ""
ac00: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
ac10: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29  ";.    zEnd = ")
ac20: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
ac30: 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20  zSep = "\n  ";. 
ac40: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20     zSep2 = ",\n 
ac50: 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22   ";.    zEnd = "
ac60: 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d  \n)";.  }.  n +=
ac70: 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b   35 + 6*p->nCol;
ac80: 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74  .  zStmt = sqlit
ac90: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c  e3DbMallocRaw(0,
aca0: 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74   n);.  if( zStmt
acb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  ==0 ){.    db->m
acc0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
acd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
ace0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70   }.  sqlite3_snp
acf0: 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c 20  rintf(n, zStmt, 
ad00: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22 29  "CREATE TABLE ")
ad10: 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65 33 53  ;.  k = sqlite3S
ad20: 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29 3b 0a  trlen30(zStmt);.
ad30: 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74    identPut(zStmt
ad40: 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b  , &k, p->zName);
ad50: 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20  .  zStmt[k++] = 
ad60: 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d  '(';.  for(pCol=
ad70: 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c  p->aCol, i=0; i<
ad80: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  p->nCol; i++, pC
ad90: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74 69  ol++){.    stati
ada0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63  c const char * c
adb0: 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20 3d 20  onst azType[] = 
adc0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  {.        /* SQL
add0: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20  ITE_AFF_TEXT    
ade0: 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20 20 20 20  */ " TEXT",.    
adf0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
ae00: 46 5f 4e 4f 4e 45 20 20 20 20 2a 2f 20 22 22 2c  F_NONE    */ "",
ae10: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  .        /* SQLI
ae20: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 2a  TE_AFF_NUMERIC *
ae30: 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20 20 20  / " NUM",.      
ae40: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f    /* SQLITE_AFF_
ae50: 49 4e 54 45 47 45 52 20 2a 2f 20 22 20 49 4e 54  INTEGER */ " INT
ae60: 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51  ",.        /* SQ
ae70: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20  LITE_AFF_REAL   
ae80: 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20 20 20   */ " REAL".    
ae90: 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  };.    int len;.
aea0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
aeb0: 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69  zType;..    sqli
aec0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b  te3_snprintf(n-k
aed0: 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65  , &zStmt[k], zSe
aee0: 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c  p);.    k += sql
aef0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 53  ite3Strlen30(&zS
af00: 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65  tmt[k]);.    zSe
af10: 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69  p = zSep2;.    i
af20: 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26  dentPut(zStmt, &
af30: 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  k, pCol->zName);
af40: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f  .    assert( pCo
af50: 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49  l->affinity-SQLI
af60: 54 45 5f 41 46 46 5f 54 45 58 54 20 3e 3d 20 30  TE_AFF_TEXT >= 0
af70: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
af80: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53  pCol->affinity-S
af90: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 3c  QLITE_AFF_TEXT <
afa0: 20 73 69 7a 65 6f 66 28 61 7a 54 79 70 65 29 2f   sizeof(azType)/
afb0: 73 69 7a 65 6f 66 28 61 7a 54 79 70 65 5b 30 5d  sizeof(azType[0]
afc0: 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ) );.    testcas
afd0: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
afe0: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  y==SQLITE_AFF_TE
aff0: 58 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  XT );.    testca
b000: 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  se( pCol->affini
b010: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ty==SQLITE_AFF_N
b020: 4f 4e 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ONE );.    testc
b030: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
b040: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
b050: 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 74  NUMERIC );.    t
b060: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
b070: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
b080: 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20  AFF_INTEGER );. 
b090: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f     testcase( pCo
b0a0: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
b0b0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a  ITE_AFF_REAL );.
b0c0: 20 20 20 20 0a 20 20 20 20 7a 54 79 70 65 20 3d      .    zType =
b0d0: 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e 61 66   azType[pCol->af
b0e0: 66 69 6e 69 74 79 20 2d 20 53 51 4c 49 54 45 5f  finity - SQLITE_
b0f0: 41 46 46 5f 54 45 58 54 5d 3b 0a 20 20 20 20 6c  AFF_TEXT];.    l
b100: 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  en = sqlite3Strl
b110: 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20 20 20  en30(zType);.   
b120: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61   assert( pCol->a
b130: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
b140: 41 46 46 5f 4e 4f 4e 45 20 0a 20 20 20 20 20 20  AFF_NONE .      
b150: 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61        || pCol->a
b160: 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69 74 65 33  ffinity==sqlite3
b170: 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79  AffinityType(zTy
b180: 70 65 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70  pe) );.    memcp
b190: 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79  y(&zStmt[k], zTy
b1a0: 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b 20  pe, len);.    k 
b1b0: 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73 65  += len;.    asse
b1c0: 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a  rt( k<=n );.  }.
b1d0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
b1e0: 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b  tf(n-k, &zStmt[k
b1f0: 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a  ], "%s", zEnd);.
b200: 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a    return zStmt;.
b210: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
b220: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
b230: 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66 69  to report the fi
b240: 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74 65 72  nal ")" that ter
b250: 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45  minates.** a CRE
b260: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
b270: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ent..**.** The t
b280: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
b290: 68 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e  hat other action
b2a0: 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62   routines have b
b2b0: 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20  een building.** 
b2c0: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
b2d0: 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61  internal hash ta
b2e0: 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e  bles, assuming n
b2f0: 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a  o errors have.**
b300: 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a   occurred..**.**
b310: 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   An entry for th
b320: 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20  e table is made 
b330: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  in the master ta
b340: 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c  ble on disk, unl
b350: 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61  ess.** this is a
b360: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
b370: 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   or db->init.bus
b380: 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e  y==1.  When db->
b390: 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20  init.busy==1.** 
b3a0: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
b3b0: 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
b3c0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
b3d0: 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a  because we just.
b3e0: 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  ** connected to 
b3f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
b400: 62 65 63 61 75 73 65 20 74 68 65 20 73 71 6c 69  because the sqli
b410: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
b420: 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20  has.** recently 
b430: 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68 65 20  changed, so the 
b440: 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 74  entry for this t
b450: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
b460: 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71  sts in.** the sq
b470: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
b480: 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61  e.  We do not wa
b490: 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69 74 20  nt to create it 
b4a0: 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  again..**.** If 
b4b0: 74 68 65 20 70 53 65 6c 65 63 74 20 61 72 67 75  the pSelect argu
b4c0: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ment is not NULL
b4d0: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
b4e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
b4f0: 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  was called to cr
b500: 65 61 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e  eate a table gen
b510: 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a  erated from a .*
b520: 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  * "CREATE TABLE 
b530: 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e  ... AS SELECT ..
b540: 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ." statement.  T
b550: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
b560: 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61  of.** the new ta
b570: 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74  ble will match t
b580: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
b590: 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
b5a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54  void sqlite3EndT
b5b0: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
b5c0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
b5d0: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
b5e0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f   */.  Token *pCo
b5f0: 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ns,           /*
b600: 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61   The ',' token a
b610: 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 63 6f  fter the last co
b620: 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20  lumn defn. */.  
b630: 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20  Token *pEnd,    
b640: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
b650: 69 6e 61 6c 20 27 29 27 20 74 6f 6b 65 6e 20 69  inal ')' token i
b660: 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  n the CREATE TAB
b670: 4c 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  LE */.  Select *
b680: 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 20 20  pSelect         
b690: 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61  /* Select from a
b6a0: 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20   "CREATE ... AS 
b6b0: 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20  SELECT" */.){.  
b6c0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69  Table *p;.  sqli
b6d0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
b6e0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b  ->db;.  int iDb;
b6f0: 0a 0a 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30  ..  if( (pEnd==0
b700: 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20   && pSelect==0) 
b710: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
b720: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
b730: 6e 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 70 50 61  n;.  }.  p = pPa
b740: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
b750: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
b760: 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
b770: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c  !db->init.busy |
b780: 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20  | !pSelect );.. 
b790: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
b7a0: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
b7b0: 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69  p->pSchema);..#i
b7c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b7d0: 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73  T_CHECK.  /* Res
b7e0: 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c  olve names in al
b7f0: 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  l CHECK constrai
b800: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a  nt expressions..
b810: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43    */.  if( p->pC
b820: 68 65 63 6b 20 29 7b 0a 20 20 20 20 53 72 63 4c  heck ){.    SrcL
b830: 69 73 74 20 73 53 72 63 3b 20 20 20 20 20 20 20  ist sSrc;       
b840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
b850: 61 6b 65 20 53 72 63 4c 69 73 74 20 66 6f 72 20  ake SrcList for 
b860: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
b870: 65 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e  e */.    NameCon
b880: 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20  text sNC;       
b890: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
b8a0: 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 50 61   context for pPa
b8b0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a  rse->pNewTable *
b8c0: 2f 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  /..    memset(&s
b8d0: 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
b8e0: 43 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  C));.    memset(
b8f0: 26 73 53 72 63 2c 20 30 2c 20 73 69 7a 65 6f 66  &sSrc, 0, sizeof
b900: 28 73 53 72 63 29 29 3b 0a 20 20 20 20 73 53 72  (sSrc));.    sSr
b910: 63 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20  c.nSrc = 1;.    
b920: 73 53 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20  sSrc.a[0].zName 
b930: 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  = p->zName;.    
b940: 73 53 72 63 2e 61 5b 30 5d 2e 70 54 61 62 20 3d  sSrc.a[0].pTab =
b950: 20 70 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30   p;.    sSrc.a[0
b960: 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a  ].iCursor = -1;.
b970: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
b980: 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43   pParse;.    sNC
b990: 2e 70 53 72 63 4c 69 73 74 20 3d 20 26 73 53 72  .pSrcList = &sSr
b9a0: 63 3b 0a 20 20 20 20 73 4e 43 2e 69 73 43 68 65  c;.    sNC.isChe
b9b0: 63 6b 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ck = 1;.    if( 
b9c0: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
b9d0: 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d  prNames(&sNC, p-
b9e0: 3e 70 43 68 65 63 6b 29 20 29 7b 0a 20 20 20 20  >pCheck) ){.    
b9f0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
ba00: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64    }.#endif /* !d
ba10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
ba20: 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20  IT_CHECK) */..  
ba30: 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e  /* If the db->in
ba40: 69 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20  it.busy is 1 it 
ba50: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
ba60: 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66  ding the SQL off
ba70: 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74   the.  ** "sqlit
ba80: 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71  e_master" or "sq
ba90: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
baa0: 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64  " table on the d
bab0: 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20  isk..  ** So do 
bac0: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
bad0: 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78   disk again.  Ex
bae0: 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70  tract the root p
baf0: 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
bb00: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72  for the table fr
bb10: 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  om the db->init.
bb20: 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20  newTnum field.  
bb30: 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72  (The page number
bb40: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76  .  ** should hav
bb50: 65 20 62 65 65 6e 20 70 75 74 20 74 68 65 72 65  e been put there
bb60: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70   by the sqliteOp
bb70: 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20  enCb routine.). 
bb80: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
bb90: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 70  it.busy ){.    p
bba0: 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69  ->tnum = db->ini
bbb0: 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a  t.newTnum;.  }..
bbc0: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74    /* If not init
bbd0: 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63  ializing, then c
bbe0: 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 66  reate a record f
bbf0: 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
bc00: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c  .  ** in the SQL
bc10: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
bc20: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
bc30: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
bc40: 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41  his is a TEMPORA
bc50: 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20  RY table, write 
bc60: 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74  the entry into t
bc70: 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  he auxiliary.  *
bc80: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
bc90: 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  f into the main 
bca0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
bcb0: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
bcc0: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
bcd0: 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20  int n;.    Vdbe 
bce0: 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  *v;.    char *zT
bcf0: 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77  ype;    /* "view
bd00: 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a  " or "table" */.
bd10: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32      char *zType2
bd20: 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72  ;   /* "VIEW" or
bd30: 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20   "TABLE" */.    
bd40: 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20  char *zStmt;    
bd50: 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 43  /* Text of the C
bd60: 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43  REATE TABLE or C
bd70: 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65  REATE VIEW state
bd80: 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d  ment */..    v =
bd90: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
bda0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
bdb0: 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
bdc0: 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69  eturn;..    sqli
bdd0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
bde0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a   OP_Close, 0);..
bdf0: 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20 49      /* .    ** I
be00: 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20  nitialize zType 
be10: 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69 65 77  for the new view
be20: 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a   or table..    *
be30: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65  /.    if( p->pSe
be40: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lect==0 ){.     
be50: 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61   /* A regular ta
be60: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79  ble */.      zTy
be70: 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20  pe = "table";.  
be80: 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41      zType2 = "TA
be90: 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51  BLE";.#ifndef SQ
bea0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
beb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bec0: 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20  /* A view */.   
bed0: 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77     zType = "view
bee0: 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20  ";.      zType2 
bef0: 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66  = "VIEW";.#endif
bf00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
bf10: 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45 41  f this is a CREA
bf20: 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20 53  TE TABLE xx AS S
bf30: 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75  ELECT ..., execu
bf40: 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  te the SELECT.  
bf50: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
bf60: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e  o populate the n
bf70: 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f  ew table. The ro
bf80: 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66  ot-page number f
bf90: 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65  or the.    ** ne
bfa0: 77 20 74 61 62 6c 65 20 69 73 20 69 6e 20 72 65  w table is in re
bfb0: 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72  gister pParse->r
bfc0: 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20  egRoot..    **. 
bfd0: 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53     ** Once the S
bfe0: 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20 63  ELECT has been c
bff0: 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33 53  oded by sqlite3S
c000: 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20 69  elect(), it is i
c010: 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61  n a.    ** suita
c020: 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75 65  ble state to que
c030: 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
c040: 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65  n names and type
c050: 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20  s to be used.   
c060: 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74   ** by the new t
c070: 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  able..    **.   
c080: 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61 63   ** A shared-cac
c090: 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73  he write-lock is
c0a0: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f   not required to
c0b0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e 65   write to the ne
c0c0: 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20  w table,.    ** 
c0d0: 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b  as a schema-lock
c0e0: 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61   must have alrea
c0f0: 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  dy been obtained
c100: 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20 53   to create it. S
c110: 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73 63  ince.    ** a sc
c120: 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64  hema-lock exclud
c130: 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61 74  es all other dat
c140: 61 62 61 73 65 20 75 73 65 72 73 2c 20 74 68 65  abase users, the
c150: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c   write-lock woul
c160: 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64 75  d.    ** be redu
c170: 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ndant..    */.  
c180: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
c190: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
c1a0: 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 54 61  t dest;.      Ta
c1b0: 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 0a 20  ble *pSelTab;.. 
c1c0: 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 72       assert(pPar
c1d0: 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20 20  se->nTab==1);.  
c1e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c1f0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
c200: 57 72 69 74 65 2c 20 31 2c 20 70 50 61 72 73 65  Write, 1, pParse
c210: 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b  ->regRoot, iDb);
c220: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c230: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29  beChangeP5(v, 1)
c240: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
c250: 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20  nTab = 2;.      
c260: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
c270: 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
c280: 5f 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 20 20  _Table, 1);.    
c290: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
c2a0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
c2b0: 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73   &dest);.      s
c2c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
c2d0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 29  (v, OP_Close, 1)
c2e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
c2f0: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
c300: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d         pSelTab =
c310: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
c320: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
c330: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
c340: 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d      if( pSelTab=
c350: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
c360: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
c370: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
c380: 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65     p->nCol = pSe
c390: 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  lTab->nCol;.    
c3a0: 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53      p->aCol = pS
c3b0: 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
c3c0: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43       pSelTab->nC
c3d0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ol = 0;.        
c3e0: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  pSelTab->aCol = 
c3f0: 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
c400: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
c410: 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  , pSelTab);.    
c420: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
c430: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
c440: 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
c450: 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
c460: 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ent */.    if( p
c470: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
c480: 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61  zStmt = createTa
c490: 62 6c 65 53 74 6d 74 28 64 62 2c 20 70 29 3b 0a  bleStmt(db, p);.
c4a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c4b0: 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 2d   n = (int)(pEnd-
c4c0: 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61  >z - pParse->sNa
c4d0: 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a  meToken.z) + 1;.
c4e0: 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71        zStmt = sq
c4f0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
c500: 20 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45   .          "CRE
c510: 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54  ATE %s %.*s", zT
c520: 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d  ype2, n, pParse-
c530: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20  >sNameToken.z.  
c540: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
c550: 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20    /* A slot for 
c560: 74 68 65 20 72 65 63 6f 72 64 20 68 61 73 20 61  the record has a
c570: 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
c580: 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20  cated in the .  
c590: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54    ** SQLITE_MAST
c5a0: 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75  ER table.  We ju
c5b0: 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74  st need to updat
c5c0: 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68  e that slot with
c5d0: 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20   all.    ** the 
c5e0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76  information we'v
c5f0: 65 20 63 6f 6c 6c 65 63 74 65 64 2e 0a 20 20 20  e collected..   
c600: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
c610: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
c620: 65 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54 45  e,.      "UPDATE
c630: 20 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20   %Q.%s ".       
c640: 20 20 22 53 45 54 20 74 79 70 65 3d 27 25 73 27    "SET type='%s'
c650: 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e  , name=%Q, tbl_n
c660: 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65  ame=%Q, rootpage
c670: 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20  =#%d, sql=%Q ". 
c680: 20 20 20 20 20 20 22 57 48 45 52 45 20 72 6f 77        "WHERE row
c690: 69 64 3d 23 25 64 22 2c 0a 20 20 20 20 20 20 64  id=#%d",.      d
c6a0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
c6b0: 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
c6c0: 69 44 62 29 2c 0a 20 20 20 20 20 20 7a 54 79 70  iDb),.      zTyp
c6d0: 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d  e,.      p->zNam
c6e0: 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d  e,.      p->zNam
c6f0: 65 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  e,.      pParse-
c700: 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20  >regRoot,.      
c710: 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 70 50 61  zStmt,.      pPa
c720: 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20  rse->regRowid.  
c730: 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
c740: 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74  DbFree(db, zStmt
c750: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
c760: 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
c770: 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65  e, iDb);..#ifnde
c780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
c790: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
c7a0: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
c7b0: 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72  if we need to cr
c7c0: 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f 73  eate an sqlite_s
c7d0: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66 6f  equence table fo
c7e0: 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67  r.    ** keeping
c7f0: 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e   track of autoin
c800: 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20  crement keys..  
c810: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
c820: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75  tabFlags & TF_Au
c830: 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20  toincrement ){. 
c840: 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26       Db *pDb = &
c850: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
c860: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63      if( pDb->pSc
c870: 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30  hema->pSeqTab==0
c880: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
c890: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
c8a0: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
c8b0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25   "CREATE TABLE %
c8c0: 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  Q.sqlite_sequenc
c8d0: 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20  e(name,seq)",.  
c8e0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61          pDb->zNa
c8f0: 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  me.        );.  
c900: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
c910: 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72  if..    /* Repar
c920: 73 65 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f  se everything to
c930: 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65   update our inte
c940: 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74  rnal data struct
c950: 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ures */.    sqli
c960: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
c970: 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c   OP_ParseSchema,
c980: 20 69 44 62 2c 20 30 2c 20 30 2c 0a 20 20 20 20   iDb, 0, 0,.    
c990: 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
c9a0: 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65  tf(db, "tbl_name
c9b0: 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e 61 6d 65 29  ='%q'",p->zName)
c9c0: 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
c9d0: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68   }...  /* Add th
c9e0: 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69  e table to the i
c9f0: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
ca00: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
ca10: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
ca20: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
ca30: 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  y ){.    Table *
ca40: 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65 6d 61  pOld;.    Schema
ca50: 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70   *pSchema = p->p
ca60: 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4f 6c 64  Schema;.    pOld
ca70: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
ca80: 73 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74  sert(&pSchema->t
ca90: 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65  blHash, p->zName
caa0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
cac0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
cad0: 2d 3e 7a 4e 61 6d 65 29 2c 70 29 3b 0a 20 20 20  ->zName),p);.   
cae0: 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20   if( pOld ){.   
caf0: 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f     assert( p==pO
cb00: 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ld );  /* Malloc
cb10: 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
cb20: 64 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73  d inside HashIns
cb30: 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 64  ert() */.      d
cb40: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
cb50: 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 1;.      retur
cb60: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  n;.    }.    pPa
cb70: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d  rse->pNewTable =
cb80: 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62   0;.    db->nTab
cb90: 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c  le++;.    db->fl
cba0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
cbb0: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69  ternChanges;..#i
cbc0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cbd0: 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20  T_ALTERTABLE.   
cbe0: 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63 74   if( !p->pSelect
cbf0: 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
cc00: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63  char *zName = (c
cc10: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50 61 72  onst char *)pPar
cc20: 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a  se->sNameToken.z
cc30: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d  ;.      int nNam
cc40: 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
cc50: 20 21 70 53 65 6c 65 63 74 20 26 26 20 70 43 6f   !pSelect && pCo
cc60: 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a 20 20  ns && pEnd );.  
cc70: 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a      if( pCons->z
cc80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
cc90: 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20  Cons = pEnd;.   
cca0: 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65     }.      nName
ccb0: 20 3d 20 28 69 6e 74 29 28 28 63 6f 6e 73 74 20   = (int)((const 
ccc0: 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20  char *)pCons->z 
ccd0: 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  - zName);.      
cce0: 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74 20  p->addColOffset 
ccf0: 3d 20 31 33 20 2b 20 73 71 6c 69 74 65 33 55 74  = 13 + sqlite3Ut
cd00: 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c  f8CharLen(zName,
cd10: 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23   nName);.    }.#
cd20: 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66  endif.  }.}..#if
cd30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
cd40: 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20  _VIEW./*.** The 
cd50: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
cd60: 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64  s routine in ord
cd70: 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  er to create a n
cd80: 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20  ew VIEW.*/.void 
cd90: 73 71 6c 69 74 65 33 43 72 65 61 74 65 56 69 65  sqlite3CreateVie
cda0: 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  w(.  Parse *pPar
cdb0: 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70  se,     /* The p
cdc0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
cdd0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69  /.  Token *pBegi
cde0: 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52  n,     /* The CR
cdf0: 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20  EATE token that 
ce00: 62 65 67 69 6e 73 20 74 68 65 20 73 74 61 74 65  begins the state
ce10: 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ment */.  Token 
ce20: 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20  *pName1,     /* 
ce30: 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
ce40: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
ce50: 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54   the view */.  T
ce60: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
ce70: 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74    /* The token t
ce80: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  hat holds the na
ce90: 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a  me of the view *
cea0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
ceb0: 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45  ect,   /* A SELE
cec0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
ced0: 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
cee0: 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20  e new view */.  
cef0: 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20  int isTemp,     
cf00: 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61     /* TRUE for a
cf10: 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20   TEMPORARY view 
cf20: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20  */.  int noErr  
cf30: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 70 70 72          /* Suppr
cf40: 65 73 73 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ess error messag
cf50: 65 73 20 69 66 20 56 49 45 57 20 61 6c 72 65 61  es if VIEW alrea
cf60: 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a  dy exists */.){.
cf70: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
cf80: 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t n;.  const cha
cf90: 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45  r *z;.  Token sE
cfa0: 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46  nd;.  DbFixer sF
cfb0: 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61  ix;.  Token *pNa
cfc0: 6d 65 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20  me;.  int iDb;. 
cfd0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
cfe0: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
cff0: 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30  ( pParse->nVar>0
d000: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
d010: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
d020: 22 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20  "parameters are 
d030: 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76  not allowed in v
d040: 69 65 77 73 22 29 3b 0a 20 20 20 20 73 71 6c 69  iews");.    sqli
d050: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
d060: 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  db, pSelect);.  
d070: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
d080: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
d090: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
d0a0: 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70  , pName2, isTemp
d0b0: 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a  , 1, 0, noErr);.
d0c0: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
d0d0: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
d0e0: 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
d0f0: 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Err ){.    sqlit
d100: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
d110: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  b, pSelect);.   
d120: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
d130: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
d140: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
d150: 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
d160: 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  );.  iDb = sqlit
d170: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
d180: 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b  db, p->pSchema);
d190: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  .  if( sqlite3Fi
d1a0: 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61  xInit(&sFix, pPa
d1b0: 72 73 65 2c 20 69 44 62 2c 20 22 76 69 65 77 22  rse, iDb, "view"
d1c0: 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20 26 26 20  , pName).    && 
d1d0: 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74  sqlite3FixSelect
d1e0: 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29  (&sFix, pSelect)
d1f0: 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
d200: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
d210: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
d220: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
d230: 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  * Make a copy of
d240: 20 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45   the entire SELE
d250: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
d260: 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69  t defines the vi
d270: 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69  ew..  ** This wi
d280: 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65  ll force all the
d290: 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61   Expr.token.z va
d2a0: 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d  lues to be dynam
d2b0: 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f  ically.  ** allo
d2c0: 63 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61  cated rather tha
d2d0: 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69  n point to the i
d2e0: 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68  nput string - wh
d2f0: 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20  ich means that. 
d300: 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65   ** they will pe
d310: 72 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20  rsist after the 
d320: 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f  current sqlite3_
d330: 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75  exec() call retu
d340: 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  rns..  */.  p->p
d350: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
d360: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 53  SelectDup(db, pS
d370: 65 6c 65 63 74 2c 20 45 58 50 52 44 55 50 5f 52  elect, EXPRDUP_R
d380: 45 44 55 43 45 29 3b 0a 20 20 73 71 6c 69 74 65  EDUCE);.  sqlite
d390: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
d3a0: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66  , pSelect);.  if
d3b0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
d3c0: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
d3d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 2d  ;.  }.  if( !db-
d3e0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
d3f0: 20 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74    sqlite3ViewGet
d400: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
d410: 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  se, p);.  }..  /
d420: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64  * Locate the end
d430: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56   of the CREATE V
d440: 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  IEW statement.  
d450: 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20  Make sEnd point 
d460: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e  to.  ** the end.
d470: 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70  .  */.  sEnd = p
d480: 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
d490: 6e 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  n;.  if( ALWAYS(
d4a0: 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 29 20 26 26  sEnd.z[0]!=0) &&
d4b0: 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20   sEnd.z[0]!=';' 
d4c0: 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d  ){.    sEnd.z +=
d4d0: 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73   sEnd.n;.  }.  s
d4e0: 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d  End.n = 0;.  n =
d4f0: 20 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d 20   (int)(sEnd.z - 
d500: 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 7a 20  pBegin->z);.  z 
d510: 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77  = pBegin->z;.  w
d520: 68 69 6c 65 28 20 41 4c 57 41 59 53 28 6e 3e 30  hile( ALWAYS(n>0
d530: 29 20 26 26 20 73 71 6c 69 74 65 33 49 73 73 70  ) && sqlite3Issp
d540: 61 63 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e  ace(z[n-1]) ){ n
d550: 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d  --; }.  sEnd.z =
d560: 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64   &z[n-1];.  sEnd
d570: 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73  .n = 1;..  /* Us
d580: 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
d590: 65 28 29 20 74 6f 20 61 64 64 20 74 68 65 20 76  e() to add the v
d5a0: 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54  iew to the SQLIT
d5b0: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a  E_MASTER table *
d5c0: 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61  /.  sqlite3EndTa
d5d0: 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 26  ble(pParse, 0, &
d5e0: 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72 65 74 75  sEnd, 0);.  retu
d5f0: 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rn;.}.#endif /* 
d600: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
d610: 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
d620: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
d630: 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  EW) || !defined(
d640: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
d650: 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20  UALTABLE)./*.** 
d660: 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
d670: 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65  ure pTable is re
d680: 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69  ally a VIEW.  Fi
d690: 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20  ll in the names 
d6a0: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  of.** the column
d6b0: 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e  s of the view in
d6c0: 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75   the pTable stru
d6d0: 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74  cture.  Return t
d6e0: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
d6f0: 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65  errors.  If an e
d700: 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61  rror is seen lea
d710: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
d720: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
d730: 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
d740: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
d750: 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a  umnNames(Parse *
d760: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
d770: 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20  Table){.  Table 
d780: 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41  *pSelTab;   /* A
d790: 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d   fake table from
d7a0: 20 77 68 69 63 68 20 77 65 20 67 65 74 20 74 68   which we get th
d7b0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
d7c0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20    Select *pSel; 
d7d0: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74      /* Copy of t
d7e0: 68 65 20 53 45 4c 45 43 54 20 74 68 61 74 20 69  he SELECT that i
d7f0: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69  mplements the vi
d800: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72  ew */.  int nErr
d810: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d   = 0;     /* Num
d820: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e  ber of errors en
d830: 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69  countered */.  i
d840: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
d850: 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20   /* Temporarily 
d860: 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72  holds the number
d870: 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73 69   of cursors assi
d880: 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  gned */.  sqlite
d890: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
d8a0: 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65  db;  /* Database
d8b0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20   connection for 
d8c0: 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f  malloc errors */
d8d0: 0a 20 20 69 6e 74 20 28 2a 78 41 75 74 68 29 28  .  int (*xAuth)(
d8e0: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
d8f0: 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72  char*,const char
d900: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  *,const char*,co
d910: 6e 73 74 20 63 68 61 72 2a 29 3b 0a 0a 20 20 61  nst char*);..  a
d920: 73 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b  ssert( pTable );
d930: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
d940: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
d950: 4c 45 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  LE.  if( sqlite3
d960: 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28  VtabCallConnect(
d970: 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 20  pParse, pTable) 
d980: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
d990: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
d9a0: 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
d9b0: 70 54 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e  pTable) ) return
d9c0: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   0;.#endif..#ifn
d9d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d9e0: 56 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69  VIEW.  /* A posi
d9f0: 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20  tive nCol means 
da00: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65  the columns name
da10: 73 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20  s for this view 
da20: 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79  are.  ** already
da30: 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69   known..  */.  i
da40: 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e  f( pTable->nCol>
da50: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
da60: 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e   /* A negative n
da70: 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c  Col is a special
da80: 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20   marker meaning 
da90: 74 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72  that we are curr
daa0: 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e  ently.  ** tryin
dab0: 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  g to compute the
dac0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20   column names.  
dad0: 49 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73  If we enter this
dae0: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20   routine with.  
daf0: 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43  ** a negative nC
db00: 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f  ol, it means two
db10: 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66   or more views f
db20: 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65  orm a loop, like
db30: 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   this:.  **.  **
db40: 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
db50: 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a   one AS SELECT *
db60: 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20   FROM two;.  ** 
db70: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
db80: 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20  two AS SELECT * 
db90: 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20  FROM one;.  **. 
dba0: 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68   ** Actually, th
dbb0: 65 20 65 72 72 6f 72 20 61 62 6f 76 65 20 69 73  e error above is
dbc0: 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f   now caught prio
dbd0: 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68  r to reaching th
dbe0: 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42  is point..  ** B
dbf0: 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ut the following
dc00: 20 74 65 73 74 20 69 73 20 73 74 69 6c 6c 20 69   test is still i
dc10: 6d 70 6f 72 74 61 6e 74 20 61 73 20 69 74 20 64  mportant as it d
dc20: 6f 65 73 20 63 6f 6d 65 20 75 70 0a 20 20 2a 2a  oes come up.  **
dc30: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
dc40: 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20  g:.  ** .  **   
dc50: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6d    CREATE TABLE m
dc60: 61 69 6e 2e 65 78 31 28 61 29 3b 0a 20 20 2a 2a  ain.ex1(a);.  **
dc70: 20 20 20 20 20 43 52 45 41 54 45 20 54 45 4d 50       CREATE TEMP
dc80: 20 56 49 45 57 20 65 78 31 20 41 53 20 53 45 4c   VIEW ex1 AS SEL
dc90: 45 43 54 20 61 20 46 52 4f 4d 20 65 78 31 3b 0a  ECT a FROM ex1;.
dca0: 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
dcb0: 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 65 78 31 3b  * FROM temp.ex1;
dcc0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
dcd0: 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20  le->nCol<0 ){.  
dce0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
dcf0: 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 20  g(pParse, "view 
dd00: 25 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79  %s is circularly
dd10: 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c   defined", pTabl
dd20: 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  e->zName);.    r
dd30: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61  eturn 1;.  }.  a
dd40: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e  ssert( pTable->n
dd50: 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Col>=0 );..  /* 
dd60: 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
dd70: 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20  ar, it means we 
dd80: 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
dd90: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e  the table names.
dda0: 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
ddb0: 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
ddc0: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
ddd0: 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61  lect() will expa
dde0: 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20  nd any.  ** "*" 
ddf0: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
de00: 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74  results set of t
de10: 68 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c  he view and will
de20: 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a   assign cursors.
de30: 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d    ** to the elem
de40: 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d  ents of the FROM
de50: 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65   clause.  But we
de60: 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65   do not want the
de70: 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20  se changes.  ** 
de80: 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e  to be permanent.
de90: 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61    So the computa
dea0: 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20  tion is done on 
deb0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
dec0: 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d  LECT.  ** statem
ded0: 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
dee0: 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a   the view..  */.
def0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
df00: 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70  ->pSelect );.  p
df10: 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  Sel = sqlite3Sel
df20: 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 6c  ectDup(db, pTabl
df30: 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  e->pSelect, 0);.
df40: 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20    if( pSel ){.  
df50: 20 20 75 38 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61    u8 enableLooka
df60: 73 69 64 65 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61  side = db->looka
df70: 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 3b 0a 20  side.bEnabled;. 
df80: 20 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e     n = pParse->n
df90: 54 61 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Tab;.    sqlite3
dfa0: 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
dfb0: 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53 65  sors(pParse, pSe
dfc0: 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 70 54  l->pSrc);.    pT
dfd0: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b  able->nCol = -1;
dfe0: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
dff0: 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b  de.bEnabled = 0;
e000: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e010: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
e020: 4f 4e 0a 20 20 20 20 78 41 75 74 68 20 3d 20 64  ON.    xAuth = d
e030: 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20 64 62  b->xAuth;.    db
e040: 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20 20 20  ->xAuth = 0;.   
e050: 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
e060: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
e070: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
e080: 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68  );.    db->xAuth
e090: 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a   = xAuth;.#else.
e0a0: 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71      pSelTab = sq
e0b0: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
e0c0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
e0d0: 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Sel);.#endif.   
e0e0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
e0f0: 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62 6c 65  Enabled = enable
e100: 4c 6f 6f 6b 61 73 69 64 65 3b 0a 20 20 20 20 70  Lookaside;.    p
e110: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b  Parse->nTab = n;
e120: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62  .    if( pSelTab
e130: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
e140: 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d  ( pTable->aCol==
e150: 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c  0 );.      pTabl
e160: 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->nCol = pSelTa
e170: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70  b->nCol;.      p
e180: 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53  Table->aCol = pS
e190: 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
e1a0: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
e1b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c   = 0;.      pSel
e1c0: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
e1d0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65       sqlite3Dele
e1e0: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c  teTable(db, pSel
e1f0: 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54 61 62  Tab);.      pTab
e200: 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6c 61  le->pSchema->fla
e210: 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74  gs |= DB_Unreset
e220: 56 69 65 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65  Views;.    }else
e230: 7b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  {.      pTable->
e240: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
e250: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nErr++;.    }.  
e260: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
e270: 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 29 3b  elete(db, pSel);
e280: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
e290: 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 23 65 6e 64  nErr++;.  }.#end
e2a0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
e2b0: 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75  T_VIEW */.  retu
e2c0: 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e  rn nErr;  .}.#en
e2d0: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
e2e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
e2f0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
e300: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
e310: 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e  LTABLE) */..#ifn
e320: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e330: 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  VIEW./*.** Clear
e340: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
e350: 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45  s from every VIE
e360: 57 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 64  W in database id
e370: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
e380: 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  d sqliteViewRese
e390: 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  tAll(sqlite3 *db
e3a0: 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61  , int idx){.  Ha
e3b0: 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28  shElem *i;.  if(
e3c0: 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28   !DbHasProperty(
e3d0: 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
e3e0: 73 65 74 56 69 65 77 73 29 20 29 20 72 65 74 75  setViews) ) retu
e3f0: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69  rn;.  for(i=sqli
e400: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
e410: 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d  >aDb[idx].pSchem
e420: 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69  a->tblHash); i;i
e430: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
e440: 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  i)){.    Table *
e450: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
e460: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
e470: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
e480: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44  ){.      sqliteD
e490: 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
e4a0: 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
e4b0: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30    pTab->aCol = 0
e4c0: 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43  ;.      pTab->nC
e4d0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ol = 0;.    }.  
e4e0: 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65  }.  DbClearPrope
e4f0: 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
e500: 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d  UnresetViews);.}
e510: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
e520: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
e530: 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f  ll(A,B).#endif /
e540: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
e550: 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  EW */../*.** Thi
e560: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
e570: 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44 42 45  lled by the VDBE
e580: 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69   to adjust the i
e590: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a  nternal schema.*
e5a0: 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65  * used by SQLite
e5b0: 20 77 68 65 6e 20 74 68 65 20 62 74 72 65 65 20   when the btree 
e5c0: 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61  layer moves a ta
e5d0: 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54  ble root page. T
e5e0: 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20  he.** root-page 
e5f0: 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  of a table or in
e600: 64 65 78 20 69 6e 20 64 61 74 61 62 61 73 65 20  dex in database 
e610: 69 44 62 20 68 61 73 20 63 68 61 6e 67 65 64 20  iDb has changed 
e620: 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f  from iFrom.** to
e630: 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b   iTo..**.** Tick
e640: 65 74 20 23 31 37 32 38 3a 20 20 54 68 65 20 73  et #1728:  The s
e650: 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68  ymbol table migh
e660: 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20  t still contain 
e670: 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f  information.** o
e680: 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20  n tables and/or 
e690: 69 6e 64 69 63 65 73 20 74 68 61 74 20 61 72 65  indices that are
e6a0: 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20   the process of 
e6b0: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a  being deleted..*
e6c0: 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c  * If you are unl
e6d0: 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f  ucky, one of tho
e6e0: 73 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63  se deleted indic
e6f0: 65 73 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67  es or tables mig
e700: 68 74 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73  ht.** have the s
e710: 61 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d  ame rootpage num
e720: 62 65 72 20 61 73 20 74 68 65 20 72 65 61 6c 20  ber as the real 
e730: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
e740: 68 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20  hat is.** being 
e750: 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61  moved.  So we ca
e760: 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68  nnot stop search
e770: 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 66 69  ing after the fi
e780: 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65  rst match .** be
e790: 63 61 75 73 65 20 74 68 65 20 66 69 72 73 74 20  cause the first 
e7a0: 6d 61 74 63 68 20 6d 69 67 68 74 20 62 65 20 66  match might be f
e7b0: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65  or one of the de
e7c0: 6c 65 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a  leted indices.**
e7d0: 20 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e   or tables and n
e7e0: 6f 74 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64  ot the table/ind
e7f0: 65 78 20 74 68 61 74 20 69 73 20 61 63 74 75 61  ex that is actua
e800: 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e  lly being moved.
e810: 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74  .** We must cont
e820: 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74  inue looping unt
e830: 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e  il all tables an
e840: 64 20 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a  d indices with.*
e850: 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f  * rootpage==iFro
e860: 6d 20 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76  m have been conv
e870: 65 72 74 65 64 20 74 6f 20 68 61 76 65 20 61 20  erted to have a 
e880: 72 6f 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a  rootpage of iTo.
e890: 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  ** in order to b
e8a0: 65 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 77  e certain that w
e8b0: 65 20 67 6f 74 20 74 68 65 20 72 69 67 68 74 20  e got the right 
e8c0: 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  one..*/.#ifndef 
e8d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
e8e0: 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69  VACUUM.void sqli
e8f0: 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64  te3RootPageMoved
e900: 28 44 62 20 2a 70 44 62 2c 20 69 6e 74 20 69 46  (Db *pDb, int iF
e910: 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20  rom, int iTo){. 
e920: 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d   HashElem *pElem
e930: 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b  ;.  Hash *pHash;
e940: 0a 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62  ..  pHash = &pDb
e950: 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
e960: 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d  sh;.  for(pElem=
e970: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
e980: 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  pHash); pElem; p
e990: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
e9a0: 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
e9b0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
e9c0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
e9d0: 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54  lem);.    if( pT
e9e0: 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20  ab->tnum==iFrom 
e9f0: 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74  ){.      pTab->t
ea00: 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d  num = iTo;.    }
ea10: 0a 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26  .  }.  pHash = &
ea20: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  pDb->pSchema->id
ea30: 78 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c  xHash;.  for(pEl
ea40: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
ea50: 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d  st(pHash); pElem
ea60: 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
ea70: 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
ea80: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
ea90: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
eaa0: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
eab0: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pIdx->tnum==iFr
eac0: 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  om ){.      pIdx
ead0: 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
eae0: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
eaf0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f  ../*.** Write co
eb00: 64 65 20 74 6f 20 65 72 61 73 65 20 74 68 65 20  de to erase the 
eb10: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
eb20: 70 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d  page iTable from
eb30: 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a   database iDb..*
eb40: 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64  * Also write cod
eb50: 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
eb60: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
eb70: 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c  ble and internal
eb80: 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20   schema.** if a 
eb90: 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f  root-page of ano
eba0: 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f  ther table is mo
ebb0: 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  ved by the btree
ebc0: 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a  -layer whilst.**
ebd0: 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20   erasing iTable 
ebe0: 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e  (this can happen
ebf0: 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61   with an auto-va
ec00: 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a  cuum database)..
ec10: 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
ec20: 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
ec30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
ec40: 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69  nt iTable, int i
ec50: 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
ec60: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
ec70: 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72  pParse);.  int r
ec80: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
ec90: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
eca0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ecb0: 70 33 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79  p3(v, OP_Destroy
ecc0: 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 69 44  , iTable, r1, iD
ecd0: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61 79  b);.  sqlite3May
ece0: 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 23  Abort(pParse);.#
ecf0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ed00: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
ed10: 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 73 74  /* OP_Destroy st
ed20: 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e 74 65 67  ores an in integ
ed30: 65 72 20 72 31 2e 20 49 66 20 74 68 69 73 20 69  er r1. If this i
ed40: 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e  nteger.  ** is n
ed50: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74  on-zero, then it
ed60: 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   is the root pag
ed70: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74 61  e number of a ta
ed80: 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a  ble moved to.  *
ed90: 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c  * location iTabl
eda0: 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e. The following
edb0: 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20 74   code modifies t
edc0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
edd0: 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72   table to.  ** r
ede0: 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20 2a  eflect this..  *
edf0: 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 4e 4e 4e  *.  ** The "#NNN
ee00: 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20  " in the SQL is 
ee10: 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61  a special consta
ee20: 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68  nt that means wh
ee30: 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a  atever value.  *
ee40: 2a 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72  * is in register
ee50: 20 4e 4e 4e 2e 20 20 53 65 65 20 67 72 61 6d 6d   NNN.  See gramm
ee60: 61 72 20 72 75 6c 65 73 20 61 73 73 6f 63 69 61  ar rules associa
ee70: 74 65 64 20 77 69 74 68 20 74 68 65 20 54 4b 5f  ted with the TK_
ee80: 52 45 47 49 53 54 45 52 0a 20 20 2a 2a 20 74 6f  REGISTER.  ** to
ee90: 6b 65 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ken for addition
eea0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
eeb0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65    */.  sqlite3Ne
eec0: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
eed0: 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54 45 20  , .     "UPDATE 
eee0: 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70 61  %Q.%s SET rootpa
eef0: 67 65 3d 25 64 20 57 48 45 52 45 20 23 25 64 20  ge=%d WHERE #%d 
ef00: 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 25 64  AND rootpage=#%d
ef10: 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ",.     pParse->
ef20: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
ef30: 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
ef40: 28 69 44 62 29 2c 20 69 54 61 62 6c 65 2c 20 72  (iDb), iTable, r
ef50: 31 2c 20 72 31 29 3b 0a 23 65 6e 64 69 66 0a 20  1, r1);.#endif. 
ef60: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
ef70: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
ef80: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  1);.}../*.** Wri
ef90: 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20  te VDBE code to 
efa0: 65 72 61 73 65 20 74 61 62 6c 65 20 70 54 61 62  erase table pTab
efb0: 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61   and all associa
efc0: 74 65 64 20 69 6e 64 69 63 65 73 20 6f 6e 20 64  ted indices on d
efd0: 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20  isk..** Code to 
efe0: 75 70 64 61 74 65 20 74 68 65 20 73 71 6c 69 74  update the sqlit
eff0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20  e_master tables 
f000: 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  and internal sch
f010: 65 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a  ema definitions.
f020: 2a 2a 20 69 6e 20 63 61 73 65 20 61 20 72 6f 6f  ** in case a roo
f030: 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  t-page belonging
f040: 20 74 6f 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   to another tabl
f050: 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68  e is moved by th
f060: 65 20 62 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a  e btree layer.**
f070: 20 69 73 20 61 6c 73 6f 20 61 64 64 65 64 20 28   is also added (
f080: 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
f090: 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63  with an auto-vac
f0a0: 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a  uum database)..*
f0b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65  /.static void de
f0c0: 73 74 72 6f 79 54 61 62 6c 65 28 50 61 72 73 65  stroyTable(Parse
f0d0: 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
f0e0: 2a 70 54 61 62 29 7b 0a 23 69 66 64 65 66 20 53  *pTab){.#ifdef S
f0f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
f100: 41 43 55 55 4d 0a 20 20 49 6e 64 65 78 20 2a 70  ACUUM.  Index *p
f110: 49 64 78 3b 0a 20 20 69 6e 74 20 69 44 62 20 3d  Idx;.  int iDb =
f120: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
f130: 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
f140: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
f150: 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50  ;.  destroyRootP
f160: 61 67 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  age(pParse, pTab
f170: 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
f180: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
f190: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
f1a0: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
f1b0: 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
f1c0: 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 64 78  age(pParse, pIdx
f1d0: 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
f1e0: 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20  }.#else.  /* If 
f1f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79  the database may
f200: 20 62 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   be auto-vacuum 
f210: 63 61 70 61 62 6c 65 20 28 69 66 20 53 51 4c 49  capable (if SQLI
f220: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
f230: 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64  UM.  ** is not d
f240: 65 66 69 6e 65 64 29 2c 20 74 68 65 6e 20 69 74  efined), then it
f250: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
f260: 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79   call OP_Destroy
f270: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61 62   on the.  ** tab
f280: 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f  le and index roo
f290: 74 2d 70 61 67 65 73 20 69 6e 20 6f 72 64 65 72  t-pages in order
f2a0: 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  , starting with 
f2b0: 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20  the numerically 
f2c0: 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f  .  ** largest ro
f2d0: 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ot-page number. 
f2e0: 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20  This guarantees 
f2f0: 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65  that none of the
f300: 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a   root-pages.  **
f310: 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64   to be destroyed
f320: 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20 62 79   is relocated by
f330: 20 61 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f 44   an earlier OP_D
f340: 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20  estroy. i.e. if 
f350: 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  the.  ** followi
f360: 6e 67 20 77 65 72 65 20 63 6f 64 65 64 3a 0a 20  ng were coded:. 
f370: 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74   **.  ** OP_Dest
f380: 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e  roy 4 0.  ** ...
f390: 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  ** OP_Destroy
f3a0: 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61   5 0.  **.  ** a
f3b0: 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 35 20 68  nd root page 5 h
f3c0: 61 70 70 65 6e 65 64 20 74 6f 20 62 65 20 74 68  appened to be th
f3d0: 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  e largest root-p
f3e0: 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68  age number in th
f3f0: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c  e.  ** database,
f400: 20 74 68 65 6e 20 72 6f 6f 74 20 70 61 67 65 20   then root page 
f410: 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64  5 would be moved
f420: 20 74 6f 20 70 61 67 65 20 34 20 62 79 20 74 68   to page 4 by th
f430: 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74  e .  ** "OP_Dest
f440: 72 6f 79 20 34 20 30 22 20 6f 70 63 6f 64 65 2e  roy 4 0" opcode.
f450: 20 54 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   The subsequent 
f460: 22 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 22  "OP_Destroy 5 0"
f470: 20 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20   would hit.  ** 
f480: 61 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65  a free-list page
f490: 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ..  */.  int iTa
f4a0: 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a  b = pTab->tnum;.
f4b0: 20 20 69 6e 74 20 69 44 65 73 74 72 6f 79 65 64    int iDestroyed
f4c0: 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = 0;..  while( 
f4d0: 31 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  1 ){.    Index *
f4e0: 70 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c  pIdx;.    int iL
f4f0: 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20  argest = 0;..   
f500: 20 69 66 28 20 69 44 65 73 74 72 6f 79 65 64 3d   if( iDestroyed=
f510: 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44 65 73 74  =0 || iTab<iDest
f520: 72 6f 79 65 64 20 29 7b 0a 20 20 20 20 20 20 69  royed ){.      i
f530: 4c 61 72 67 65 73 74 20 3d 20 69 54 61 62 3b 0a  Largest = iTab;.
f540: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 49      }.    for(pI
f550: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
f560: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
f570: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
f580: 69 6e 74 20 69 49 64 78 20 3d 20 70 49 64 78 2d  int iIdx = pIdx-
f590: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73 73  >tnum;.      ass
f5a0: 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65  ert( pIdx->pSche
f5b0: 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
f5c0: 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  a );.      if( (
f5d0: 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c  iDestroyed==0 ||
f5e0: 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f 79 65   (iIdx<iDestroye
f5f0: 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c 61 72  d)) && iIdx>iLar
f600: 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  gest ){.        
f610: 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64 78 3b  iLargest = iIdx;
f620: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f630: 20 20 20 69 66 28 20 69 4c 61 72 67 65 73 74 3d     if( iLargest=
f640: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
f650: 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rn;.    }else{. 
f660: 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
f670: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
f680: 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
f690: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
f6a0: 20 20 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f        destroyRoo
f6b0: 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c  tPage(pParse, iL
f6c0: 61 72 67 65 73 74 2c 20 69 44 62 29 3b 0a 20 20  argest, iDb);.  
f6d0: 20 20 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d      iDestroyed =
f6e0: 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 20 20 7d   iLargest;.    }
f6f0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
f700: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f710: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64  e is called to d
f720: 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20  o the work of a 
f730: 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65  DROP TABLE state
f740: 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69  ment..** pName i
f750: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
f760: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72  e table to be dr
f770: 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  opped..*/.void s
f780: 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28  qlite3DropTable(
f790: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
f7a0: 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69  rcList *pName, i
f7b0: 6e 74 20 69 73 56 69 65 77 2c 20 69 6e 74 20 6e  nt isView, int n
f7c0: 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a  oErr){.  Table *
f7d0: 70 54 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b  pTab;.  Vdbe *v;
f7e0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
f7f0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
f800: 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 64  nt iDb;..  if( d
f810: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f820: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
f830: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
f840: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
f850: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20  e->nErr==0 );.  
f860: 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e  assert( pName->n
f870: 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  Src==1 );.  if( 
f880: 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70  noErr ) db->supp
f890: 72 65 73 73 45 72 72 2b 2b 3b 0a 20 20 70 54 61  ressErr++;.  pTa
f8a0: 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
f8b0: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  eTable(pParse, i
f8c0: 73 56 69 65 77 2c 20 0a 20 20 20 20 20 20 20 20  sView, .        
f8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8e0: 20 20 20 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e      pName->a[0].
f8f0: 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  zName, pName->a[
f900: 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
f910: 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d   if( noErr ) db-
f920: 3e 73 75 70 70 72 65 73 73 45 72 72 2d 2d 3b 0a  >suppressErr--;.
f930: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
f940: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
f950: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
f960: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
f970: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
f980: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
f990: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
f9a0: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
f9b0: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61   );..  /* If pTa
f9c0: 62 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74  b is a virtual t
f9d0: 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77 47  able, call ViewG
f9e0: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20  etColumnNames() 
f9f0: 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20 69  to ensure.  ** i
fa00: 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  t is initialized
fa10: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  ..  */.  if( IsV
fa20: 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20  irtual(pTab) && 
fa30: 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
fa40: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
fa50: 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 67  , pTab) ){.    g
fa60: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
fa70: 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  ble;.  }.#ifndef
fa80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
fa90: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
faa0: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20     int code;.   
fab0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
fac0: 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
fad0: 28 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74  (iDb);.    const
fae0: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
faf0: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
fb00: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
fb10: 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20 20 20 20  *zArg2 = 0;.    
fb20: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
fb30: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
fb40: 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
fb50: 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20  , 0, zDb)){.    
fb60: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
fb70: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
fb80: 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a    if( isView ){.
fb90: 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
fba0: 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
fbb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
fbc0: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
fbd0: 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  EMP_VIEW;.      
fbe0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
fbf0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
fc00: 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a  P_VIEW;.      }.
fc10: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fc20: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
fc30: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49  .    }else if( I
fc40: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
fc50: 7b 0a 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53  {.      code = S
fc60: 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c  QLITE_DROP_VTABL
fc70: 45 3b 0a 20 20 20 20 20 20 7a 41 72 67 32 20 3d  E;.      zArg2 =
fc80: 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c   sqlite3GetVTabl
fc90: 65 28 64 62 2c 20 70 54 61 62 29 2d 3e 70 4d 6f  e(db, pTab)->pMo
fca0: 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66  d->zName;.#endif
fcb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
fcc0: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
fcd0: 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a  DB && iDb==1 ){.
fce0: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
fcf0: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
fd00: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  TABLE;.      }el
fd10: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
fd20: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
fd30: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ABLE;.      }.  
fd40: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
fd50: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
fd60: 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d  rse, code, pTab-
fd70: 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a  >zName, zArg2, z
fd80: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
fd90: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
fda0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
fdb0: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
fdc0: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
fdd0: 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a  _DELETE, pTab->z
fde0: 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b  Name, 0, zDb) ){
fdf0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
fe00: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
fe10: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
fe20: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
fe30: 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  Cmp(pTab->zName,
fe40: 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d   "sqlite_", 7)==
fe50: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
fe60: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
fe70: 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
fe80: 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
fe90: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
fea0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
feb0: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66  _table;.  }..#if
fec0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
fed0: 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72  _VIEW.  /* Ensur
fee0: 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20  e DROP TABLE is 
fef0: 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69  not used on a vi
ff00: 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45  ew, and DROP VIE
ff10: 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20  W is not used.  
ff20: 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20  ** on a table.. 
ff30: 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77   */.  if( isView
ff40: 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
ff50: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t==0 ){.    sqli
ff60: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
ff70: 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41  se, "use DROP TA
ff80: 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61  BLE to delete ta
ff90: 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a  ble %s", pTab->z
ffa0: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
ffb0: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
ffc0: 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69  .  }.  if( !isVi
ffd0: 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c  ew && pTab->pSel
ffe0: 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
fff0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
10000 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49 45  e, "use DROP VIE
10010 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77  W to delete view
10020 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   %s", pTab->zNam
10030 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
10040 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
10050 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
10060 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
10070 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65  remove the table
10080 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
10090 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64   table.  ** on d
100a0 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  isk..  */.  v = 
100b0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
100c0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
100d0 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a  ){.    Trigger *
100e0 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 44 62  pTrigger;.    Db
100f0 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
10100 5b 69 44 62 5d 3b 0a 20 20 20 20 73 71 6c 69 74  [iDb];.    sqlit
10110 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
10120 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
10130 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
10140 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
10150 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
10160 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
10170 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10180 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
10190 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d  P_VBegin);.    }
101a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
101b0 74 65 33 46 6b 44 72 6f 70 54 61 62 6c 65 28 70  te3FkDropTable(p
101c0 50 61 72 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54  Parse, pName, pT
101d0 61 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f  ab);..    /* Dro
101e0 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61  p all triggers a
101f0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
10200 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
10210 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 20  ropped. Code.   
10220 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64   ** is generated
10230 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69   to remove entri
10240 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d  es from sqlite_m
10250 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 20  aster and/or.   
10260 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f   ** sqlite_temp_
10270 6d 61 73 74 65 72 20 69 66 20 72 65 71 75 69 72  master if requir
10280 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ed..    */.    p
10290 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65  Trigger = sqlite
102a0 33 54 72 69 67 67 65 72 4c 69 73 74 28 70 50 61  3TriggerList(pPa
102b0 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  rse, pTab);.    
102c0 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20  while( pTrigger 
102d0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
102e0 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65   pTrigger->pSche
102f0 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
10300 61 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  a || .          
10310 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d  pTrigger->pSchem
10320 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  a==db->aDb[1].pS
10330 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 73  chema );.      s
10340 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65  qlite3DropTrigge
10350 72 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72  rPtr(pParse, pTr
10360 69 67 67 65 72 29 3b 0a 20 20 20 20 20 20 70 54  igger);.      pT
10370 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65  rigger = pTrigge
10380 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  r->pNext;.    }.
10390 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
103a0 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
103b0 4e 54 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  NT.    /* Remove
103c0 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20   any entries of 
103d0 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65  the sqlite_seque
103e0 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69  nce table associ
103f0 61 74 65 64 20 77 69 74 68 0a 20 20 20 20 2a 2a  ated with.    **
10400 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
10410 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69   dropped. This i
10420 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68  s done before th
10430 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70  e table is dropp
10440 65 64 0a 20 20 20 20 2a 2a 20 61 74 20 74 68 65  ed.    ** at the
10450 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e   btree level, in
10460 20 63 61 73 65 20 74 68 65 20 73 71 6c 69 74 65   case the sqlite
10470 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
10480 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20  needs to.    ** 
10490 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c 74  move as a result
104a0 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63 61   of the drop (ca
104b0 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f  n happen in auto
104c0 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20  -vacuum mode).. 
104d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
104e0 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
104f0 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  F_Autoincrement 
10500 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10510 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
10520 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c  se,.        "DEL
10530 45 54 45 20 46 52 4f 4d 20 25 73 2e 73 71 6c 69  ETE FROM %s.sqli
10540 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52  te_sequence WHER
10550 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20  E name=%Q",.    
10560 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20      pDb->zName, 
10570 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  pTab->zName.    
10580 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69    );.    }.#endi
10590 66 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61  f..    /* Drop a
105a0 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ll SQLITE_MASTER
105b0 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
105c0 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65   entries that re
105d0 66 65 72 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  fer to the.    *
105e0 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f  * table. The pro
105f0 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20  gram name loops 
10600 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74  through the mast
10610 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c  er table and del
10620 65 74 65 73 0a 20 20 20 20 2a 2a 20 65 76 65 72  etes.    ** ever
10630 79 20 72 6f 77 20 74 68 61 74 20 72 65 66 65 72  y row that refer
10640 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20  s to a table of 
10650 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
10660 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20   the one being. 
10670 20 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54     ** dropped. T
10680 72 69 67 67 65 72 73 20 61 72 65 20 68 61 6e 64  riggers are hand
10690 6c 65 64 20 73 65 70 65 72 61 74 65 6c 79 20 62  led seperately b
106a0 65 63 61 75 73 65 20 61 20 74 72 69 67 67 65 72  ecause a trigger
106b0 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 63   can be.    ** c
106c0 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 74 65  reated in the te
106d0 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 61 74  mp database that
106e0 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
106f0 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20  le in another.  
10700 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20    ** database.. 
10710 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
10720 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
10730 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 44  rse, .        "D
10740 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
10750 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d   WHERE tbl_name=
10760 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72  %Q and type!='tr
10770 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 20  igger'",.       
10780 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48   pDb->zName, SCH
10790 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20  EMA_TABLE(iDb), 
107a0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20  pTab->zName);.. 
107b0 20 20 20 2f 2a 20 44 72 6f 70 20 61 6e 79 20 73     /* Drop any s
107c0 74 61 74 69 73 74 69 63 73 20 66 72 6f 6d 20 74  tatistics from t
107d0 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20  he sqlite_stat1 
107e0 74 61 62 6c 65 2c 20 69 66 20 69 74 20 65 78 69  table, if it exi
107f0 73 74 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  sts */.    if( s
10800 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
10810 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74  db, "sqlite_stat
10820 31 22 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  1", db->aDb[iDb]
10830 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  .zName) ){.     
10840 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
10850 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
10860 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
10870 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 31   %Q.sqlite_stat1
10880 20 57 48 45 52 45 20 74 62 6c 3d 25 51 22 2c 20   WHERE tbl=%Q", 
10890 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62  pDb->zName, pTab
108a0 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b  ->zName.      );
108b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
108c0 21 69 73 56 69 65 77 20 26 26 20 21 49 73 56 69  !isView && !IsVi
108d0 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
108e0 20 20 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c       destroyTabl
108f0 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b  e(pParse, pTab);
10900 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
10910 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20  emove the table 
10920 65 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74  entry from SQLit
10930 65 27 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  e's internal sch
10940 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20  ema and modify. 
10950 20 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61     ** the schema
10960 20 63 6f 6f 6b 69 65 2e 0a 20 20 20 20 2a 2f 0a   cookie..    */.
10970 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
10980 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
10990 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
109a0 70 34 28 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f  p4(v, OP_VDestro
109b0 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54  y, iDb, 0, 0, pT
109c0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
109d0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
109e0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
109f0 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c  _DropTable, iDb,
10a00 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61   0, 0, pTab->zNa
10a10 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  me, 0);.    sqli
10a20 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
10a30 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
10a40 7d 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52 65  }.  sqliteViewRe
10a50 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b  setAll(db, iDb);
10a60 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  ..exit_drop_tabl
10a70 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  e:.  sqlite3SrcL
10a80 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e  istDelete(db, pN
10a90 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ame);.}../*.** T
10aa0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
10ab0 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
10ac0 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65  a new foreign ke
10ad0 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a  y on the table.*
10ae0 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  * currently unde
10af0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
10b00 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d   pFromCol determ
10b10 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d  ines which colum
10b20 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72  ns.** in the cur
10b30 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74  rent table point
10b40 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20   to the foreign 
10b50 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f  key.  If pFromCo
10b60 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e  l==0 then.** con
10b70 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20  nect the key to 
10b80 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
10b90 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69  inserted.  pTo i
10ba0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a  s the name of.**
10bb0 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65 72   the table refer
10bc0 72 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20  red to.  pToCol 
10bd0 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 61 62  is a list of tab
10be0 6c 65 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  les in the other
10bf0 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20 74 68  .** pTo table th
10c00 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  at the foreign k
10c10 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66  ey points to.  f
10c20 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c  lags contains al
10c30 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
10c40 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c   about the confl
10c50 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
10c60 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66  lgorithms specif
10c70 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e  ied.** in the ON
10c80 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41   DELETE, ON UPDA
10c90 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54  TE and ON INSERT
10ca0 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
10cb0 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75 72  An FKey structur
10cc0 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  e is created and
10cd0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
10ce0 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  ble currently.**
10cf0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
10d00 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73  ion in the pPars
10d10 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65  e->pNewTable fie
10d20 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ld..**.** The fo
10d30 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74  reign key is set
10d40 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70   for IMMEDIATE p
10d50 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75  rocessing.  A su
10d60 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a  bsequent call.**
10d70 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72   to sqlite3Defer
10d80 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67  ForeignKey() mig
10d90 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74  ht change this t
10da0 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76  o DEFERRED..*/.v
10db0 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74  oid sqlite3Creat
10dc0 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50  eForeignKey(.  P
10dd0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
10de0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
10df0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
10e00 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20  List *pFromCol, 
10e10 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
10e20 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70  his table that p
10e30 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61  oint to other ta
10e40 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ble */.  Token *
10e50 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  pTo,          /*
10e60 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68   Name of the oth
10e70 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  er table */.  Ex
10e80 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20  prList *pToCol, 
10e90 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e     /* Columns in
10ea0 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65   the other table
10eb0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
10ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
10ed0 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
10ee0 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f  n algorithms. */
10ef0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
10f00 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
10f10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10f20 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
10f30 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20    FKey *pFKey = 
10f40 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e 65 78 74  0;.  FKey *pNext
10f50 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d  To;.  Table *p =
10f60 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
10f70 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  le;.  int nByte;
10f80 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
10f90 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nCol;.  char *z;
10fa0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 21  ..  assert( pTo!
10fb0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
10fc0 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56   || IN_DECLARE_V
10fd0 54 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  TAB ) goto fk_en
10fe0 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  d;.  if( pFromCo
10ff0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  l==0 ){.    int 
11000 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  iCol = p->nCol-1
11010 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
11020 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74 6f 20 66  iCol<0) ) goto f
11030 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70  k_end;.    if( p
11040 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
11050 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20  >nExpr!=1 ){.   
11060 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
11070 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65  sg(pParse, "fore
11080 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20  ign key on %s". 
11090 20 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64          " should
110a0 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20   reference only 
110b0 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61  one column of ta
110c0 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20  ble %T",.       
110d0 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e    p->aCol[iCol].
110e0 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20  zName, pTo);.   
110f0 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
11100 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d      }.    nCol =
11110 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
11120 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c  pToCol && pToCol
11130 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f  ->nExpr!=pFromCo
11140 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  l->nExpr ){.    
11150 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
11160 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
11170 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d  "number of colum
11180 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  ns in foreign ke
11190 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  y does not match
111a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22   the number of "
111b0 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e  .        "column
111c0 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e  s in the referen
111d0 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20  ced table");.   
111e0 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
111f0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20  }else{.    nCol 
11200 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70  = pFromCol->nExp
11210 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  r;.  }.  nByte =
11220 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20   sizeof(*pFKey) 
11230 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f  + (nCol-1)*sizeo
11240 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d  f(pFKey->aCol[0]
11250 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a  ) + pTo->n + 1;.
11260 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a    if( pToCol ){.
11270 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
11280 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b  ToCol->nExpr; i+
11290 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20  +){.      nByte 
112a0 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
112b0 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  30(pToCol->a[i].
112c0 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20  zName) + 1;.    
112d0 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20  }.  }.  pFKey = 
112e0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
112f0 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 29 3b  ero(db, nByte );
11300 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20  .  if( pFKey==0 
11310 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  ){.    goto fk_e
11320 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d  nd;.  }.  pFKey-
11330 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46  >pFrom = p;.  pF
11340 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d  Key->pNextFrom =
11350 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d   p->pFKey;.  z =
11360 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 2d 3e   (char*)&pFKey->
11370 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46  aCol[nCol];.  pF
11380 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20  Key->zTo = z;.  
11390 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a  memcpy(z, pTo->z
113a0 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70  , pTo->n);.  z[p
113b0 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71  To->n] = 0;.  sq
113c0 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b  lite3Dequote(z);
113d0 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31  .  z += pTo->n+1
113e0 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20  ;.  pFKey->nCol 
113f0 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46  = nCol;.  if( pF
11400 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
11410 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e   pFKey->aCol[0].
11420 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  iFrom = p->nCol-
11430 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
11440 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
11450 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
11460 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
11470 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b  0; j<p->nCol; j+
11480 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
11490 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
114a0 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  ->aCol[j].zName,
114b0 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e   pFromCol->a[i].
114c0 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
114d0 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43         pFKey->aC
114e0 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b  ol[i].iFrom = j;
114f0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
11500 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11510 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e    }.      if( j>
11520 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  =p->nCol ){.    
11530 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
11540 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
11550 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20         "unknown 
11560 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e  column \"%s\" in
11570 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
11580 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20  inition", .     
11590 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61       pFromCol->a
115a0 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
115b0 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
115c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
115d0 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20   }.  if( pToCol 
115e0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
115f0 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
11600 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69      int n = sqli
11610 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43  te3Strlen30(pToC
11620 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
11630 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43  .      pFKey->aC
11640 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a  ol[i].zCol = z;.
11650 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20        memcpy(z, 
11660 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
11670 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b  me, n);.      z[
11680 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20  n] = 0;.      z 
11690 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  += n+1;.    }.  
116a0 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  }.  pFKey->isDef
116b0 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b  erred = 0;.  pFK
116c0 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 20 3d  ey->aAction[0] =
116d0 20 28 75 38 29 28 66 6c 61 67 73 20 26 20 30 78   (u8)(flags & 0x
116e0 66 66 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ff);            
116f0 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20 61 63 74  /* ON DELETE act
11700 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e  ion */.  pFKey->
11710 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20 28 75 38  aAction[1] = (u8
11720 29 28 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20  )((flags >> 8 ) 
11730 26 20 30 78 66 66 29 3b 20 20 20 20 2f 2a 20 4f  & 0xff);    /* O
11740 4e 20 55 50 44 41 54 45 20 61 63 74 69 6f 6e 20  N UPDATE action 
11750 2a 2f 0a 0a 20 20 70 4e 65 78 74 54 6f 20 3d 20  */..  pNextTo = 
11760 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65 33 48  (FKey *)sqlite3H
11770 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53  ashInsert(&p->pS
11780 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c  chema->fkeyHash,
11790 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a   .      pFKey->z
117a0 54 6f 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  To, sqlite3Strle
117b0 6e 33 30 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2c  n30(pFKey->zTo),
117c0 20 28 76 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20   (void *)pFKey. 
117d0 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 78 74 54   );.  if( pNextT
117e0 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a 20 20 20 20  o==pFKey ){.    
117f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11800 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 66   = 1;.    goto f
11810 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  k_end;.  }.  if(
11820 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20 20 20   pNextTo ){.    
11830 61 73 73 65 72 74 28 20 70 4e 65 78 74 54 6f 2d  assert( pNextTo-
11840 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20  >pPrevTo==0 );. 
11850 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54     pFKey->pNextT
11860 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20  o = pNextTo;.   
11870 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54   pNextTo->pPrevT
11880 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a  o = pFKey;.  }..
11890 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f    /* Link the fo
118a0 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65  reign key to the
118b0 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61   table as the la
118c0 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20  st step..  */.  
118d0 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79  p->pFKey = pFKey
118e0 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a  ;.  pFKey = 0;..
118f0 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65  fk_end:.  sqlite
11900 33 44 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65  3DbFree(db, pFKe
11910 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  y);.#endif /* !d
11920 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
11930 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20  IT_FOREIGN_KEY) 
11940 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
11950 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
11960 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  FromCol);.  sqli
11970 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
11980 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d  e(db, pToCol);.}
11990 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
119a0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
119b0 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59  hen an INITIALLY
119c0 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e   IMMEDIATE or IN
119d0 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
119e0 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65  .** clause is se
119f0 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  en as part of a 
11a00 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
11a10 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44  nition.  The isD
11a20 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d  eferred.** param
11a30 65 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e  eter is 1 for IN
11a40 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
11a50 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49   and 0 for INITI
11a60 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a  ALLY IMMEDIATE..
11a70 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20  ** The behavior 
11a80 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
11a90 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72  ntly created for
11aa0 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75  eign key is adju
11ab0 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e  sted.** accordin
11ac0 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  gly..*/.void sql
11ad0 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
11ae0 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  Key(Parse *pPars
11af0 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65  e, int isDeferre
11b00 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  d){.#ifndef SQLI
11b10 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
11b20 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  KEY.  Table *pTa
11b30 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  b;.  FKey *pFKey
11b40 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20  ;.  if( (pTab = 
11b50 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
11b60 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20  e)==0 || (pFKey 
11b70 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d  = pTab->pFKey)==
11b80 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
11b90 73 65 72 74 28 20 69 73 44 65 66 65 72 72 65 64  sert( isDeferred
11ba0 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65 72 72 65  ==0 || isDeferre
11bb0 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52  d==1 ); /* EV: R
11bc0 2d 33 30 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a  -30323-21917 */.
11bd0 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72    pFKey->isDefer
11be0 72 65 64 20 3d 20 28 75 38 29 69 73 44 65 66 65  red = (u8)isDefe
11bf0 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rred;.#endif.}..
11c00 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
11c10 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72  ode that will er
11c20 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69  ase and refill i
11c30 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69  ndex *pIdx.  Thi
11c40 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  s is.** used to 
11c50 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77  initialize a new
11c60 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 65 78  ly created index
11c70 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65   or to recompute
11c80 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
11c90 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72  of an index in r
11ca0 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49  esponse to a REI
11cb0 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  NDEX command..**
11cc0 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61  .** if memRootPa
11cd0 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69  ge is not negati
11ce0 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ve, it means tha
11cf0 74 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e  t the index is n
11d00 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e  ewly.** created.
11d10 20 20 54 68 65 20 72 65 67 69 73 74 65 72 20 73    The register s
11d20 70 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52  pecified by memR
11d30 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  ootPage contains
11d40 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
11d50 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
11d60 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f  index.  If memRo
11d70 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  otPage is negati
11d80 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ve, then.** the 
11d90 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
11da0 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65  ists and must be
11db0 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20   cleared before 
11dc0 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61  being refilled a
11dd0 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70  nd.** the root p
11de0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
11df0 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e  e index is taken
11e00 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e   from pIndex->tn
11e10 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  um..*/.static vo
11e20 69 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c  id sqlite3Refill
11e30 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
11e40 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64  rse, Index *pInd
11e50 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50  ex, int memRootP
11e60 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  age){.  Table *p
11e70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54  Tab = pIndex->pT
11e80 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61  able;  /* The ta
11e90 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64 65  ble that is inde
11ea0 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  xed */.  int iTa
11eb0 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
11ec0 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65  ++;     /* Btree
11ed0 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   cursor used for
11ee0 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69   pTab */.  int i
11ef0 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
11f00 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72  ab++;     /* Btr
11f10 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
11f20 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69  or pIndex */.  i
11f30 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20  nt addr1;       
11f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11f50 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20   Address of top 
11f60 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  of loop */.  int
11f70 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20   tnum;          
11f80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
11f90 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65  oot page of inde
11fa0 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  x */.  Vdbe *v; 
11fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fc0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
11fd0 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
11fe0 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
11ff0 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
12000 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  Key;            
12010 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20       /* KeyInfo 
12020 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  for index */.  i
12030 6e 74 20 72 65 67 49 64 78 4b 65 79 3b 20 20 20  nt regIdxKey;   
12040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12050 20 52 65 67 69 73 74 65 72 73 20 63 6f 6e 74 61   Registers conta
12060 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  ining the index 
12070 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  key */.  int reg
12080 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20  Record;         
12090 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
120a0 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73 73 65  ter holding asse
120b0 6d 62 6c 69 65 64 20 69 6e 64 65 78 20 72 65 63  mblied index rec
120c0 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ord */.  sqlite3
120d0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
120e0 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  b;      /* The d
120f0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
12100 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20  on */.  int iDb 
12110 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
12120 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  oIndex(db, pInde
12130 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69  x->pSchema);..#i
12140 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12150 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
12160 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
12170 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
12180 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20 70  QLITE_REINDEX, p
12190 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c  Index->zName, 0,
121a0 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
121b0 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20  Db].zName ) ){. 
121c0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
121d0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75  endif..  /* Requ
121e0 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
121f0 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f   on the table to
12200 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70   perform this op
12210 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  eration */.  sql
12220 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
12230 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
12240 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e  >tnum, 1, pTab->
12250 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73  zName);..  v = s
12260 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
12270 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
12280 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
12290 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30  ( memRootPage>=0
122a0 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d   ){.    tnum = m
122b0 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65  emRootPage;.  }e
122c0 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20  lse{.    tnum = 
122d0 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20  pIndex->tnum;.  
122e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
122f0 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c  Op2(v, OP_Clear,
12300 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d   tnum, iDb);.  }
12310 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  .  pKey = sqlite
12320 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
12330 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20  arse, pIndex);. 
12340 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12350 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  p4(v, OP_OpenWri
12360 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20  te, iIdx, tnum, 
12370 69 44 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  iDb, .          
12380 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 20            (char 
12390 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e  *)pKey, P4_KEYIN
123a0 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 69  FO_HANDOFF);.  i
123b0 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d  f( memRootPage>=
123c0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
123d0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
123e0 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  1);.  }.  sqlite
123f0 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
12400 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54  e, iTab, iDb, pT
12410 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
12420 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
12430 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12440 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62   OP_Rewind, iTab
12450 2c 20 30 29 3b 0a 20 20 72 65 67 52 65 63 6f 72  , 0);.  regRecor
12460 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
12470 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
12480 20 72 65 67 49 64 78 4b 65 79 20 3d 20 73 71 6c   regIdxKey = sql
12490 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65  ite3GenerateInde
124a0 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49 6e  xKey(pParse, pIn
124b0 64 65 78 2c 20 69 54 61 62 2c 20 72 65 67 52 65  dex, iTab, regRe
124c0 63 6f 72 64 2c 20 31 29 3b 0a 20 20 69 66 28 20  cord, 1);.  if( 
124d0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21  pIndex->onError!
124e0 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20  =OE_None ){.    
124f0 63 6f 6e 73 74 20 69 6e 74 20 72 65 67 52 6f 77  const int regRow
12500 69 64 20 3d 20 72 65 67 49 64 78 4b 65 79 20 2b  id = regIdxKey +
12510 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
12520 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  ;.    const int 
12530 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j2 = sqlite3Vdbe
12540 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
12550 20 32 3b 0a 20 20 20 20 76 6f 69 64 20 2a 20 63   2;.    void * c
12560 6f 6e 73 74 20 70 52 65 67 4b 65 79 20 3d 20 53  onst pRegKey = S
12570 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
12580 28 72 65 67 49 64 78 4b 65 79 29 3b 0a 0a 20 20  (regIdxKey);..  
12590 20 20 2f 2a 20 54 68 65 20 72 65 67 69 73 74 65    /* The registe
125a0 72 73 20 61 63 63 65 73 73 65 64 20 62 79 20 74  rs accessed by t
125b0 68 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 20 6f  he OP_IsUnique o
125c0 70 63 6f 64 65 20 77 65 72 65 20 61 6c 6c 6f 63  pcode were alloc
125d0 61 74 65 64 0a 20 20 20 20 2a 2a 20 75 73 69 6e  ated.    ** usin
125e0 67 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  g sqlite3GetTemp
125f0 52 61 6e 67 65 28 29 20 69 6e 73 69 64 65 20 6f  Range() inside o
12600 66 20 74 68 65 20 73 71 6c 69 74 65 33 47 65 6e  f the sqlite3Gen
12610 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 29 0a  erateIndexKey().
12620 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76      ** call abov
12630 65 2e 20 4a 75 73 74 20 62 65 66 6f 72 65 20 74  e. Just before t
12640 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  hat function was
12650 20 66 72 65 65 64 20 74 68 65 79 20 77 65 72 65   freed they were
12660 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a   released.    **
12670 20 28 6d 61 64 65 20 61 76 61 69 6c 61 62 6c 65   (made available
12680 20 74 6f 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   to the compiler
12690 20 66 6f 72 20 72 65 75 73 65 29 20 75 73 69 6e   for reuse) usin
126a0 67 20 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  g .    ** sqlite
126b0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
126c0 65 28 29 2e 20 53 6f 20 69 6e 20 73 6f 6d 65 20  e(). So in some 
126d0 77 61 79 73 20 68 61 76 69 6e 67 20 74 68 65 20  ways having the 
126e0 4f 50 5f 49 73 55 6e 69 71 75 65 0a 20 20 20 20  OP_IsUnique.    
126f0 2a 2a 20 6f 70 63 6f 64 65 20 75 73 65 20 74 68  ** opcode use th
12700 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20  e values stored 
12710 77 69 74 68 69 6e 20 73 65 65 6d 73 20 64 61 6e  within seems dan
12720 67 65 72 6f 75 73 2e 20 48 6f 77 65 76 65 72 2c  gerous. However,
12730 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20 77 65   since.    ** we
12740 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 61   can be sure tha
12750 74 20 6e 6f 20 6f 74 68 65 72 20 74 65 6d 70 20  t no other temp 
12760 72 65 67 69 73 74 65 72 73 20 68 61 76 65 20 62  registers have b
12770 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20  een allocated.  
12780 20 20 2a 2a 20 73 69 6e 63 65 20 73 71 6c 69 74    ** since sqlit
12790 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
127a0 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2c  ge() was called,
127b0 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 64   it is safe to d
127c0 6f 20 73 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o so..    */.   
127d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
127e0 70 34 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71 75  p4(v, OP_IsUniqu
127f0 65 2c 20 69 49 64 78 2c 20 6a 32 2c 20 72 65 67  e, iIdx, j2, reg
12800 52 6f 77 69 64 2c 20 70 52 65 67 4b 65 79 2c 20  Rowid, pRegKey, 
12810 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 73  P4_INT32);.    s
12820 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72  qlite3HaltConstr
12830 61 69 6e 74 28 0a 20 20 20 20 20 20 20 20 70 50  aint(.        pP
12840 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20  arse, OE_Abort, 
12850 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73  "indexed columns
12860 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22   are not unique"
12870 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
12880 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
12890 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
128a0 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72 65 67  nsert, iIdx, reg
128b0 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
128c0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
128d0 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
128e0 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74  RESULT);.  sqlit
128f0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
12900 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
12910 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rd);.  sqlite3Vd
12920 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
12930 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31  ext, iTab, addr1
12940 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  +1);.  sqlite3Vd
12950 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
12960 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  dr1);.  sqlite3V
12970 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
12980 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20 20  Close, iTab);.  
12990 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
129a0 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
129b0 49 64 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  Idx);.}../*.** C
129c0 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65  reate a new inde
129d0 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62  x for an SQL tab
129e0 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d  le.  pName1.pNam
129f0 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  e2 is the name o
12a00 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20  f the index .** 
12a10 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20  and pTblList is 
12a20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
12a30 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
12a40 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f   be indexed.  Bo
12a50 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e  th will .** be N
12a60 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72  ULL for a primar
12a70 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65  y key or an inde
12a80 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65  x that is create
12a90 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a  d to satisfy a.*
12aa0 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
12ab0 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20  int.  If pTable 
12ac0 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e  and pIndex are N
12ad0 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d  ULL, use pParse-
12ae0 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73  >pNewTable.** as
12af0 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
12b00 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73   indexed.  pPars
12b10 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20  e->pNewTable is 
12b20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a  a table that is.
12b30 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ** currently bei
12b40 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ng constructed b
12b50 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  y a CREATE TABLE
12b60 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
12b70 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73  * pList is a lis
12b80 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
12b90 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69  be indexed.  pLi
12ba0 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  st will be NULL 
12bb0 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20  if this.** is a 
12bc0 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75  primary key or u
12bd0 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74  nique-constraint
12be0 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
12bf0 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ent column added
12c00 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65  .** to the table
12c10 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
12c20 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
12c30 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
12c40 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20 73  dex is created s
12c50 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 72 65 74  uccessfully, ret
12c60 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
12c70 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 0a 2a   the new Index.*
12c80 2a 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 69  * structure. Thi
12c90 73 20 69 73 20 75 73 65 64 20 62 79 20 73 71 6c  s is used by sql
12ca0 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65  ite3AddPrimaryKe
12cb0 79 28 29 20 74 6f 20 6d 61 72 6b 20 74 68 65 20  y() to mark the 
12cc0 69 6e 64 65 78 0a 2a 2a 20 61 73 20 74 68 65 20  index.** as the 
12cd0 74 61 62 6c 65 73 20 70 72 69 6d 61 72 79 20 6b  tables primary k
12ce0 65 79 20 28 49 6e 64 65 78 2e 61 75 74 6f 49 6e  ey (Index.autoIn
12cf0 64 65 78 3d 3d 32 29 2e 0a 2a 2f 0a 49 6e 64 65  dex==2)..*/.Inde
12d00 78 20 2a 73 71 6c 69 74 65 33 43 72 65 61 74 65  x *sqlite3Create
12d10 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
12d20 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41  pParse,     /* A
12d30 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ll information a
12d40 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20  bout this parse 
12d50 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
12d60 65 31 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74  e1,     /* First
12d70 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e   part of index n
12d80 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ame. May be NULL
12d90 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
12da0 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f  me2,     /* Seco
12db0 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78  nd part of index
12dc0 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55   name. May be NU
12dd0 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  LL */.  SrcList 
12de0 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61  *pTblName, /* Ta
12df0 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73  ble to index. Us
12e00 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
12e10 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78  ble if 0 */.  Ex
12e20 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
12e30 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f   /* A list of co
12e40 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65  lumns to be inde
12e50 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  xed */.  int onE
12e60 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f  rror,       /* O
12e70 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f  E_Abort, OE_Igno
12e80 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20  re, OE_Replace, 
12e90 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20  or OE_None */.  
12ea0 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20  Token *pStart,  
12eb0 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
12ec0 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
12ed0 6e 73 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  ns this statemen
12ee0 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45  t */.  Token *pE
12ef0 6e 64 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  nd,       /* The
12f00 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73   ")" that closes
12f10 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45   the CREATE INDE
12f20 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  X statement */. 
12f30 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20   int sortOrder, 
12f40 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65      /* Sort orde
12f50 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79  r of primary key
12f60 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c   when pList==NUL
12f70 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74  L */.  int ifNot
12f80 45 78 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69  Exist     /* Omi
12f90 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78  t error if index
12fa0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
12fb0 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
12fc0 52 65 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Ret = 0;     /* 
12fd0 50 6f 69 6e 74 65 72 20 74 6f 20 72 65 74 75 72  Pointer to retur
12fe0 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  n */.  Table *pT
12ff0 61 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  ab = 0;     /* T
13000 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
13010 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
13020 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20  Index = 0;   /* 
13030 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
13040 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61  created */.  cha
13050 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20  r *zName = 0;   
13060 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
13070 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
13080 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
13090 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
130a0 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d  aracters in zNam
130b0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  e */.  int i, j;
130c0 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b  .  Token nullId;
130d0 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20          /* Fake 
130e0 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70  token for an emp
130f0 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20  ty ID list */.  
13100 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20  DbFixer sFix;   
13110 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69       /* For assi
13120 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e  gning database n
13130 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a  ames to pTable *
13140 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
13150 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f  rMask;   /* 1 to
13160 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69   honor DESC in i
13170 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f  ndex.  0 to igno
13180 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  re. */.  sqlite3
13190 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
131a0 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  b;.  Db *pDb;   
131b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
131c0 20 73 70 65 63 69 66 69 63 20 74 61 62 6c 65 20   specific table 
131d0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69  containing the i
131e0 6e 64 65 78 65 64 20 64 61 74 61 62 61 73 65 20  ndexed database 
131f0 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
13200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
13210 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
13220 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  se that is being
13230 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f   written */.  To
13240 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20  ken *pName = 0; 
13250 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65     /* Unqualifie
13260 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  d name of the in
13270 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f  dex to create */
13280 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
13290 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74  st_item *pListIt
132a0 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  em; /* For loopi
132b0 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f  ng over pList */
132c0 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 69  .  int nCol;.  i
132d0 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20  nt nExtra = 0;. 
132e0 20 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a 0a   char *zExtra;..
132f0 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74    assert( pStart
13300 3d 3d 30 20 7c 7c 20 70 45 6e 64 21 3d 30 20 29  ==0 || pEnd!=0 )
13310 3b 20 2f 2a 20 70 45 6e 64 20 6d 75 73 74 20 62  ; /* pEnd must b
13320 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 70 53  e non-NULL if pS
13330 74 61 72 74 20 69 73 20 2a 2f 0a 20 20 61 73 73  tart is */.  ass
13340 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
13350 72 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  r==0 );      /* 
13360 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74  Never called wit
13370 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a  h prior errors *
13380 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  /.  if( db->mall
13390 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49 4e 5f 44  ocFailed || IN_D
133a0 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20  ECLARE_VTAB ){. 
133b0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
133c0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
133d0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
133e0 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
133f0 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
13400 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
13410 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  e_index;.  }..  
13420 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
13430 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
13440 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52  o be indexed.  R
13450 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e  eturn early if n
13460 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20  ot found..  */. 
13470 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
13480 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20   ){..    /* Use 
13490 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64  the two-part ind
134a0 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72  ex name to deter
134b0 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73  mine the databas
134c0 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61  e .    ** to sea
134d0 72 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c  rch for the tabl
134e0 65 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62  e. 'Fix' the tab
134f0 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20  le name to this 
13500 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  db.    ** before
13510 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20   looking up the 
13520 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
13530 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31    assert( pName1
13540 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20   && pName2 );.  
13550 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
13560 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
13570 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
13580 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20  2, &pName);.    
13590 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f  if( iDb<0 ) goto
135a0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
135b0 65 78 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ex;..#ifndef SQL
135c0 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a  ITE_OMIT_TEMPDB.
135d0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e      /* If the in
135e0 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71  dex name was unq
135f0 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20  ualified, check 
13600 69 66 20 74 68 65 20 74 68 65 20 74 61 62 6c 65  if the the table
13610 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d  .    ** is a tem
13620 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20  p table. If so, 
13630 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  set the database
13640 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f   to 1. Do not do
13650 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 66 20   this.    ** if 
13660 69 6e 69 74 69 61 6c 69 73 69 6e 67 20 61 20 64  initialising a d
13670 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a  atabase schema..
13680 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
13690 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
136a0 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71  .      pTab = sq
136b0 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b  lite3SrcListLook
136c0 75 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e  up(pParse, pTblN
136d0 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
136e0 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20  pName2->n==0 && 
136f0 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53  pTab && pTab->pS
13700 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31  chema==db->aDb[1
13710 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ].pSchema ){.   
13720 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20       iDb = 1;.  
13730 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
13740 69 66 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69  if..    if( sqli
13750 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78  te3FixInit(&sFix
13760 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  , pParse, iDb, "
13770 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 20 26  index", pName) &
13780 26 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  &.        sqlite
13790 33 46 69 78 53 72 63 4c 69 73 74 28 26 73 46 69  3FixSrcList(&sFi
137a0 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20 20  x, pTblName).   
137b0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63   ){.      /* Bec
137c0 61 75 73 65 20 74 68 65 20 70 61 72 73 65 72 20  ause the parser 
137d0 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e  constructs pTblN
137e0 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  ame from a singl
137f0 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20  e identifier,.  
13800 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69      ** sqlite3Fi
13810 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76  xSrcList can nev
13820 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20  er fail. */.    
13830 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20    assert(0);.   
13840 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71   }.    pTab = sq
13850 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
13860 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54 62 6c  (pParse, 0, pTbl
13870 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  Name->a[0].zName
13880 2c 20 0a 20 20 20 20 20 20 20 20 70 54 62 6c 4e  , .        pTblN
13890 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
138a0 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ase);.    if( !p
138b0 54 61 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Tab || db->mallo
138c0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65  cFailed ) goto e
138d0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
138e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
138f0 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
13900 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
13910 61 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  a );.  }else{.  
13920 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d    assert( pName=
13930 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d  =0 );.    pTab =
13940 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
13950 6c 65 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61  le;.    if( !pTa
13960 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  b ) goto exit_cr
13970 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
13980 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
13990 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
139a0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
139b0 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e   }.  pDb = &db->
139c0 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 61 73 73  aDb[iDb];..  ass
139d0 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
139e0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
139f0 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69  ->nErr==0 );.  i
13a00 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
13a10 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  mp(pTab->zName, 
13a20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
13a30 20 0a 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63   .       && memc
13a40 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b  mp(&pTab->zName[
13a50 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c 39  7],"altertab_",9
13a60 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
13a70 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
13a80 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
13a90 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
13aa0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
13ab0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
13ac0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
13ad0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13ae0 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20  OMIT_VIEW.  if( 
13af0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
13b00 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
13b10 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
13b20 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  ews may not be i
13b30 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f  ndexed");.    go
13b40 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
13b50 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ndex;.  }.#endif
13b60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13b70 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
13b80 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  E.  if( IsVirtua
13b90 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73  l(pTab) ){.    s
13ba0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
13bb0 50 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c 20  Parse, "virtual 
13bc0 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62  tables may not b
13bd0 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20  e indexed");.   
13be0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
13bf0 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e  e_index;.  }.#en
13c00 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46  dif..  /*.  ** F
13c10 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ind the name of 
13c20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65  the index.  Make
13c30 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e   sure there is n
13c40 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68  ot already anoth
13c50 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72  er.  ** index or
13c60 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
13c70 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a  same name.  .  *
13c80 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e  *.  ** Exception
13c90 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65 61  :  If we are rea
13ca0 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f  ding the names o
13cb0 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69  f permanent indi
13cc0 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a  ces from the.  *
13cd0 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  * sqlite_master 
13ce0 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20 73  table (because s
13cf0 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
13d00 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73 63  s changed the sc
13d10 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f  hema) and.  ** o
13d20 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ne of the index 
13d30 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77  names collides w
13d40 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ith the name of 
13d50 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
13d60 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c  e or.  ** index,
13d70 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f   then we will co
13d80 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73  ntinue to proces
13d90 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20  s this index..  
13da0 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65  **.  ** If pName
13db0 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ==0 it means tha
13dc0 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65  t we are.  ** de
13dd0 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72 69  aling with a pri
13de0 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51  mary key or UNIQ
13df0 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20  UE constraint.  
13e00 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e  We have to inven
13e10 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e  t our.  ** own n
13e20 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ame..  */.  if( 
13e30 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61  pName ){.    zNa
13e40 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
13e50 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
13e60 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  ame);.    if( zN
13e70 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ame==0 ) goto ex
13e80 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13e90 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
13ea0 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
13eb0 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
13ec0 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
13ed0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
13ee0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
13ef0 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
13f00 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20  it.busy ){.     
13f10 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
13f20 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
13f30 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)!=0 ){.      
13f40 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13f50 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
13f60 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61   is already a ta
13f70 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  ble named %s", z
13f80 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
13f90 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
13fa0 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
13fb0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
13fc0 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
13fd0 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e  , zName, pDb->zN
13fe0 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
13ff0 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74   if( !ifNotExist
14000 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
14010 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14020 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c  se, "index %s al
14030 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a  ready exists", z
14040 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
14050 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
14060 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
14070 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
14080 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78  int n;.    Index
14090 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72   *pLoop;.    for
140a0 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e  (pLoop=pTab->pIn
140b0 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b  dex, n=1; pLoop;
140c0 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e   pLoop=pLoop->pN
140d0 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20  ext, n++){}.    
140e0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
140f0 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69  Printf(db, "sqli
14100 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f  te_autoindex_%s_
14110 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %d", pTab->zName
14120 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  , n);.    if( zN
14130 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
14140 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
14150 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
14160 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
14170 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  r authorization 
14180 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64  to create an ind
14190 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ex..  */.#ifndef
141a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
141b0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
141c0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
141d0 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b  Db = pDb->zName;
141e0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
141f0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
14200 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
14210 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
14220 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  b), 0, zDb) ){. 
14230 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
14240 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
14250 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54   }.    i = SQLIT
14260 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a  E_CREATE_INDEX;.
14270 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
14280 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
14290 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
142a0 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  TE_TEMP_INDEX;. 
142b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
142c0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
142d0 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i, zName, pTab->
142e0 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
142f0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
14300 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
14310 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
14320 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c   /* If pList==0,
14330 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72   it means this r
14340 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
14350 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d  d to make a prim
14360 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74  ary.  ** key out
14370 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   of the last col
14380 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  umn added to the
14390 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
143a0 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  struction..  ** 
143b0 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65  So create a fake
143c0 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74   list to simulat
143d0 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69  e this..  */.  i
143e0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
143f0 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54     nullId.z = pT
14400 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e  ab->aCol[pTab->n
14410 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col-1].zName;.  
14420 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 71 6c    nullId.n = sql
14430 69 74 65 33 53 74 72 6c 65 6e 33 30 28 28 63 68  ite3Strlen30((ch
14440 61 72 2a 29 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20  ar*)nullId.z);. 
14450 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
14460 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
14470 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a  (pParse, 0, 0);.
14480 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
14490 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
144a0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 73  ate_index;.    s
144b0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
144c0 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4c  tName(pParse, pL
144d0 69 73 74 2c 20 26 6e 75 6c 6c 49 64 2c 20 30 29  ist, &nullId, 0)
144e0 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30  ;.    pList->a[0
144f0 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  ].sortOrder = (u
14500 38 29 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  8)sortOrder;.  }
14510 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
14520 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73  t how many bytes
14530 20 6f 66 20 73 70 61 63 65 20 61 72 65 20 72 65   of space are re
14540 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20  quired to store 
14550 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20  explicitly.  ** 
14560 73 70 65 63 69 66 69 65 64 20 63 6f 6c 6c 61 74  specified collat
14570 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
14580 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  es..  */.  for(i
14590 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
145a0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
145b0 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73  pr *pExpr = pLis
145c0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
145d0 20 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a     if( pExpr ){.
145e0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
145f0 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43  Coll = pExpr->pC
14600 6f 6c 6c 3b 0a 20 20 20 20 20 20 2f 2a 20 45 69  oll;.      /* Ei
14610 74 68 65 72 20 70 43 6f 6c 6c 21 3d 30 20 6f 72  ther pColl!=0 or
14620 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 4f 4f   there was an OO
14630 4d 20 66 61 69 6c 75 72 65 2e 20 20 42 75 74 20  M failure.  But 
14640 69 66 20 61 6e 20 4f 4f 4d 0a 20 20 20 20 20 20  if an OOM.      
14650 2a 2a 20 66 61 69 6c 75 72 65 20 77 65 20 68 61  ** failure we ha
14660 76 65 20 71 75 69 74 20 62 65 66 6f 72 65 20 72  ve quit before r
14670 65 61 63 68 69 6e 67 20 74 68 69 73 20 70 6f 69  eaching this poi
14680 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  nt. */.      if(
14690 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 29   ALWAYS(pColl) )
146a0 7b 0a 20 20 20 20 20 20 20 20 6e 45 78 74 72 61  {.        nExtra
146b0 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74 65 33   += (1 + sqlite3
146c0 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d 3e  Strlen30(pColl->
146d0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d  zName));.      }
146e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
146f0 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20   .  ** Allocate 
14700 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74  the index struct
14710 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61  ure. .  */.  nNa
14720 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
14730 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e  en30(zName);.  n
14740 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  Col = pList->nEx
14750 70 72 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73  pr;.  pIndex = s
14760 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
14770 72 6f 28 64 62 2c 20 0a 20 20 20 20 20 20 73 69  ro(db, .      si
14780 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 20 20  zeof(Index) +   
14790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
147a0 64 65 78 20 73 74 72 75 63 74 75 72 65 20 20 2a  dex structure  *
147b0 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69  /.      sizeof(i
147c0 6e 74 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20  nt)*nCol +      
147d0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69       /* Index.ai
147e0 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20  Column   */.    
147f0 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e    sizeof(int)*(n
14800 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20 20 20 2f  Col+1) +       /
14810 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74  * Index.aiRowEst
14820 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65     */.      size
14830 6f 66 28 63 68 61 72 20 2a 29 2a 6e 43 6f 6c 20  of(char *)*nCol 
14840 2b 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65  +        /* Inde
14850 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a  x.azColl     */.
14860 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29        sizeof(u8)
14870 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20  *nCol +         
14880 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72     /* Index.aSor
14890 74 4f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20  tOrder */.      
148a0 6e 4e 61 6d 65 20 2b 20 31 20 2b 20 20 20 20 20  nName + 1 +     
148b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
148c0 49 6e 64 65 78 2e 7a 4e 61 6d 65 20 20 20 20 20  Index.zName     
148d0 20 2a 2f 0a 20 20 20 20 20 20 6e 45 78 74 72 61   */.      nExtra
148e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148f0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
14900 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
14910 65 73 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28  es */.  );.  if(
14920 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
14930 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d ){.    goto ex
14940 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
14950 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 2d 3e 61  .  }.  pIndex->a
14960 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29  zColl = (char**)
14970 28 26 70 49 6e 64 65 78 5b 31 5d 29 3b 0a 20 20  (&pIndex[1]);.  
14980 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
14990 20 3d 20 28 69 6e 74 20 2a 29 28 26 70 49 6e 64   = (int *)(&pInd
149a0 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 5d  ex->azColl[nCol]
149b0 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 52  );.  pIndex->aiR
149c0 6f 77 45 73 74 20 3d 20 28 75 6e 73 69 67 6e 65  owEst = (unsigne
149d0 64 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 69  d *)(&pIndex->ai
149e0 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 5d 29 3b 0a 20  Column[nCol]);. 
149f0 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72   pIndex->aSortOr
14a00 64 65 72 20 3d 20 28 75 38 20 2a 29 28 26 70 49  der = (u8 *)(&pI
14a10 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 5b 6e  ndex->aiRowEst[n
14a20 43 6f 6c 2b 31 5d 29 3b 0a 20 20 70 49 6e 64 65  Col+1]);.  pInde
14a30 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  x->zName = (char
14a40 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 53 6f   *)(&pIndex->aSo
14a50 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 29 3b 0a  rtOrder[nCol]);.
14a60 20 20 7a 45 78 74 72 61 20 3d 20 28 63 68 61 72    zExtra = (char
14a70 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 7a 4e 61   *)(&pIndex->zNa
14a80 6d 65 5b 6e 4e 61 6d 65 2b 31 5d 29 3b 0a 20 20  me[nName+1]);.  
14a90 6d 65 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a  memcpy(pIndex->z
14aa0 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Name, zName, nNa
14ab0 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78 2d  me+1);.  pIndex-
14ac0 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a  >pTable = pTab;.
14ad0 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d    pIndex->nColum
14ae0 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  n = pList->nExpr
14af0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ;.  pIndex->onEr
14b00 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f  ror = (u8)onErro
14b10 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74  r;.  pIndex->aut
14b20 6f 49 6e 64 65 78 20 3d 20 28 75 38 29 28 70 4e  oIndex = (u8)(pN
14b30 61 6d 65 3d 3d 30 29 3b 0a 20 20 70 49 6e 64 65  ame==0);.  pInde
14b40 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  x->pSchema = db-
14b50 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
14b60 61 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  a;..  /* Check t
14b70 6f 20 73 65 65 20 69 66 20 77 65 20 73 68 6f 75  o see if we shou
14b80 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65  ld honor DESC re
14b90 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20  quests on index 
14ba0 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69  columns.  */.  i
14bb0 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  f( pDb->pSchema-
14bc0 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20  >file_format>=4 
14bd0 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72  ){.    sortOrder
14be0 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20  Mask = -1;   /* 
14bf0 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20  Honor DESC */.  
14c00 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f  }else{.    sortO
14c10 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20  rderMask = 0;   
14c20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20   /* Ignore DESC 
14c30 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61  */.  }..  /* Sca
14c40 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  n the names of t
14c50 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
14c60 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
14c70 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c  dexed and.  ** l
14c80 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  oad the column i
14c90 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20  ndices into the 
14ca0 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  Index structure.
14cb0 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f    Report an erro
14cc0 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f  r.  ** if any co
14cd0 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e  lumn is not foun
14ce0 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44  d..  **.  ** TOD
14cf0 4f 3a 20 20 41 64 64 20 61 20 74 65 73 74 20 74  O:  Add a test t
14d00 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
14d10 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e   the same column
14d20 20 69 73 20 6e 6f 74 20 6e 61 6d 65 64 0a 20 20   is not named.  
14d30 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63  ** more than onc
14d40 65 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  e within the sam
14d50 65 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74  e index.  Only t
14d60 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63  he first instanc
14d70 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f  e of.  ** the co
14d80 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65 72 20 62  lumn will ever b
14d90 65 20 75 73 65 64 20 62 79 20 74 68 65 20 6f 70  e used by the op
14da0 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74 65 20 74  timizer.  Note t
14db0 68 61 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20  hat using the.  
14dc0 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 6d  ** same column m
14dd0 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 63 61  ore than once ca
14de0 6e 6e 6f 74 20 62 65 20 61 6e 20 65 72 72 6f 72  nnot be an error
14df0 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
14e00 75 6c 64 20 0a 20 20 2a 2a 20 62 72 65 61 6b 20  uld .  ** break 
14e10 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
14e20 69 62 69 6c 69 74 79 20 2d 20 69 74 20 6e 65 65  ibility - it nee
14e30 64 73 20 74 6f 20 62 65 20 61 20 77 61 72 6e 69  ds to be a warni
14e40 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ng..  */.  for(i
14e50 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c  =0, pListItem=pL
14e60 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d  ist->a; i<pList-
14e70 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69  >nExpr; i++, pLi
14e80 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 63  stItem++){.    c
14e90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 4e  onst char *zColN
14ea0 61 6d 65 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d  ame = pListItem-
14eb0 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c 75  >zName;.    Colu
14ec0 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 20  mn *pTabCol;.   
14ed0 20 69 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f   int requestedSo
14ee0 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 63 68 61  rtOrder;.    cha
14ef0 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20  r *zColl;       
14f00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
14f10 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
14f20 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 66  e name */..    f
14f30 6f 72 28 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d  or(j=0, pTabCol=
14f40 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54  pTab->aCol; j<pT
14f50 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70  ab->nCol; j++, p
14f60 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  TabCol++){.     
14f70 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
14f80 43 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54  Cmp(zColName, pT
14f90 61 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30  abCol->zName)==0
14fa0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
14fb0 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d      if( j>=pTab-
14fc0 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  >nCol ){.      s
14fd0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
14fe0 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
14ff0 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e   has no column n
15000 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20  amed %s",.      
15010 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a    pTab->zName, z
15020 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ColName);.      
15030 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
15040 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 67  ema = 1;.      g
15050 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
15060 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
15070 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
15080 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 2f 2a  n[i] = j;.    /*
15090 20 4a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 6f   Justification o
150a0 66 20 74 68 65 20 41 4c 57 41 59 53 28 70 4c 69  f the ALWAYS(pLi
150b0 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70  stItem->pExpr->p
150c0 43 6f 6c 6c 29 3a 20 20 42 65 63 61 75 73 65 20  Coll):  Because 
150d0 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 77 61  of.    ** the wa
150e0 79 20 74 68 65 20 22 69 64 78 6c 69 73 74 22 20  y the "idxlist" 
150f0 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 69 73 20  non-terminal is 
15100 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74  constructed by t
15110 68 65 20 70 61 72 73 65 72 2c 0a 20 20 20 20 2a  he parser,.    *
15120 2a 20 69 66 20 70 4c 69 73 74 49 74 65 6d 2d 3e  * if pListItem->
15130 70 45 78 70 72 20 69 73 20 6e 6f 74 20 6e 75 6c  pExpr is not nul
15140 6c 20 74 68 65 6e 20 65 69 74 68 65 72 20 70 4c  l then either pL
15150 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  istItem->pExpr->
15160 70 43 6f 6c 6c 0a 20 20 20 20 2a 2a 20 6d 75 73  pColl.    ** mus
15170 74 20 65 78 69 73 74 20 6f 72 20 65 6c 73 65 20  t exist or else 
15180 74 68 65 72 65 20 6d 75 73 74 20 68 61 76 65 20  there must have 
15190 62 65 65 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  been an OOM erro
151a0 72 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65  r.  But if there
151b0 0a 20 20 20 20 2a 2a 20 77 61 73 20 61 6e 20 4f  .    ** was an O
151c0 4f 4d 20 65 72 72 6f 72 2c 20 77 65 20 77 6f 75  OM error, we wou
151d0 6c 64 20 6e 65 76 65 72 20 72 65 61 63 68 20 74  ld never reach t
151e0 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20  his point. */.  
151f0 20 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d    if( pListItem-
15200 3e 70 45 78 70 72 20 26 26 20 41 4c 57 41 59 53  >pExpr && ALWAYS
15210 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70  (pListItem->pExp
15220 72 2d 3e 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  r->pColl) ){.   
15230 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20     int nColl;.  
15240 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73      zColl = pLis
15250 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43  tItem->pExpr->pC
15260 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  oll->zName;.    
15270 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    nColl = sqlite
15280 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29  3Strlen30(zColl)
15290 20 2b 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65   + 1;.      asse
152a0 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c  rt( nExtra>=nCol
152b0 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  l );.      memcp
152c0 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c  y(zExtra, zColl,
152d0 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7a   nColl);.      z
152e0 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20  Coll = zExtra;. 
152f0 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e       zExtra += n
15300 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78 74  Coll;.      nExt
15310 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20  ra -= nColl;.   
15320 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43   }else{.      zC
15330 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  oll = pTab->aCol
15340 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [j].zColl;.     
15350 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 7b 0a 20   if( !zColl ){. 
15360 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 64         zColl = d
15370 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 2d 3e 7a 4e  b->pDfltColl->zN
15380 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
15390 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e   }.    if( !db->
153a0 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21 73 71  init.busy && !sq
153b0 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
153c0 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c  eq(pParse, zColl
153d0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
153e0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
153f0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  x;.    }.    pIn
15400 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d  dex->azColl[i] =
15410 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75   zColl;.    requ
15420 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 20 3d  estedSortOrder =
15430 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74   pListItem->sort
15440 4f 72 64 65 72 20 26 20 73 6f 72 74 4f 72 64 65  Order & sortOrde
15450 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65  rMask;.    pInde
15460 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
15470 20 3d 20 28 75 38 29 72 65 71 75 65 73 74 65 64   = (u8)requested
15480 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 20  SortOrder;.  }. 
15490 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52   sqlite3DefaultR
154a0 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 0a  owEst(pIndex);..
154b0 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72    if( pTab==pPar
154c0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b  se->pNewTable ){
154d0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  .    /* This rou
154e0 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61  tine has been ca
154f0 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
15500 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
15510 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65  x as a.    ** re
15520 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52  sult of a PRIMAR
15530 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
15540 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75  clause on a colu
15550 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f  mn definition, o
15560 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41  r.    ** a PRIMA
15570 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
15580 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e   clause followin
15590 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66  g the column def
155a0 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  initions..    **
155b0 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20   i.e. one of:.  
155c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41    **.    ** CREA
155d0 54 45 20 54 41 42 4c 45 20 74 28 78 20 50 52 49  TE TABLE t(x PRI
155e0 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20  MARY KEY, y);.  
155f0 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
15600 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45  E t(x, y, UNIQUE
15610 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a  (x, y));.    **.
15620 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61      ** Either wa
15630 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  y, check to see 
15640 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72  if the table alr
15650 65 61 64 79 20 68 61 73 20 73 75 63 68 20 61 6e  eady has such an
15660 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a   index. If.    *
15670 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68  * so, don't both
15680 65 72 20 63 72 65 61 74 69 6e 67 20 74 68 69 73  er creating this
15690 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20   one. This only 
156a0 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a  applies to.    *
156b0 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
156c0 63 72 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e  created indices.
156d0 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73   Users can do as
156e0 20 74 68 65 79 20 77 69 73 68 20 77 69 74 68 0a   they wish with.
156f0 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20      ** explicit 
15700 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a  indices..    **.
15710 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55      ** Two UNIQU
15720 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59  E or PRIMARY KEY
15730 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
15740 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 69   considered equi
15750 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61  valent.    ** (a
15760 6e 64 20 74 68 75 73 20 73 75 70 70 72 65 73 73  nd thus suppress
15770 69 6e 67 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  ing the second o
15780 6e 65 29 20 65 76 65 6e 20 69 66 20 74 68 65 79  ne) even if they
15790 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a   have different.
157a0 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65      ** sort orde
157b0 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rs..    **.    *
157c0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
157d0 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69  ifferent collati
157e0 6e 67 20 73 65 71 75 65 6e 63 65 73 20 6f 72 20  ng sequences or 
157f0 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  if the columns o
15800 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e  f.    ** the con
15810 73 74 72 61 69 6e 74 20 6f 63 63 75 72 20 69 6e  straint occur in
15820 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72   different order
15830 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73  s, then the cons
15840 74 72 61 69 6e 74 73 20 61 72 65 0a 20 20 20 20  traints are.    
15850 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69  ** considered di
15860 73 74 69 6e 63 74 20 61 6e 64 20 62 6f 74 68 20  stinct and both 
15870 72 65 73 75 6c 74 20 69 6e 20 73 65 70 61 72 61  result in separa
15880 74 65 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  te indices..    
15890 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
158a0 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  dx;.    for(pIdx
158b0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
158c0 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
158d0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
158e0 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t k;.      asser
158f0 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  t( pIdx->onError
15900 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20  !=OE_None );.   
15910 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
15920 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20 20  >autoIndex );.  
15930 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
15940 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  ex->onError!=OE_
15950 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20 69  None );..      i
15960 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  f( pIdx->nColumn
15970 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  !=pIndex->nColum
15980 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
15990 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
159a0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b  Idx->nColumn; k+
159b0 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
159c0 74 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20  t char *z1;.    
159d0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
159e0 7a 32 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z2;.        if( 
159f0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  pIdx->aiColumn[k
15a00 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  ]!=pIndex->aiCol
15a10 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a  umn[k] ) break;.
15a20 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 49 64          z1 = pId
15a30 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
15a40 20 20 20 20 20 20 7a 32 20 3d 20 70 49 6e 64 65        z2 = pInde
15a50 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
15a60 20 20 20 20 20 20 69 66 28 20 7a 31 21 3d 7a 32        if( z1!=z2
15a70 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
15a80 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65  mp(z1, z2) ) bre
15a90 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
15aa0 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e    if( k==pIdx->n
15ab0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
15ac0 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
15ad0 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45  ror!=pIndex->onE
15ae0 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rror ){.        
15af0 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72    /* This constr
15b00 61 69 6e 74 20 63 72 65 61 74 65 73 20 74 68 65  aint creates the
15b10 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61   same index as a
15b20 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
15b30 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
15b40 74 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65  t specified some
15b50 77 68 65 72 65 20 69 6e 20 74 68 65 20 43 52 45  where in the CRE
15b60 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
15b70 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ent..          *
15b80 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e  * However the ON
15b90 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
15ba0 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e  s are different.
15bb0 20 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20   If both this . 
15bc0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
15bd0 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70  traint and the p
15be0 72 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65  revious equivale
15bf0 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  nt constraint ha
15c00 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20  ve explicit.    
15c10 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46        ** ON CONF
15c20 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74 68 69  LICT clauses thi
15c30 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f  s is an error. O
15c40 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68  therwise, use th
15c50 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  e.          ** e
15c60 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
15c70 69 65 64 20 62 65 68 61 76 69 6f 75 72 20 66 6f  ied behaviour fo
15c80 72 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  r the index..   
15c90 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
15ca0 20 20 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e      if( !(pIdx->
15cb0 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
15cc0 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f  ult || pIndex->o
15cd0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
15ce0 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lt) ){.         
15cf0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15d00 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
15d10 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e              "con
15d20 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46  flicting ON CONF
15d30 4c 49 43 54 20 63 6c 61 75 73 65 73 20 73 70 65  LICT clauses spe
15d40 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20  cified", 0);.   
15d50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15d60 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45     if( pIdx->onE
15d70 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
15d80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15d90 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20  pIdx->onError = 
15da0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b  pIndex->onError;
15db0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15dc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
15dd0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
15de0 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
15df0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c     }.  }..  /* L
15e00 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65  ink the new Inde
15e10 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  x structure to i
15e20 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20  ts table and to 
15e30 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69  the other.  ** i
15e40 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
15e50 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20  e structures. . 
15e60 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
15e70 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49  it.busy ){.    I
15e80 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d  ndex *p;.    p =
15e90 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
15ea0 72 74 28 26 70 49 6e 64 65 78 2d 3e 70 53 63 68  rt(&pIndex->pSch
15eb0 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20  ema->idxHash, . 
15ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ed0 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d           pIndex-
15ee0 3e 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53  >zName, sqlite3S
15ef0 74 72 6c 65 6e 33 30 28 70 49 6e 64 65 78 2d 3e  trlen30(pIndex->
15f00 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  zName),.        
15f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f20 20 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69    pIndex);.    i
15f30 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73  f( p ){.      as
15f40 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20  sert( p==pIndex 
15f50 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75  );  /* Malloc mu
15f60 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a  st have failed *
15f70 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c  /.      db->mall
15f80 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
15f90 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
15fa0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
15fb0 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  }.    db->flags 
15fc0 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
15fd0 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69 66 28  Changes;.    if(
15fe0 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
15ff0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e        pIndex->tn
16000 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
16010 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d  wTnum;.    }.  }
16020 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  ..  /* If the db
16030 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30  ->init.busy is 0
16040 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68 65   then create the
16050 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20   index on disk. 
16060 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c   This.  ** invol
16070 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65 20  ves writing the 
16080 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d  index into the m
16090 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
160a0 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20  filling in the. 
160b0 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74   ** index with t
160c0 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
160d0 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a   contents..  **.
160e0 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69    ** The db->ini
160f0 74 2e 62 75 73 79 20 69 73 20 30 20 77 68 65 6e  t.busy is 0 when
16100 20 74 68 65 20 75 73 65 72 20 66 69 72 73 74 20   the user first 
16110 65 6e 74 65 72 73 20 61 20 43 52 45 41 54 45 20  enters a CREATE 
16120 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d  INDEX .  ** comm
16130 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62  and.  db->init.b
16140 75 73 79 20 69 73 20 31 20 77 68 65 6e 20 61 20  usy is 1 when a 
16150 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
16160 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45  ed and .  ** CRE
16170 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
16180 65 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f 75  ents are read ou
16190 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  t of the master 
161a0 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20  table.  In.  ** 
161b0 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 20  the latter case 
161c0 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64  the index alread
161d0 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b  y exists on disk
161e0 2c 20 77 68 69 63 68 20 69 73 20 77 68 79 0a 20  , which is why. 
161f0 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e   ** we don't wan
16200 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 69 74  t to recreate it
16210 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
16220 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  TblName==0 it me
16230 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69  ans this index i
16240 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61  s generated as a
16250 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a   primary key.  *
16260 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  * or UNIQUE cons
16270 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52 45 41  traint of a CREA
16280 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
16290 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74  nt.  Since the t
162a0 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75  able.  ** has ju
162b0 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c  st been created,
162c0 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   it contains no 
162d0 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64  data and the ind
162e0 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ex initializatio
162f0 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20  n.  ** step can 
16300 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  be skipped..  */
16310 0a 20 20 65 6c 73 65 7b 20 2f 2a 20 69 66 28 20  .  else{ /* if( 
16320 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
16330 20 29 20 2a 2f 0a 20 20 20 20 56 64 62 65 20 2a   ) */.    Vdbe *
16340 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  v;.    char *zSt
16350 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d  mt;.    int iMem
16360 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
16370 6d 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  m;..    v = sqli
16380 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
16390 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
163a0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
163b0 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 0a 20 20 20  ate_index;...   
163c0 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 72   /* Create the r
163d0 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65 20  ootpage for the 
163e0 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20  index.    */.   
163f0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
16400 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
16410 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20  se, 1, iDb);.   
16420 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16430 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49  p2(v, OP_CreateI
16440 6e 64 65 78 2c 20 69 44 62 2c 20 69 4d 65 6d 29  ndex, iDb, iMem)
16450 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72  ;..    /* Gather
16460 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   the complete te
16470 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
16480 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
16490 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65   into.    ** the
164a0 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a   zStmt variable.
164b0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
164c0 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 61  Start ){.      a
164d0 73 73 65 72 74 28 20 70 45 6e 64 21 3d 30 20 29  ssert( pEnd!=0 )
164e0 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d  ;.      /* A nam
164f0 65 64 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e  ed index with an
16500 20 65 78 70 6c 69 63 69 74 20 43 52 45 41 54 45   explicit CREATE
16510 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
16520 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   */.      zStmt 
16530 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
16540 28 64 62 2c 20 22 43 52 45 41 54 45 25 73 20 49  (db, "CREATE%s I
16550 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20  NDEX %.*s",.    
16560 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f      onError==OE_
16570 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e  None ? "" : " UN
16580 49 51 55 45 22 2c 0a 20 20 20 20 20 20 20 20 70  IQUE",.        p
16590 45 6e 64 2d 3e 7a 20 2d 20 70 4e 61 6d 65 2d 3e  End->z - pName->
165a0 7a 20 2b 20 31 2c 0a 20 20 20 20 20 20 20 20 70  z + 1,.        p
165b0 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65  Name->z);.    }e
165c0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  lse{.      /* An
165d0 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
165e0 20 63 72 65 61 74 65 64 20 62 79 20 61 20 50 52   created by a PR
165f0 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
16600 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  QUE constraint *
16610 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74  /.      /* zStmt
16620 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
16630 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20  f(""); */.      
16640 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d  zStmt = 0;.    }
16650 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20  ..    /* Add an 
16660 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f  entry in sqlite_
16670 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20  master for this 
16680 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20  index.    */.   
16690 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
166a0 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
166b0 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
166c0 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27  O %Q.%s VALUES('
166d0 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 25 64  index',%Q,%Q,#%d
166e0 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20  ,%Q);",.        
166f0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
16700 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
16710 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70  (iDb),.        p
16720 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20  Index->zName,.  
16730 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
16740 65 2c 0a 20 20 20 20 20 20 20 20 69 4d 65 6d 2c  e,.        iMem,
16750 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20  .        zStmt. 
16760 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
16770 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d  3DbFree(db, zStm
16780 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c  t);..    /* Fill
16790 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20   the index with 
167a0 64 61 74 61 20 61 6e 64 20 72 65 70 61 72 73 65  data and reparse
167b0 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64   the schema. Cod
167c0 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20  e an OP_Expire. 
167d0 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64     ** to invalid
167e0 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70  ate all pre-comp
167f0 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e  iled statements.
16800 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
16810 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  pTblName ){.    
16820 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
16830 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
16840 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  dex, iMem);.    
16850 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
16860 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
16870 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
16880 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
16890 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69  P_ParseSchema, i
168a0 44 62 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  Db, 0, 0,.      
168b0 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
168c0 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27  f(db, "name='%q'
168d0 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78   AND type='index
168e0 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  '", pIndex->zNam
168f0 65 29 2c 20 0a 20 20 20 20 20 20 20 20 20 50 34  e), .         P4
16900 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
16910 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16920 70 31 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c  p1(v, OP_Expire,
16930 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   0);.    }.  }..
16940 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67    /* When adding
16950 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65   an index to the
16960 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73   list of indices
16970 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61   for a table, ma
16980 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c  ke.  ** sure all
16990 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64   indices labeled
169a0 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65   OE_Replace come
169b0 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65   after all those
169c0 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45   labeled.  ** OE
169d0 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69  _Ignore.  This i
169e0 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20  s necessary for 
169f0 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f 6e 73  the correct cons
16a00 74 72 61 69 6e 74 20 63 68 65 63 6b 0a 20 20 2a  traint check.  *
16a10 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 28 69 6e  * processing (in
16a20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
16a30 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73  ConstraintChecks
16a40 28 29 29 20 61 73 20 70 61 72 74 20 6f 66 0a 20  ()) as part of. 
16a50 20 2a 2a 20 55 50 44 41 54 45 20 61 6e 64 20 49   ** UPDATE and I
16a60 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 73  NSERT statements
16a70 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  .  .  */.  if( d
16a80 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
16a90 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  pTblName==0 ){. 
16aa0 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d     if( onError!=
16ab0 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54  OE_Replace || pT
16ac0 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20  ab->pIndex==0.  
16ad0 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e         || pTab->
16ae0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d  pIndex->onError=
16af0 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20  =OE_Replace){.  
16b00 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78      pIndex->pNex
16b10 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  t = pTab->pIndex
16b20 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49  ;.      pTab->pI
16b30 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20  ndex = pIndex;. 
16b40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16b50 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20  Index *pOther = 
16b60 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
16b70 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65      while( pOthe
16b80 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68  r->pNext && pOth
16b90 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72  er->pNext->onErr
16ba0 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29  or!=OE_Replace )
16bb0 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65 72  {.        pOther
16bc0 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74   = pOther->pNext
16bd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16be0 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
16bf0 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pOther->pNext;. 
16c00 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65       pOther->pNe
16c10 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  xt = pIndex;.   
16c20 20 7d 0a 20 20 20 20 70 52 65 74 20 3d 20 70 49   }.    pRet = pI
16c30 6e 64 65 78 3b 0a 20 20 20 20 70 49 6e 64 65 78  ndex;.    pIndex
16c40 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
16c50 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20  Clean up before 
16c60 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f  exiting */.exit_
16c70 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20  create_index:.  
16c80 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20  if( pIndex ){.  
16c90 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
16ca0 64 62 2c 20 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c  db, pIndex->zCol
16cb0 41 66 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Aff);.    sqlite
16cc0 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 6e 64  3DbFree(db, pInd
16cd0 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ex);.  }.  sqlit
16ce0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
16cf0 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73  (db, pList);.  s
16d00 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
16d10 65 74 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65  ete(db, pTblName
16d20 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
16d30 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ee(db, zName);. 
16d40 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
16d50 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20  ./*.** Fill the 
16d60 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d  Index.aiRowEst[]
16d70 20 61 72 72 61 79 20 77 69 74 68 20 64 65 66 61   array with defa
16d80 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ult information 
16d90 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  - information.**
16da0 20 74 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e   to be used when
16db0 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e   we have not run
16dc0 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d   the ANALYZE com
16dd0 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f  mand..**.** aiRo
16de0 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f  wEst[0] is suppo
16df0 73 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  se to contain th
16e00 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
16e10 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65  ents in the inde
16e20 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64  x..** Since we d
16e30 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73  o not know, gues
16e40 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69  s 1 million.  ai
16e50 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20  RowEst[1] is an 
16e60 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a  estimate of the.
16e70 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
16e80 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74  s in the table t
16e90 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61  hat match any pa
16ea0 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f  rticular value o
16eb0 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63  f the.** first c
16ec0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
16ed0 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d  ex.  aiRowEst[2]
16ee0 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
16ef0 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  of the number.**
16f00 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61   of rows that ma
16f10 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c  tch any particul
16f20 61 72 20 63 6f 6d 62 69 6e 69 61 74 69 6f 6e 20  ar combiniation 
16f30 6f 66 20 74 68 65 20 66 69 72 73 74 20 32 20 63  of the first 2 c
16f40 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65  olumns.** of the
16f50 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20   index.  And so 
16f60 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20  forth.  It must 
16f70 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 63 61  always be the ca
16f80 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20  se that.*.**    
16f90 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b         aiRowEst[
16fa0 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31  N]<=aiRowEst[N-1
16fb0 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  ].**           a
16fc0 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a  iRowEst[N]>=1.**
16fd0 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74  .** Apart from t
16fe0 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74  hat, we have lit
16ff0 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73  tle to go on bes
17000 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61  ides intuition a
17010 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f  s to.** how aiRo
17020 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65  wEst[] should be
17030 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54   initialized.  T
17040 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72  he numbers gener
17050 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65  ated here.** are
17060 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61   based on typica
17070 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69  l values found i
17080 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73  n actual indices
17090 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
170a0 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49  3DefaultRowEst(I
170b0 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75  ndex *pIdx){.  u
170c0 6e 73 69 67 6e 65 64 20 2a 61 20 3d 20 70 49 64  nsigned *a = pId
170d0 78 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20 20 69  x->aiRowEst;.  i
170e0 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64  nt i;.  unsigned
170f0 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 61 21   n;.  assert( a!
17100 3d 30 20 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 70  =0 );.  a[0] = p
17110 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f  Idx->pTable->nRo
17120 77 45 73 74 3b 0a 20 20 69 66 28 20 61 5b 30 5d  wEst;.  if( a[0]
17130 3c 31 30 20 29 20 61 5b 30 5d 20 3d 20 31 30 3b  <10 ) a[0] = 10;
17140 0a 20 20 6e 20 3d 20 31 30 3b 0a 20 20 66 6f 72  .  n = 10;.  for
17150 28 69 3d 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e  (i=1; i<=pIdx->n
17160 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
17170 20 20 61 5b 69 5d 20 3d 20 6e 3b 0a 20 20 20 20    a[i] = n;.    
17180 69 66 28 20 6e 3e 35 20 29 20 6e 2d 2d 3b 0a 20  if( n>5 ) n--;. 
17190 20 7d 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6f   }.  if( pIdx->o
171a0 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
171b0 29 7b 0a 20 20 20 20 61 5b 70 49 64 78 2d 3e 6e  ){.    a[pIdx->n
171c0 43 6f 6c 75 6d 6e 5d 20 3d 20 31 3b 0a 20 20 7d  Column] = 1;.  }
171d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
171e0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70  outine will drop
171f0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d   an existing nam
17200 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20  ed index.  This 
17210 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65  routine.** imple
17220 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49  ments the DROP I
17230 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a  NDEX statement..
17240 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
17250 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a  ropIndex(Parse *
17260 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
17270 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45 78  *pName, int ifEx
17280 69 73 74 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a  ists){.  Index *
17290 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a  pIndex;.  Vdbe *
172a0 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
172b0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
172c0 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73 73   int iDb;..  ass
172d0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
172e0 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 4e 65 76  r==0 );   /* Nev
172f0 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70  er called with p
17300 72 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20  rior errors */. 
17310 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
17320 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
17330 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
17340 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  x;.  }.  assert(
17350 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20   pName->nSrc==1 
17360 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
17370 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
17380 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
17390 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
173a0 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
173b0 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
173c0 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70  3FindIndex(db, p
173d0 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  Name->a[0].zName
173e0 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  , pName->a[0].zD
173f0 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20  atabase);.  if( 
17400 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20  pIndex==0 ){.   
17410 20 69 66 28 20 21 69 66 45 78 69 73 74 73 20 29   if( !ifExists )
17420 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
17430 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
17440 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  "no such index: 
17450 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a  %S", pName, 0);.
17460 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
17470 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
17480 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  1;.    goto exit
17490 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
174a0 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61  .  if( pIndex->a
174b0 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  utoIndex ){.    
174c0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
174d0 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61  pParse, "index a
174e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55  ssociated with U
174f0 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f  NIQUE ".      "o
17500 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
17510 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20  nstraint cannot 
17520 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b  be dropped", 0);
17530 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
17540 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
17550 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
17560 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
17570 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29  pIndex->pSchema)
17580 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
17590 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
175a0 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ION.  {.    int 
175b0 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
175c0 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61  OP_INDEX;.    Ta
175d0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64  ble *pTab = pInd
175e0 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20  ex->pTable;.    
175f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
17600 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
17610 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Name;.    const 
17620 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48  char *zTab = SCH
17630 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a  EMA_TABLE(iDb);.
17640 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
17650 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
17660 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
17670 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b  zTab, 0, zDb) ){
17680 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
17690 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20  _drop_index;.   
176a0 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54   }.    if( !OMIT
176b0 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 20 29  _TEMPDB && iDb )
176c0 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
176d0 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a  ROP_TEMP_INDEX;.
176e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
176f0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
17700 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a   code, pIndex->z
17710 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
17720 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  e, zDb) ){.     
17730 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
17740 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
17750 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
17760 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
17770 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20  emove the index 
17780 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  and from the mas
17790 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76  ter table */.  v
177a0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
177b0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
177c0 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
177d0 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
177e0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
177f0 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
17800 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
17810 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c  rse,.       "DEL
17820 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57  ETE FROM %Q.%s W
17830 48 45 52 45 20 6e 61 6d 65 3d 25 51 20 41 4e 44  HERE name=%Q AND
17840 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 0a   type='index'",.
17850 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
17860 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
17870 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20  A_TABLE(iDb),.  
17880 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
17890 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  me.    );.    if
178a0 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  ( sqlite3FindTab
178b0 6c 65 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73  le(db, "sqlite_s
178c0 74 61 74 31 22 2c 20 64 62 2d 3e 61 44 62 5b 69  tat1", db->aDb[i
178d0 44 62 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  Db].zName) ){.  
178e0 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
178f0 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
17900 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
17910 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74  ROM %Q.sqlite_st
17920 61 74 31 20 57 48 45 52 45 20 69 64 78 3d 25 51  at1 WHERE idx=%Q
17930 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61  ",.        db->a
17940 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 70  Db[iDb].zName, p
17950 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20  Index->zName.   
17960 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
17970 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
17980 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
17990 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  ;.    destroyRoo
179a0 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49  tPage(pParse, pI
179b0 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  ndex->tnum, iDb)
179c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
179d0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72  eAddOp4(v, OP_Dr
179e0 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c  opIndex, iDb, 0,
179f0 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d   0, pIndex->zNam
17a00 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74  e, 0);.  }..exit
17a10 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73  _drop_index:.  s
17a20 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
17a30 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ete(db, pName);.
17a40 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20  }../*.** pArray 
17a50 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
17a60 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65  an array of obje
17a70 63 74 73 2e 20 20 45 61 63 68 20 6f 62 6a 65 63  cts.  Each objec
17a80 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61  t in the.** arra
17a90 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74  y is szEntry byt
17aa0 65 73 20 69 6e 20 73 69 7a 65 2e 20 20 54 68 69  es in size.  Thi
17ab0 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61  s routine alloca
17ac0 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6f 62 6a  tes a new.** obj
17ad0 65 63 74 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f  ect on the end o
17ae0 66 20 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a 0a  f the array..**.
17af0 2a 2a 20 2a 70 6e 45 6e 74 72 79 20 69 73 20 74  ** *pnEntry is t
17b00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
17b10 72 69 65 73 20 61 6c 72 65 61 64 79 20 69 6e 20  ries already in 
17b20 75 73 65 2e 20 20 2a 70 6e 41 6c 6c 6f 63 20 69  use.  *pnAlloc i
17b30 73 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75  s.** the previou
17b40 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 69  sly allocated si
17b50 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e  ze of the array.
17b60 20 20 69 6e 69 74 53 69 7a 65 20 69 73 20 74 68    initSize is th
17b70 65 0a 2a 2a 20 73 75 67 67 65 73 74 65 64 20 69  e.** suggested i
17b80 6e 69 74 69 61 6c 20 61 72 72 61 79 20 73 69 7a  nitial array siz
17b90 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  e allocation..**
17ba0 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 6f 66  .** The index of
17bb0 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69   the new entry i
17bc0 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20 2a 70  s returned in *p
17bd0 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Idx..**.** This 
17be0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
17bf0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
17c00 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74   array of object
17c10 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 69 67 68  s.  This.** migh
17c20 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
17c30 20 74 68 65 20 70 41 72 72 61 79 20 70 61 72 61   the pArray para
17c40 6d 65 74 65 72 20 6f 72 20 69 74 20 6d 69 67 68  meter or it migh
17c50 74 20 62 65 20 61 20 64 69 66 66 65 72 65 6e 74  t be a different
17c60 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 66 20 74  .** pointer if t
17c70 68 65 20 61 72 72 61 79 20 77 61 73 20 72 65 73  he array was res
17c80 69 7a 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ized..*/.void *s
17c90 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
17ca0 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ate(.  sqlite3 *
17cb0 64 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  db,      /* Conn
17cc0 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79  ection to notify
17cd0 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   of malloc failu
17ce0 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  res */.  void *p
17cf0 41 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72  Array,     /* Ar
17d00 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20  ray of objects. 
17d10 20 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f   Might be reallo
17d20 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73  cated */.  int s
17d30 7a 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20  zEntry,      /* 
17d40 53 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a  Size of each obj
17d50 65 63 74 20 69 6e 20 74 68 65 20 61 72 72 61 79  ect in the array
17d60 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 69 74 53 69   */.  int initSi
17d70 7a 65 2c 20 20 20 20 20 2f 2a 20 53 75 67 67 65  ze,     /* Sugge
17d80 73 74 65 64 20 69 6e 69 74 69 61 6c 20 61 6c 6c  sted initial all
17d90 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d  ocation, in elem
17da0 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ents */.  int *p
17db0 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e  nEntry,     /* N
17dc0 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73  umber of objects
17dd0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
17de0 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 41 6c  e */.  int *pnAl
17df0 6c 6f 63 2c 20 20 20 20 20 2f 2a 20 43 75 72 72  loc,     /* Curr
17e00 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
17e10 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65  allocation, in e
17e20 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  lements */.  int
17e30 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f   *pIdx         /
17e40 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e 64 65  * Write the inde
17e50 78 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20  x of a new slot 
17e60 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  here */.){.  cha
17e70 72 20 2a 7a 3b 0a 20 20 69 66 28 20 2a 70 6e 45  r *z;.  if( *pnE
17e80 6e 74 72 79 20 3e 3d 20 2a 70 6e 41 6c 6c 6f 63  ntry >= *pnAlloc
17e90 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e   ){.    void *pN
17ea0 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 65 77 53  ew;.    int newS
17eb0 69 7a 65 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65  ize;.    newSize
17ec0 20 3d 20 28 2a 70 6e 41 6c 6c 6f 63 29 2a 32 20   = (*pnAlloc)*2 
17ed0 2b 20 69 6e 69 74 53 69 7a 65 3b 0a 20 20 20 20  + initSize;.    
17ee0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
17ef0 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72  Realloc(db, pArr
17f00 61 79 2c 20 6e 65 77 53 69 7a 65 2a 73 7a 45 6e  ay, newSize*szEn
17f10 74 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  try);.    if( pN
17f20 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  ew==0 ){.      *
17f30 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pIdx = -1;.     
17f40 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a   return pArray;.
17f50 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e 41 6c 6c      }.    *pnAll
17f60 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  oc = sqlite3DbMa
17f70 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e 65  llocSize(db, pNe
17f80 77 29 2f 73 7a 45 6e 74 72 79 3b 0a 20 20 20 20  w)/szEntry;.    
17f90 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20  pArray = pNew;. 
17fa0 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29   }.  z = (char*)
17fb0 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74  pArray;.  memset
17fc0 28 26 7a 5b 2a 70 6e 45 6e 74 72 79 20 2a 20 73  (&z[*pnEntry * s
17fd0 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e  zEntry], 0, szEn
17fe0 74 72 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  try);.  *pIdx = 
17ff0 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 2b 2b 2a 70  *pnEntry;.  ++*p
18000 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e  nEntry;.  return
18010 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a   pArray;.}../*.*
18020 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65  * Append a new e
18030 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69  lement to the gi
18040 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65  ven IdList.  Cre
18050 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74  ate a new IdList
18060 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a   if.** need be..
18070 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69  **.** A new IdLi
18080 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  st is returned, 
18090 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f  or NULL if mallo
180a0 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64  c() fails..*/.Id
180b0 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c  List *sqlite3IdL
180c0 69 73 74 41 70 70 65 6e 64 28 73 71 6c 69 74 65  istAppend(sqlite
180d0 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
180e0 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
180f0 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ken){.  int i;. 
18100 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
18110 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
18120 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
18130 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69  (db, sizeof(IdLi
18140 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
18150 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
18160 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   0;.    pList->n
18170 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  Alloc = 0;.  }. 
18180 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69   pList->a = sqli
18190 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
181a0 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20  (.      db,.    
181b0 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20    pList->a,.    
181c0 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e    sizeof(pList->
181d0 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 35 2c 0a  a[0]),.      5,.
181e0 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49        &pList->nI
181f0 64 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d  d,.      &pList-
18200 3e 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 26  >nAlloc,.      &
18210 69 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30  i.  );.  if( i<0
18220 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   ){.    sqlite3I
18230 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
18240 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75  pList);.    retu
18250 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
18260 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
18270 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
18280 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29  oken(db, pToken)
18290 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
182a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
182b0 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a  e an IdList..*/.
182c0 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69  void sqlite3IdLi
182d0 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  stDelete(sqlite3
182e0 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c   *db, IdList *pL
182f0 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
18300 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
18310 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
18320 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; i<pList->nId;
18330 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
18340 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69  e3DbFree(db, pLi
18350 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
18360 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
18370 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Free(db, pList->
18380 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  a);.  sqlite3DbF
18390 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ree(db, pList);.
183a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
183b0 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69  the index in pLi
183c0 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69  st of the identi
183d0 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20  fier named zId. 
183e0 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66   Return -1.** if
183f0 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69   not found..*/.i
18400 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  nt sqlite3IdList
18410 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c  Index(IdList *pL
18420 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ist, const char 
18430 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
18440 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
18450 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
18460 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
18470 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
18480 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
18490 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  Cmp(pList->a[i].
184a0 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30  zName, zName)==0
184b0 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d   ) return i;.  }
184c0 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
184d0 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68  ./*.** Expand th
184e0 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  e space allocate
184f0 64 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  d for the given 
18500 53 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62  SrcList object b
18510 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45  y.** creating nE
18520 78 74 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62  xtra new slots b
18530 65 67 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61  eginning at iSta
18540 72 74 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a  rt.  iStart is z
18550 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65  ero based..** Ne
18560 77 20 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f  w slots are zero
18570 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ed..**.** For ex
18580 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61  ample, suppose a
18590 20 53 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c   SrcList initial
185a0 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20  ly contains two 
185b0 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a  entries: A,B..**
185c0 20 54 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77   To append 3 new
185d0 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68   entries onto th
185e0 65 20 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a  e end, do this:.
185f0 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33  **.**    sqlite3
18600 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64  SrcListEnlarge(d
18610 62 2c 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20  b, pSrclist, 3, 
18620 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  2);.**.** After 
18630 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69  the call above i
18640 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a  t would contain:
18650 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c    A, B, nil, nil
18660 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65  , nil..** If the
18670 20 69 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74   iStart argument
18680 20 68 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74   had been 1 inst
18690 65 61 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74  ead of 2, then t
186a0 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75  he result.** wou
186b0 6c 64 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41  ld have been:  A
186c0 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c  , nil, nil, nil,
186d0 20 42 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20   B.  To prepend 
186e0 74 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a  the new slots,.*
186f0 2a 20 74 68 65 20 69 53 74 61 72 74 20 76 61 6c  * the iStart val
18700 75 65 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20  ue would be 0.  
18710 54 68 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20  The result then 
18720 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c  would.** be: nil
18730 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42  , nil, nil, A, B
18740 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
18750 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
18760 61 69 6c 73 20 74 68 65 20 53 72 63 4c 69 73 74  ails the SrcList
18770 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 20   is unchanged.  
18780 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f  The.** db->mallo
18790 63 46 61 69 6c 65 64 20 66 6c 61 67 20 77 69 6c  cFailed flag wil
187a0 6c 20 62 65 20 73 65 74 20 74 6f 20 74 72 75 65  l be set to true
187b0 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
187c0 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
187d0 72 67 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  rge(.  sqlite3 *
187e0 64 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74  db,       /* Dat
187f0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
18800 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f   to notify of OO
18810 4d 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72  M errors */.  Sr
18820 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
18830 20 2f 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20   /* The SrcList 
18840 74 6f 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a  to be enlarged *
18850 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
18860 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
18870 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f   of new slots to
18880 20 61 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b   add to pSrc->a[
18890 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72  ] */.  int iStar
188a0 74 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  t         /* Ind
188b0 65 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20  ex in pSrc->a[] 
188c0 6f 66 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f  of first new slo
188d0 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
188e0 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ..  /* Sanity ch
188f0 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e  ecking on callin
18900 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  g parameters */.
18910 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74    assert( iStart
18920 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
18930 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20   nExtra>=1 );.  
18940 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20  assert( pSrc!=0 
18950 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
18960 61 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20  art<=pSrc->nSrc 
18970 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
18980 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61  e additional spa
18990 63 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  ce if needed */.
189a0 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
189b0 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41  +nExtra>pSrc->nA
189c0 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c  lloc ){.    SrcL
189d0 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69  ist *pNew;.    i
189e0 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72 63  nt nAlloc = pSrc
189f0 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a 20  ->nSrc+nExtra;. 
18a00 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20 20     int nGot;.   
18a10 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
18a20 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72  bRealloc(db, pSr
18a30 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  c,.             
18a40 20 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 20    sizeof(*pSrc) 
18a50 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a  + (nAlloc-1)*siz
18a60 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20  eof(pSrc->a[0]) 
18a70 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
18a80 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
18a90 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
18aa0 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65  iled );.      re
18ab0 74 75 72 6e 20 70 53 72 63 3b 0a 20 20 20 20 7d  turn pSrc;.    }
18ac0 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77  .    pSrc = pNew
18ad0 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20 28 73 71  ;.    nGot = (sq
18ae0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
18af0 65 28 64 62 2c 20 70 4e 65 77 29 20 2d 20 73 69  e(db, pNew) - si
18b00 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f 73 69 7a  zeof(*pSrc))/siz
18b10 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2b  eof(pSrc->a[0])+
18b20 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c  1;.    pSrc->nAl
18b30 6c 6f 63 20 3d 20 28 75 31 36 29 6e 47 6f 74 3b  loc = (u16)nGot;
18b40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  .  }..  /* Move 
18b50 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74  existing slots t
18b60 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74  hat come after t
18b70 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65  he newly inserte
18b80 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74  d slots.  ** out
18b90 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20   of the way */. 
18ba0 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
18bb0 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20  c-1; i>=iStart; 
18bc0 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e  i--){.    pSrc->
18bd0 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53  a[i+nExtra] = pS
18be0 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20  rc->a[i];.  }.  
18bf0 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 28 69  pSrc->nSrc += (i
18c00 31 36 29 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a  16)nExtra;..  /*
18c10 20 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c 79 20   Zero the newly 
18c20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20  allocated slots 
18c30 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 72  */.  memset(&pSr
18c40 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c  c->a[iStart], 0,
18c50 20 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b   sizeof(pSrc->a[
18c60 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66  0])*nExtra);.  f
18c70 6f 72 28 69 3d 69 53 74 61 72 74 3b 20 69 3c 69  or(i=iStart; i<i
18c80 53 74 61 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b  Start+nExtra; i+
18c90 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b  +){.    pSrc->a[
18ca0 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b  i].iCursor = -1;
18cb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72  .  }..  /* Retur
18cc0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
18cd0 68 65 20 65 6e 6c 61 72 67 65 64 20 53 72 63 4c  he enlarged SrcL
18ce0 69 73 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ist */.  return 
18cf0 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  pSrc;.}.../*.** 
18d00 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62  Append a new tab
18d10 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67  le name to the g
18d20 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43  iven SrcList.  C
18d30 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c  reate a new SrcL
18d40 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
18d50 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20  e.  A new entry 
18d60 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  is created in th
18d70 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69  e SrcList even i
18d80 66 20 70 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c  f pTable is NULL
18d90 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73  ..**.** A SrcLis
18da0 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
18db0 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20  r NULL if there 
18dc0 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  is an OOM error.
18dd0 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 0a 2a    The returned.*
18de0 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20  * SrcList might 
18df0 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
18e00 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
18e10 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69 74 20  was input or it 
18e20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e 65  might be.** a ne
18e30 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f 4f  w one.  If an OO
18e40 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  M error does occ
18e50 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 70 72  urs, then the pr
18e60 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70 4c 69  ior value of pLi
18e70 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 69 6e  st.** that is in
18e80 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74  put to this rout
18e90 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74 69 63  ine is automatic
18ea0 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a  ally freed..**.*
18eb0 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20 69  * If pDatabase i
18ec0 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d  s not null, it m
18ed0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74 61  eans that the ta
18ee0 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f  ble has an optio
18ef0 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  nal.** database 
18f00 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69  name prefix.  Li
18f10 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61 62  ke this:  "datab
18f20 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65  ase.table".  The
18f30 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f   pDatabase.** po
18f40 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c  ints to the tabl
18f50 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70  e name and the p
18f60 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20  Table points to 
18f70 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
18f80 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73  e..** The SrcLis
18f90 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c  t.a[].zName fiel
18fa0 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  d is filled with
18fb0 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
18fc0 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63  which might.** c
18fd0 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20  ome from pTable 
18fe0 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69 73  (if pDatabase is
18ff0 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70   NULL) or from p
19000 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53  Database.  .** S
19010 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61  rcList.a[].zData
19020 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77  base is filled w
19030 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
19040 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   name from pTabl
19050 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55  e,.** or with NU
19060 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73  LL if no databas
19070 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a  e is specified..
19080 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  **.** In other w
19090 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69  ords, if call li
190a0 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
190b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
190c0 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c  cListAppend(D,A,
190d0 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  B,0);.**.** Then
190e0 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61   B is a table na
190f0 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  me and the datab
19100 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70  ase name is unsp
19110 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c  ecified.  If cal
19120 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73  led.** like this
19130 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
19140 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
19150 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a  pend(D,A,B,C);.*
19160 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74  *.** Then C is t
19170 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  he table name an
19180 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62  d B is the datab
19190 61 73 65 20 6e 61 6d 65 2e 20 20 49 66 20 43 20  ase name.  If C 
191a0 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74 68  is defined.** th
191b0 65 6e 20 73 6f 20 69 73 20 42 2e 20 20 49 6e 20  en so is B.  In 
191c0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 65 20  other words, we 
191d0 6e 65 76 65 72 20 68 61 76 65 20 61 20 63 61 73  never have a cas
191e0 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20  e where:.**.**  
191f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
19200 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c  cListAppend(D,A,
19210 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68  0,C);.**.** Both
19220 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74   pTable and pDat
19230 61 62 61 73 65 20 61 72 65 20 61 73 73 75 6d 65  abase are assume
19240 64 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20  d to be quoted. 
19250 20 54 68 65 79 20 61 72 65 20 64 65 71 75 6f 74   They are dequot
19260 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65 69  ed.** before bei
19270 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ng added to the 
19280 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c  SrcList..*/.SrcL
19290 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
192a0 69 73 74 41 70 70 65 6e 64 28 0a 20 20 73 71 6c  istAppend(.  sql
192b0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
192c0 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74   /* Connection t
192d0 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c  o notify of mall
192e0 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20  oc failures */. 
192f0 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c   SrcList *pList,
19300 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74       /* Append t
19310 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74 2e 20  o this SrcList. 
19320 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61 20 6e  NULL creates a n
19330 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  ew SrcList */.  
19340 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20  Token *pTable,  
19350 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
19360 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65  append */.  Toke
19370 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20 20 20  n *pDatabase    
19380 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66 20 74  /* Database of t
19390 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  he table */.){. 
193a0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
193b0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61  item *pItem;.  a
193c0 73 73 65 72 74 28 20 70 44 61 74 61 62 61 73 65  ssert( pDatabase
193d0 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d 30  ==0 || pTable!=0
193e0 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68   );  /* Cannot h
193f0 61 76 65 20 43 20 77 69 74 68 6f 75 74 20 42 20  ave C without B 
19400 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  */.  if( pList==
19410 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
19420 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
19430 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
19440 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  SrcList) );.    
19450 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
19460 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69  eturn 0;.    pLi
19470 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a  st->nAlloc = 1;.
19480 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 73 71    }.  pList = sq
19490 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
194a0 72 67 65 28 64 62 2c 20 70 4c 69 73 74 2c 20 31  rge(db, pList, 1
194b0 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a  , pList->nSrc);.
194c0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
194d0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
194e0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
194f0 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
19500 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
19510 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  .  pItem = &pLis
19520 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63  t->a[pList->nSrc
19530 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61  -1];.  if( pData
19540 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73  base && pDatabas
19550 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70  e->z==0 ){.    p
19560 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
19570 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  }.  if( pDatabas
19580 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a  e ){.    Token *
19590 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73  pTemp = pDatabas
195a0 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65  e;.    pDatabase
195b0 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70   = pTable;.    p
195c0 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20  Table = pTemp;. 
195d0 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d   }.  pItem->zNam
195e0 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
195f0 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61  romToken(db, pTa
19600 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a  ble);.  pItem->z
19610 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74  Database = sqlit
19620 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
19630 64 62 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a  db, pDatabase);.
19640 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
19650 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
19660 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78  VdbeCursor index
19670 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20   numbers to all 
19680 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c  tables in a SrcL
19690 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ist.*/.void sqli
196a0 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
196b0 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70  Cursors(Parse *p
196c0 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
196d0 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
196e0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
196f0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
19700 20 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c   assert(pList ||
19710 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
19720 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
19730 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
19740 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
19750 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74  List->a; i<pList
19760 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
19770 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  em++){.      if(
19780 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e   pItem->iCursor>
19790 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
197a0 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72    pItem->iCursor
197b0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
197c0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  +;.      if( pIt
197d0 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
197e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
197f0 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
19800 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  rs(pParse, pItem
19810 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29  ->pSelect->pSrc)
19820 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19830 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
19840 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72  ete an entire Sr
19850 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20  cList including 
19860 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63  all its substruc
19870 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
19880 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
19890 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
198a0 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
198b0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
198c0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
198d0 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
198e0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
198f0 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
19900 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
19910 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
19920 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
19930 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
19940 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
19950 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
19960 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
19970 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
19980 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
19990 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
199a0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
199b0 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65  db, pItem->zInde
199c0 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  x);.    sqlite3D
199d0 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
199e0 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  Item->pTab);.   
199f0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
19a00 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
19a10 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71  pSelect);.    sq
19a20 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
19a30 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b  db, pItem->pOn);
19a40 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69  .    sqlite3IdLi
19a50 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  stDelete(db, pIt
19a60 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d  em->pUsing);.  }
19a70 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
19a80 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a  (db, pList);.}..
19a90 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
19aa0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
19ab0 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 61 64  the parser to ad
19ac0 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20  d a new term to 
19ad0 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20  the.** end of a 
19ae0 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61  growing FROM cla
19af0 75 73 65 2e 20 20 54 68 65 20 22 70 22 20 70 61  use.  The "p" pa
19b00 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 70  rameter is the p
19b10 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52  art of.** the FR
19b20 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20 68  OM clause that h
19b30 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
19b40 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22 70  constructed.  "p
19b50 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20  " is NULL.** if 
19b60 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
19b70 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52  t term of the FR
19b80 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61 62  OM clause.  pTab
19b90 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65  le and pDatabase
19ba0 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65  .** are the name
19bb0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e   of the table an
19bc0 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64  d database named
19bd0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
19be0 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61  use term..** pDa
19bf0 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20 69  tabase is NULL i
19c00 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  f the database n
19c10 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69 73  ame qualifier is
19c20 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a   missing - the.*
19c30 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20 49  * usual case.  I
19c40 66 20 74 68 65 20 74 65 72 6d 20 68 61 73 20 61  f the term has a
19c50 20 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41 6c   alias, then pAl
19c60 69 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ias points to th
19c70 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65 6e  e.** alias token
19c80 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 69  .  If the term i
19c90 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 74 68  s a subquery, th
19ca0 65 6e 20 70 53 75 62 71 75 65 72 79 20 69 73 20  en pSubquery is 
19cb0 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  the.** SELECT st
19cc0 61 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65  atement that the
19cd0 20 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64 65   subquery encode
19ce0 73 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20 61  s.  The pTable a
19cf0 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20  nd.** pDatabase 
19d00 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 4e  parameters are N
19d10 55 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72 69  ULL for subqueri
19d20 65 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e 64  es.  The pOn and
19d30 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d   pUsing.** param
19d40 65 74 65 72 73 20 61 72 65 20 74 68 65 20 63 6f  eters are the co
19d50 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e 20  ntent of the ON 
19d60 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
19d70 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
19d80 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77 68  a new SrcList wh
19d90 69 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20 74  ich encodes is t
19da0 68 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68 65  he FROM with the
19db0 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64 64   new.** term add
19dc0 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a  ed..*/.SrcList *
19dd0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
19de0 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20 20  pendFromTerm(.  
19df0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
19e00 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
19e10 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
19e20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20 20  SrcList *p,     
19e30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
19e40 65 66 74 20 70 61 72 74 20 6f 66 20 74 68 65 20  eft part of the 
19e50 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72 65  FROM clause alre
19e60 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f  ady seen */.  To
19e70 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20  ken *pTable,    
19e80 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
19e90 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61 64   the table to ad
19ea0 64 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63 6c  d to the FROM cl
19eb0 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ause */.  Token 
19ec0 2a 70 44 61 74 61 62 61 73 65 2c 20 20 20 20 20  *pDatabase,     
19ed0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
19ee0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
19ef0 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a 20  ning pTable */. 
19f00 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c 20   Token *pAlias, 
19f10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
19f20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
19f30 6f 66 20 74 68 65 20 41 53 20 73 75 62 65 78 70  of the AS subexp
19f40 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ression */.  Sel
19f50 65 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c 20  ect *pSubquery, 
19f60 20 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75 65       /* A subque
19f70 72 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65  ry used in place
19f80 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65   of a table name
19f90 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e 2c   */.  Expr *pOn,
19fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19fb0 20 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f   The ON clause o
19fc0 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64  f a join */.  Id
19fd0 4c 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20 20  List *pUsing    
19fe0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53 49        /* The USI
19ff0 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a  NG clause of a j
1a000 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  oin */.){.  stru
1a010 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1a020 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
1a030 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1a040 64 62 3b 0a 20 20 69 66 28 20 21 70 20 26 26 20  db;.  if( !p && 
1a050 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29 20  (pOn || pUsing) 
1a060 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1a070 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1a080 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69 73  a JOIN clause is
1a090 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
1a0a0 20 25 73 22 2c 20 0a 20 20 20 20 20 20 28 70 4f   %s", .      (pO
1a0b0 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49 4e  n ? "ON" : "USIN
1a0c0 47 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 67  G").    );.    g
1a0d0 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f  oto append_from_
1a0e0 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20 3d  error;.  }.  p =
1a0f0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1a100 70 70 65 6e 64 28 64 62 2c 20 70 2c 20 70 54 61  ppend(db, p, pTa
1a110 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b  ble, pDatabase);
1a120 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e  .  if( p==0 || N
1a130 45 56 45 52 28 70 2d 3e 6e 53 72 63 3d 3d 30 29  EVER(p->nSrc==0)
1a140 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70   ){.    goto app
1a150 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a  end_from_error;.
1a160 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70    }.  pItem = &p
1a170 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a  ->a[p->nSrc-1];.
1a180 20 20 61 73 73 65 72 74 28 20 70 41 6c 69 61 73    assert( pAlias
1a190 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 41 6c  !=0 );.  if( pAl
1a1a0 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49  ias->n ){.    pI
1a1b0 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71  tem->zAlias = sq
1a1c0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1a1d0 65 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a  en(db, pAlias);.
1a1e0 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65    }.  pItem->pSe
1a1f0 6c 65 63 74 20 3d 20 70 53 75 62 71 75 65 72 79  lect = pSubquery
1a200 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d  ;.  pItem->pOn =
1a210 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70   pOn;.  pItem->p
1a220 55 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a  Using = pUsing;.
1a230 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70    return p;.. ap
1a240 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a  pend_from_error:
1a250 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
1a260 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1a270 44 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b  Delete(db, pOn);
1a280 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  .  sqlite3IdList
1a290 44 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69 6e  Delete(db, pUsin
1a2a0 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  g);.  sqlite3Sel
1a2b0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
1a2c0 75 62 71 75 65 72 79 29 3b 0a 20 20 72 65 74 75  ubquery);.  retu
1a2d0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
1a2e0 64 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59  dd an INDEXED BY
1a2f0 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44 20   or NOT INDEXED 
1a300 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d 6f  clause to the mo
1a310 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
1a320 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66  d .** element of
1a330 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74   the source-list
1a340 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
1a350 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
1a360 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1a370 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28  rcListIndexedBy(
1a380 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
1a390 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e  rcList *p, Token
1a3a0 20 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a 20   *pIndexedBy){. 
1a3b0 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 65   assert( pIndexe
1a3c0 64 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  dBy!=0 );.  if( 
1a3d0 70 20 26 26 20 41 4c 57 41 59 53 28 70 2d 3e 6e  p && ALWAYS(p->n
1a3e0 53 72 63 3e 30 29 20 29 7b 0a 20 20 20 20 73 74  Src>0) ){.    st
1a3f0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1a400 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61  m *pItem = &p->a
1a410 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20  [p->nSrc-1];.   
1a420 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
1a430 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 26 26  notIndexed==0 &&
1a440 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 3d 3d   pItem->zIndex==
1a450 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  0 );.    if( pIn
1a460 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26  dexedBy->n==1 &&
1a470 20 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20   !pIndexedBy->z 
1a480 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e  ){.      /* A "N
1a490 4f 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75  OT INDEXED" clau
1a4a0 73 65 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e  se was supplied.
1a4b0 20 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20   See parse.y .  
1a4c0 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74      ** construct
1a4d0 20 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66   "indexed_opt" f
1a4e0 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20  or details. */. 
1a4f0 20 20 20 20 20 70 49 74 65 6d 2d 3e 6e 6f 74 49       pItem->notI
1a500 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20  ndexed = 1;.    
1a510 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74  }else{.      pIt
1a520 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c  em->zIndex = sql
1a530 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1a540 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49  n(pParse->db, pI
1a550 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d  ndexedBy);.    }
1a560 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  .  }.}../*.** Wh
1a570 65 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61  en building up a
1a580 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20   FROM clause in 
1a590 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 20  the parser, the 
1a5a0 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  join operator.**
1a5b0 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74   is initially at
1a5c0 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65  tached to the le
1a5d0 66 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74  ft operand.  But
1a5e0 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
1a5f0 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74  tor.** expects t
1a600 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
1a610 20 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69   to be on the ri
1a620 67 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68  ght operand.  Th
1a630 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68  is routine.** Sh
1a640 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70  ifts all join op
1a650 65 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66  erators from lef
1a660 74 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61  t to right for a
1a670 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a  n entire FROM.**
1a680 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45   clause..**.** E
1a690 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20  xample: Suppose 
1a6a0 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65  the join is like
1a6b0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1a6c0 20 20 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c         A natural
1a6d0 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a   cross join B.**
1a6e0 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72  .** The operator
1a6f0 20 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f   is "natural cro
1a700 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41  ss join".  The A
1a710 20 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20   and B operands 
1a720 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  are stored.** in
1a730 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e   p->a[0] and p->
1a740 61 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65  a[1], respective
1a750 6c 79 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  ly.  The parser 
1a760 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73  initially stores
1a770 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72   the.** operator
1a780 20 77 69 74 68 20 41 2e 20 20 54 68 69 73 20 72   with A.  This r
1a790 6f 75 74 69 6e 65 20 73 68 69 66 74 73 20 74 68  outine shifts th
1a7a0 61 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72  at operator over
1a7b0 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73   to B..*/.void s
1a7c0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68 69  qlite3SrcListShi
1a7d0 66 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69  ftJoinType(SrcLi
1a7e0 73 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  st *p){.  if( p 
1a7f0 26 26 20 70 2d 3e 61 20 29 7b 0a 20 20 20 20 69  && p->a ){.    i
1a800 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
1a810 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20  p->nSrc-1; i>0; 
1a820 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  i--){.      p->a
1a830 5b 69 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70  [i].jointype = p
1a840 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70  ->a[i-1].jointyp
1a850 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  e;.    }.    p->
1a860 61 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  a[0].jointype = 
1a870 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
1a880 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74  Begin a transact
1a890 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
1a8a0 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74  te3BeginTransact
1a8b0 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
1a8c0 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20  e, int type){.  
1a8d0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
1a8e0 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b  dbe *v;.  int i;
1a8f0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
1a900 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20  se!=0 );.  db = 
1a910 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
1a920 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 2f  sert( db!=0 );./
1a930 2a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 30  *  if( db->aDb[0
1a940 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
1a950 6e 3b 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  n; */.  if( sqli
1a960 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1a970 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
1a980 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22  SACTION, "BEGIN"
1a990 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72  , 0, 0) ){.    r
1a9a0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d  eturn;.  }.  v =
1a9b0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1a9c0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21  pParse);.  if( !
1a9d0 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  v ) return;.  if
1a9e0 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52  ( type!=TK_DEFER
1a9f0 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  RED ){.    for(i
1aa00 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
1aa10 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
1aa20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1aa30 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
1aa40 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43  i, (type==TK_EXC
1aa50 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20  LUSIVE)+1);.    
1aa60 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
1aa70 73 42 74 72 65 65 28 76 2c 20 69 29 3b 0a 20 20  sBtree(v, i);.  
1aa80 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1aa90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1aaa0 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c  P_AutoCommit, 0,
1aab0 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   0);.}../*.** Co
1aac0 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69  mmit a transacti
1aad0 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
1aae0 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74  e3CommitTransact
1aaf0 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
1ab00 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
1ab10 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  b;.  Vdbe *v;.. 
1ab20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
1ab30 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61  =0 );.  db = pPa
1ab40 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
1ab50 74 28 20 64 62 21 3d 30 20 29 3b 0a 2f 2a 20 20  t( db!=0 );./*  
1ab60 69 66 28 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  if( db->aDb[0].p
1ab70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20  Bt==0 ) return; 
1ab80 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
1ab90 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1aba0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
1abb0 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  TION, "COMMIT", 
1abc0 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74  0, 0) ){.    ret
1abd0 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73  urn;.  }.  v = s
1abe0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1abf0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
1ac00 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1ac10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75  eAddOp2(v, OP_Au
1ac20 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b  toCommit, 1, 0);
1ac30 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  .  }.}../*.** Ro
1ac40 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
1ac50 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
1ac60 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e  ite3RollbackTran
1ac70 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
1ac80 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
1ac90 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
1aca0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1acb0 72 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d  rse!=0 );.  db =
1acc0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
1acd0 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
1ace0 2f 2a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b  /*  if( db->aDb[
1acf0 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75  0].pBt==0 ) retu
1ad00 72 6e 3b 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  rn; */.  if( sql
1ad10 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1ad20 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
1ad30 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42  NSACTION, "ROLLB
1ad40 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20  ACK", 0, 0) ){. 
1ad50 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1ad60 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1ad70 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
1ad80 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
1ad90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ada0 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
1adb0 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  1, 1);.  }.}../*
1adc0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1add0 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  n is called by t
1ade0 68 65 20 70 61 72 73 65 72 20 77 68 65 6e 20 69  he parser when i
1adf0 74 20 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61  t parses a comma
1ae00 6e 64 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a  nd to create,.**
1ae10 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c   release or roll
1ae20 62 61 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65  back an SQL save
1ae30 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20  point. .*/.void 
1ae40 73 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74  sqlite3Savepoint
1ae50 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1ae60 69 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70  int op, Token *p
1ae70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
1ae80 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
1ae90 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
1aea0 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  se->db, pName);.
1aeb0 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
1aec0 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
1aed0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1aee0 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  se);.#ifndef SQL
1aef0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
1af00 5a 41 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69  ZATION.    stati
1af10 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63  c const char * c
1af20 6f 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42  onst az[] = { "B
1af30 45 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22  EGIN", "RELEASE"
1af40 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a  , "ROLLBACK" };.
1af50 20 20 20 20 61 73 73 65 72 74 28 20 21 53 41 56      assert( !SAV
1af60 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20  EPOINT_BEGIN && 
1af70 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
1af80 45 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e  E==1 && SAVEPOIN
1af90 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b  T_ROLLBACK==2 );
1afa0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
1afb0 21 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74  !v || sqlite3Aut
1afc0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1afd0 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c  QLITE_SAVEPOINT,
1afe0 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20   az[op], zName, 
1aff0 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
1b000 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
1b010 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ->db, zName);.  
1b020 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
1b030 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
1b040 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61  eAddOp4(v, OP_Sa
1b050 76 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20  vepoint, op, 0, 
1b060 30 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e  0, zName, P4_DYN
1b070 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  AMIC);.  }.}../*
1b080 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
1b090 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  e TEMP database 
1b0a0 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69  is open and avai
1b0b0 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20  lable for use.  
1b0c0 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75  Return.** the nu
1b0d0 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
1b0e0 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72   Leave any error
1b0f0 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65   messages in the
1b100 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
1b110 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1b120 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
1b130 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
1b140 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
1b150 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1b160 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  if( db->aDb[1].p
1b170 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65  Bt==0 && !pParse
1b180 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
1b190 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72   int rc;.    Btr
1b1a0 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 73 74 61  ee *pBt;.    sta
1b1b0 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c  tic const int fl
1b1c0 61 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20  ags = .         
1b1d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1b1e0 44 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20  DWRITE |.       
1b1f0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43     SQLITE_OPEN_C
1b200 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20  REATE |.        
1b210 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
1b220 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20  CLUSIVE |.      
1b230 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1b240 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a  DELETEONCLOSE |.
1b250 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1b260 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a  _OPEN_TEMP_DB;..
1b270 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b280 42 74 72 65 65 4f 70 65 6e 28 30 2c 20 64 62 2c  BtreeOpen(0, db,
1b290 20 26 70 42 74 2c 20 30 2c 20 66 6c 61 67 73 29   &pBt, 0, flags)
1b2a0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1b2b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b2c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1b2d0 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
1b2e0 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
1b2f0 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a  rary database ".
1b300 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f          "file fo
1b310 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72  r storing tempor
1b320 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20  ary tables");.  
1b330 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
1b340 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
1b350 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  n 1;.    }.    d
1b360 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20 3d 20  b->aDb[1].pBt = 
1b370 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
1b380 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68   db->aDb[1].pSch
1b390 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20 53  ema );.    if( S
1b3a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c  QLITE_NOMEM==sql
1b3b0 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
1b3c0 53 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65  Size(pBt, db->ne
1b3d0 78 74 50 61 67 65 73 69 7a 65 2c 20 2d 31 2c 20  xtPagesize, -1, 
1b3e0 30 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  0) ){.      db->
1b3f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
1b400 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
1b410 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1b420 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1b430 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
1b440 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65  ode that will ve
1b450 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
1b460 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74  cookie and start
1b470 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73  .** a read-trans
1b480 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e  action for all n
1b490 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  amed database fi
1b4a0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  les..**.** It is
1b4b0 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
1b4c0 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  all schema cooki
1b4d0 65 73 20 62 65 20 76 65 72 69 66 69 65 64 20 61  es be verified a
1b4e0 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74  nd all.** read t
1b4f0 72 61 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73  ransactions be s
1b500 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e  tarted before an
1b510 79 74 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70  ything else happ
1b520 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44  ens in.** the VD
1b530 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74  BE program.  But
1b540 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
1b550 6e 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  n be called afte
1b560 72 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20  r much other.** 
1b570 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20 67 65  code has been ge
1b580 6e 65 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72  nerated.  So her
1b590 65 20 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a  e is what we do:
1b5a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
1b5b0 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69   time this routi
1b5c0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65  ne is called, we
1b5d0 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f   code an OP_Goto
1b5e0 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75   that.** will ju
1b5f0 6d 70 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69  mp to a subrouti
1b600 6e 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ne at the end of
1b610 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54   the program.  T
1b620 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64  hen we.** record
1b630 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20   every database 
1b640 74 68 61 74 20 6e 65 65 64 73 20 69 74 73 20 73  that needs its s
1b650 63 68 65 6d 61 20 76 65 72 69 66 69 65 64 20 69  chema verified i
1b660 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d  n the.** pParse-
1b670 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c  >cookieMask fiel
1b680 64 2e 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72  d.  Later, after
1b690 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20   all other code 
1b6a0 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65  has been.** gene
1b6b0 72 61 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f  rated, the subro
1b6c0 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20  utine that does 
1b6d0 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  the cookie verif
1b6e0 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  ications and.** 
1b6f0 73 74 61 72 74 73 20 74 68 65 20 74 72 61 6e 73  starts the trans
1b700 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20  actions will be 
1b710 63 6f 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50  coded and the OP
1b720 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a  _Goto P2 value.*
1b730 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74  * will be made t
1b740 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20  o point to that 
1b750 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  subroutine.  The
1b760 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74   generation of t
1b770 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72  he.** cookie ver
1b780 69 66 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75  ification subrou
1b790 74 69 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e  tine code happen
1b7a0 73 20 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69  s in sqlite3Fini
1b7b0 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a  shCoding()..**.*
1b7c0 2a 20 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20  * If iDb<0 then 
1b7d0 63 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f  code the OP_Goto
1b7e0 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65   only - don't se
1b7f0 74 20 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79  t flag to verify
1b800 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f   the.** schema o
1b810 6e 20 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e  n any databases.
1b820 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
1b830 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74  ed to position t
1b840 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61  he OP_Goto.** ea
1b850 72 6c 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c  rly in the code,
1b860 20 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20   before we know 
1b870 69 66 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  if any database 
1b880 74 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75  tables will be u
1b890 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sed..*/.void sql
1b8a0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
1b8b0 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  hema(Parse *pPar
1b8c0 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
1b8d0 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
1b8e0 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
1b8f0 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
1b900 0a 0a 20 20 69 66 28 20 70 54 6f 70 6c 65 76 65  ..  if( pTopleve
1b910 6c 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30  l->cookieGoto==0
1b920 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   ){.    Vdbe *v 
1b930 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
1b940 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20  (pToplevel);.   
1b950 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
1b960 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c  rn;  /* This onl
1b970 79 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65  y happens if the
1b980 72 65 20 77 61 73 20 61 20 70 72 69 6f 72 20 65  re was a prior e
1b990 72 72 6f 72 20 2a 2f 0a 20 20 20 20 70 54 6f 70  rror */.    pTop
1b9a0 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 47 6f 74  level->cookieGot
1b9b0 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  o = sqlite3VdbeA
1b9c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
1b9d0 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a 20  , 0, 0)+1;.  }. 
1b9e0 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20   if( iDb>=0 ){. 
1b9f0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
1ba00 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 64 62 3b 0a   pToplevel->db;.
1ba10 20 20 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20      int mask;.. 
1ba20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 64     assert( iDb<d
1ba30 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73  b->nDb );.    as
1ba40 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44  sert( db->aDb[iD
1ba50 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62  b].pBt!=0 || iDb
1ba60 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
1ba70 74 28 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41  t( iDb<SQLITE_MA
1ba80 58 5f 41 54 54 41 43 48 45 44 2b 32 20 29 3b 0a  X_ATTACHED+2 );.
1ba90 20 20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44      mask = 1<<iD
1baa0 62 3b 0a 20 20 20 20 69 66 28 20 28 70 54 6f 70  b;.    if( (pTop
1bab0 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73  level->cookieMas
1bac0 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a  k & mask)==0 ){.
1bad0 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d        pToplevel-
1bae0 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d  >cookieMask |= m
1baf0 61 73 6b 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c  ask;.      pTopl
1bb00 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75  evel->cookieValu
1bb10 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62  e[iDb] = db->aDb
1bb20 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73  [iDb].pSchema->s
1bb30 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20  chema_cookie;.  
1bb40 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
1bb50 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
1bb60 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1bb70 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
1bb80 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20  e(pToplevel);.  
1bb90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1bba0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1bbb0 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74  e VDBE code that
1bbc0 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f   prepares for do
1bbd0 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  ing an operation
1bbe0 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63   that.** might c
1bbf0 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61  hange the databa
1bc00 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
1bc10 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20  outine starts a 
1bc20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  new transaction 
1bc30 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c  if we are not al
1bc40 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20  ready within.** 
1bc50 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  a transaction.  
1bc60 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64  If we are alread
1bc70 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  y within a trans
1bc80 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63  action, then a c
1bc90 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20  heckpoint.** is 
1bca0 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53 74  set if the setSt
1bcb0 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65  atement paramete
1bcc0 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68  r is true.  A ch
1bcd0 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a  eckpoint should.
1bce0 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70  ** be set for op
1bcf0 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69  erations that mi
1bd00 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f  ght fail (due to
1bd10 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70   a constraint) p
1bd20 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61  art of.** the wa
1bd30 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68  y through and wh
1bd40 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  ich will need to
1bd50 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65   undo some write
1bd60 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  s without having
1bd70 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20   to.** rollback 
1bd80 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61  the whole transa
1bd90 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72  ction.  For oper
1bda0 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c  ations where all
1bdb0 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20   constraints.** 
1bdc0 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62  can be checked b
1bdd0 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
1bde0 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68  s are made to th
1bdf0 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69  e database, it i
1be00 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73  s never.** neces
1be10 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77  sary to undo a w
1be20 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65  rite and the che
1be30 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e  ckpoint should n
1be40 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ot be set..*/.vo
1be50 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57  id sqlite3BeginW
1be60 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61  riteOperation(Pa
1be70 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1be80 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69   setStatement, i
1be90 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65  nt iDb){.  Parse
1bea0 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
1beb0 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
1bec0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  el(pParse);.  sq
1bed0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
1bee0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
1bef0 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d  b);.  pToplevel-
1bf00 3e 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c  >writeMask |= 1<
1bf10 3c 69 44 62 3b 0a 20 20 70 54 6f 70 6c 65 76 65  <iDb;.  pTopleve
1bf20 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20  l->isMultiWrite 
1bf30 7c 3d 20 73 65 74 53 74 61 74 65 6d 65 6e 74 3b  |= setStatement;
1bf40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  .}../*.** Indica
1bf50 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74  te that the stat
1bf60 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20  ement currently 
1bf70 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1bf80 6f 6e 20 6d 69 67 68 74 20 77 72 69 74 65 0a 2a  on might write.*
1bf90 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  * more than one 
1bfa0 65 6e 74 72 79 20 28 65 78 61 6d 70 6c 65 3a 20  entry (example: 
1bfb0 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72 6f 77  deleting one row
1bfc0 20 74 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20   then inserting 
1bfd0 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e 73 65  another,.** inse
1bfe0 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 72  rting multiple r
1bff0 6f 77 73 20 69 6e 20 61 20 74 61 62 6c 65 2c 20  ows in a table, 
1c000 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 61 20 72  or inserting a r
1c010 6f 77 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74  ow and index ent
1c020 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61 6e 20  ries.).** If an 
1c030 61 62 6f 72 74 20 6f 63 63 75 72 73 20 61 66 74  abort occurs aft
1c040 65 72 20 73 6f 6d 65 20 6f 66 20 74 68 65 73 65  er some of these
1c050 20 77 72 69 74 65 73 20 68 61 76 65 20 63 6f 6d   writes have com
1c060 70 6c 65 74 65 64 2c 20 74 68 65 6e 20 69 74 20  pleted, then it 
1c070 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63 65 73  will.** be neces
1c080 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 74 68 65  sary to undo the
1c090 20 63 6f 6d 70 6c 65 74 65 64 20 77 72 69 74 65   completed write
1c0a0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1c0b0 65 33 4d 75 6c 74 69 57 72 69 74 65 28 50 61 72  e3MultiWrite(Par
1c0c0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50  se *pParse){.  P
1c0d0 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
1c0e0 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
1c0f0 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
1c100 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d    pToplevel->isM
1c110 75 6c 74 69 57 72 69 74 65 20 3d 20 31 3b 0a 7d  ultiWrite = 1;.}
1c120 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 64  ../* .** The cod
1c130 65 20 67 65 6e 65 72 61 74 6f 72 20 63 61 6c 6c  e generator call
1c140 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  s this routine i
1c150 66 20 69 73 20 64 69 73 63 6f 76 65 72 73 20 74  f is discovers t
1c160 68 61 74 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73  hat it is.** pos
1c170 73 69 62 6c 65 20 74 6f 20 61 62 6f 72 74 20 61  sible to abort a
1c180 20 73 74 61 74 65 6d 65 6e 74 20 70 72 69 6f 72   statement prior
1c190 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20   to completion. 
1c1a0 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a 2a 2a   In order to .**
1c1b0 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 61 62   perform this ab
1c1c0 6f 72 74 20 77 69 74 68 6f 75 74 20 63 6f 72 72  ort without corr
1c1d0 75 70 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  upting the datab
1c1e0 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  ase, we need to 
1c1f0 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74 68 61  make.** sure tha
1c200 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
1c210 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20  is protected by 
1c220 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
1c230 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  saction..**.** T
1c240 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6f  echnically, we o
1c250 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 65 74 20  nly need to set 
1c260 74 68 65 20 6d 61 79 41 62 6f 72 74 20 66 6c 61  the mayAbort fla
1c270 67 20 69 66 20 74 68 65 0a 2a 2a 20 69 73 4d 75  g if the.** isMu
1c280 6c 74 69 57 72 69 74 65 20 66 6c 61 67 20 77 61  ltiWrite flag wa
1c290 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74  s previously set
1c2a0 2e 20 20 54 68 65 72 65 20 69 73 20 61 20 74 69  .  There is a ti
1c2b0 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a  me dependency.**
1c2c0 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 61   such that the a
1c2d0 62 6f 72 74 20 6d 75 73 74 20 6f 63 63 75 72 20  bort must occur 
1c2e0 61 66 74 65 72 20 74 68 65 20 6d 75 6c 74 69 77  after the multiw
1c2f0 72 69 74 65 2e 20 20 54 68 69 73 20 6d 61 6b 65  rite.  This make
1c300 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74 65 6d  s.** some statem
1c310 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 74  ents involving t
1c320 68 65 20 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c  he REPLACE confl
1c330 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
1c340 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f 20 61  lgorithm.** go a
1c350 20 6c 69 74 74 6c 65 20 66 61 73 74 65 72 2e 20   little faster. 
1c360 20 42 75 74 20 74 61 6b 69 6e 67 20 61 64 76 61   But taking adva
1c370 6e 74 61 67 65 20 6f 66 20 74 68 69 73 20 74 69  ntage of this ti
1c380 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a  me dependency.**
1c390 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65 20 64   makes it more d
1c3a0 69 66 66 69 63 75 6c 74 20 74 6f 20 70 72 6f 76  ifficult to prov
1c3b0 65 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20  e that the code 
1c3c0 69 73 20 63 6f 72 72 65 63 74 20 28 69 6e 20 0a  is correct (in .
1c3d0 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 2c 20 69  ** particular, i
1c3e0 74 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72  t prevents us fr
1c3f0 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e 20 65 66  om writing an ef
1c400 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70 6c 65  fective.** imple
1c410 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71 6c  mentation of sql
1c420 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
1c430 72 74 28 29 29 20 61 6e 64 20 73 6f 20 77 65 20  rt()) and so we 
1c440 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a 20 74  have chosen.** t
1c450 6f 20 74 61 6b 65 20 74 68 65 20 73 61 66 65 20  o take the safe 
1c460 72 6f 75 74 65 20 61 6e 64 20 73 6b 69 70 20 74  route and skip t
1c470 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  he optimization.
1c480 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1c490 4d 61 79 41 62 6f 72 74 28 50 61 72 73 65 20 2a  MayAbort(Parse *
1c4a0 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65  pParse){.  Parse
1c4b0 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
1c4c0 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
1c4d0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54  el(pParse);.  pT
1c4e0 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f 72  oplevel->mayAbor
1c4f0 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 1;.}../*.** 
1c500 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20  Code an OP_Halt 
1c510 74 68 61 74 20 63 61 75 73 65 73 20 74 68 65 20  that causes the 
1c520 76 64 62 65 20 74 6f 20 72 65 74 75 72 6e 20 61  vdbe to return a
1c530 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
1c540 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54 68  INT.** error. Th
1c550 65 20 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d 65  e onError parame
1c560 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ter determines w
1c570 68 69 63 68 20 28 69 66 20 61 6e 79 29 20 6f 66  hich (if any) of
1c580 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
1c590 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e 74  * and/or current
1c5a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1c5b0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
1c5c0 76 6f 69 64 20 73 71 6c 69 74 65 33 48 61 6c 74  void sqlite3Halt
1c5d0 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 72 73 65  Constraint(Parse
1c5e0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e   *pParse, int on
1c5f0 45 72 72 6f 72 2c 20 63 68 61 72 20 2a 70 34 2c  Error, char *p4,
1c600 20 69 6e 74 20 70 34 74 79 70 65 29 7b 0a 20 20   int p4type){.  
1c610 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
1c620 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1c630 3b 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d  ;.  if( onError=
1c640 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
1c650 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
1c660 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20  (pParse);.  }.  
1c670 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c680 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51  4(v, OP_Halt, SQ
1c690 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c  LITE_CONSTRAINT,
1c6a0 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c   onError, 0, p4,
1c6b0 20 70 34 74 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a   p4type);.}../*.
1c6c0 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
1c6d0 69 66 20 70 49 6e 64 65 78 20 75 73 65 73 20 74  if pIndex uses t
1c6e0 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
1c6f0 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65  uence pColl.  Re
1c700 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
1c710 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73  it does and fals
1c720 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  e if it does not
1c730 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
1c740 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
1c750 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c  .static int coll
1c760 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74  ationMatch(const
1c770 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e   char *zColl, In
1c780 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20  dex *pIndex){.  
1c790 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
1c7a0 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 66   zColl!=0 );.  f
1c7b0 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78  or(i=0; i<pIndex
1c7c0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
1c7d0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1c7e0 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43  *z = pIndex->azC
1c7f0 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65  oll[i];.    asse
1c800 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20  rt( z!=0 );.    
1c810 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
1c820 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20  rICmp(z, zColl) 
1c830 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1c840 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
1c850 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1c860 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75  f../*.** Recompu
1c870 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
1c880 66 20 70 54 61 62 20 74 68 61 74 20 75 73 65 20  f pTab that use 
1c890 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
1c8a0 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a  quence pColl..**
1c8b0 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65   If pColl==0 the
1c8c0 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  n recompute all 
1c8d0 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e  indices of pTab.
1c8e0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
1c8f0 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
1c900 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
1c910 64 65 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a  dexTable(Parse *
1c920 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
1c930 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74 20  Tab, char const 
1c940 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78  *zColl){.  Index
1c950 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
1c960 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
1c970 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
1c980 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f  th pTab */..  fo
1c990 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70  r(pIndex=pTab->p
1c9a0 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70  Index; pIndex; p
1c9b0 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e  Index=pIndex->pN
1c9c0 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 7a 43  ext){.    if( zC
1c9d0 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74  oll==0 || collat
1c9e0 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20  ionMatch(zColl, 
1c9f0 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20  pIndex) ){.     
1ca00 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
1ca10 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
1ca20 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
1ca30 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
1ca40 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
1ca50 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
1ca60 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20  rse, 0, iDb);.  
1ca70 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
1ca80 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
1ca90 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20  Index, -1);.    
1caa0 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
1cab0 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20  /*.** Recompute 
1cac0 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61  all indices of a
1cad0 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c  ll tables in all
1cae0 20 64 61 74 61 62 61 73 65 73 20 77 68 65 72 65   databases where
1caf0 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20   the.** indices 
1cb00 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  use the collatin
1cb10 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
1cb20 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74  .  If pColl==0 t
1cb30 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a  hen recompute.**
1cb40 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65   all indices eve
1cb50 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e  rywhere..*/.#ifn
1cb60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1cb70 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76  REINDEX.static v
1cb80 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74 61 62  oid reindexDatab
1cb90 61 73 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ases(Parse *pPar
1cba0 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  se, char const *
1cbb0 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44  zColl){.  Db *pD
1cbc0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1cbd0 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
1cbe0 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
1cbf0 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
1cc00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1cc10 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  he database inde
1cc20 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71  x number */.  sq
1cc30 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1cc40 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65  se->db;   /* The
1cc50 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1cc60 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c  tion */.  HashEl
1cc70 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20  em *k;          
1cc80 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
1cc90 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73  ping over tables
1cca0 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62   in pDb */.  Tab
1ccb0 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
1ccc0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
1ccd0 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
1cce0 61 73 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 44  ase */..  for(iD
1ccf0 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62  b=0, pDb=db->aDb
1cd00 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69  ; iDb<db->nDb; i
1cd10 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20  Db++, pDb++){.  
1cd20 20 20 61 73 73 65 72 74 28 20 70 44 62 21 3d 30    assert( pDb!=0
1cd30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71   );.    for(k=sq
1cd40 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
1cd50 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  Db->pSchema->tbl
1cd60 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c  Hash);  k; k=sql
1cd70 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b  iteHashNext(k)){
1cd80 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54  .      pTab = (T
1cd90 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68  able*)sqliteHash
1cda0 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72  Data(k);.      r
1cdb0 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72  eindexTable(pPar
1cdc0 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29  se, pTab, zColl)
1cdd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
1cde0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ndif../*.** Gene
1cdf0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
1ce00 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e  e REINDEX comman
1ce10 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  d..**.**        
1ce20 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20  REINDEX         
1ce30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce40 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20     -- 1.**      
1ce50 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c    REINDEX  <coll
1ce60 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20  ation>          
1ce70 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20       -- 2.**    
1ce80 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64      REINDEX  ?<d
1ce90 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65  atabase>.?<table
1cea0 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20  name>  -- 3.**  
1ceb0 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f        REINDEX  ?
1cec0 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64  <database>.?<ind
1ced0 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a  exname>  -- 4.**
1cee0 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65  .** Form 1 cause
1cef0 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e  s all indices in
1cf00 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
1cf10 74 61 62 61 73 65 73 20 74 6f 20 62 65 20 72 65  tabases to be re
1cf20 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32  built..** Form 2
1cf30 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e   rebuilds all in
1cf40 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74  dices in all dat
1cf50 61 62 61 73 65 73 20 74 68 61 74 20 75 73 65 20  abases that use 
1cf60 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c  the named.** col
1cf70 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  lating function.
1cf80 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20    Forms 3 and 4 
1cf90 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65  rebuild the name
1cfa0 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a  d index or all.*
1cfb0 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  * indices associ
1cfc0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61  ated with the na
1cfd0 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69  med table..*/.#i
1cfe0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1cff0 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73  T_REINDEX.void s
1d000 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50 61  qlite3Reindex(Pa
1d010 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
1d020 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65  en *pName1, Toke
1d030 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f  n *pName2){.  Co
1d040 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
1d050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
1d060 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1d070 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c  to be reindexed,
1d080 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68   or NULL */.  ch
1d090 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20  ar *z;          
1d0a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1d0b0 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  e of a table or 
1d0c0 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74  index */.  const
1d0d0 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20   char *zDb;     
1d0e0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1d0f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  f the database *
1d100 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
1d110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d120 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68  /* A table in th
1d130 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
1d140 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
1d150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1d160 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  n index associat
1d170 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a  ed with pTab */.
1d180 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
1d190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d1a0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   The database in
1d1b0 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
1d1c0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1d1d0 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54  arse->db;   /* T
1d1e0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1d1f0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ection */.  Toke
1d200 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20  n *pObjName;    
1d210 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1d220 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
1d230 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e  index to be rein
1d240 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52  dexed */..  /* R
1d250 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
1d260 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65   schema. If an e
1d270 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61  rror occurs, lea
1d280 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
1d290 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64  age.  ** and cod
1d2a0 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
1d2b0 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a  return NULL. */.
1d2c0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
1d2d0 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
1d2e0 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
1d2f0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
1d300 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29   if( pName1==0 )
1d310 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61 74  {.    reindexDat
1d320 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 30  abases(pParse, 0
1d330 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
1d340 20 7d 65 6c 73 65 20 69 66 28 20 4e 45 56 45 52   }else if( NEVER
1d350 28 70 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 70  (pName2==0) || p
1d360 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  Name2->z==0 ){. 
1d370 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a     char *zColl;.
1d380 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
1d390 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f  e1->z );.    zCo
1d3a0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ll = sqlite3Name
1d3b0 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
1d3c0 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20  ->db, pName1);. 
1d3d0 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20     if( !zColl ) 
1d3e0 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c  return;.    pCol
1d3f0 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
1d400 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64  ollSeq(db, ENC(d
1d410 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20  b), zColl, 0);. 
1d420 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
1d430 20 20 20 20 20 20 72 65 69 6e 64 65 78 44 61 74        reindexDat
1d440 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 7a  abases(pParse, z
1d450 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Coll);.      sql
1d460 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
1d470 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74  Coll);.      ret
1d480 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  urn;.    }.    s
1d490 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1d4a0 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69   zColl);.  }.  i
1d4b0 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
1d4c0 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
1d4d0 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
1d4e0 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66  &pObjName);.  if
1d4f0 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e  ( iDb<0 ) return
1d500 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e  ;.  z = sqlite3N
1d510 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
1d520 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66   pObjName);.  if
1d530 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
1d540 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  zDb = db->aDb
1d550 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70  [iDb].zName;.  p
1d560 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Tab = sqlite3Fin
1d570 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44  dTable(db, z, zD
1d580 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29  b);.  if( pTab )
1d590 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61 62  {.    reindexTab
1d5a0 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  le(pParse, pTab,
1d5b0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1d5c0 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
1d5d0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1d5e0 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
1d5f0 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
1d600 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , zDb);.  sqlite
1d610 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
1d620 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
1d630 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
1d640 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
1d650 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
1d660 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
1d670 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
1d680 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20  Index, -1);.    
1d690 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
1d6a0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1d6b0 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f  arse, "unable to
1d6c0 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f 62   identify the ob
1d6d0 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e 64  ject to be reind
1d6e0 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66  exed");.}.#endif
1d6f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1d700 20 64 79 6e 61 6d 69 63 6c 79 20 61 6c 6c 6f 63   dynamicly alloc
1d710 61 74 65 64 20 4b 65 79 49 6e 66 6f 20 73 74 72  ated KeyInfo str
1d720 75 63 74 75 72 65 20 74 68 61 74 20 63 61 6e 20  ucture that can 
1d730 62 65 20 75 73 65 64 0a 2a 2a 20 77 69 74 68 20  be used.** with 
1d740 4f 50 5f 4f 70 65 6e 52 65 61 64 20 6f 72 20 4f  OP_OpenRead or O
1d750 50 5f 4f 70 65 6e 57 72 69 74 65 20 74 6f 20 61  P_OpenWrite to a
1d760 63 63 65 73 73 20 64 61 74 61 62 61 73 65 20 69  ccess database i
1d770 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a  ndex pIdx..**.**
1d780 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1d790 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1d7a0 20 6e 65 77 20 73 74 72 75 63 74 75 72 65 20 69   new structure i
1d7b0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74  s returned. In t
1d7c0 68 69 73 20 63 61 73 65 0a 2a 2a 20 74 68 65 20  his case.** the 
1d7d0 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
1d7e0 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e  sible for callin
1d7f0 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  g sqlite3DbFree(
1d800 64 62 2c 20 29 20 6f 6e 20 74 68 65 20 72 65 74  db, ) on the ret
1d810 75 72 6e 65 64 20 0a 2a 2a 20 70 6f 69 6e 74 65  urned .** pointe
1d820 72 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  r. If an error o
1d830 63 63 75 72 73 20 28 6f 75 74 20 6f 66 20 6d 65  ccurs (out of me
1d840 6d 6f 72 79 20 6f 72 20 6d 69 73 73 69 6e 67 20  mory or missing 
1d850 63 6f 6c 6c 61 74 69 6f 6e 20 0a 2a 2a 20 73 65  collation .** se
1d860 71 75 65 6e 63 65 29 2c 20 4e 55 4c 4c 20 69 73  quence), NULL is
1d870 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
1d880 65 20 73 74 61 74 65 20 6f 66 20 70 50 61 72 73  e state of pPars
1d890 65 20 75 70 64 61 74 65 64 20 74 6f 20 72 65 66  e updated to ref
1d8a0 6c 65 63 74 0a 2a 2a 20 74 68 65 20 65 72 72 6f  lect.** the erro
1d8b0 72 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73  r..*/.KeyInfo *s
1d8c0 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
1d8d0 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
1d8e0 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  , Index *pIdx){.
1d8f0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
1d900 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c  Col = pIdx->nCol
1d910 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  umn;.  int nByte
1d920 73 20 3d 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e  s = sizeof(KeyIn
1d930 66 6f 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73  fo) + (nCol-1)*s
1d940 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20  izeof(CollSeq*) 
1d950 2b 20 6e 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65  + nCol;.  sqlite
1d960 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1d970 64 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  db;.  KeyInfo *p
1d980 4b 65 79 20 3d 20 28 4b 65 79 49 6e 66 6f 20 2a  Key = (KeyInfo *
1d990 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
1d9a0 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 73 29  Zero(db, nBytes)
1d9b0 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b  ;..  if( pKey ){
1d9c0 0a 20 20 20 20 70 4b 65 79 2d 3e 64 62 20 3d 20  .    pKey->db = 
1d9d0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20  pParse->db;.    
1d9e0 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pKey->aSortOrder
1d9f0 20 3d 20 28 75 38 20 2a 29 26 28 70 4b 65 79 2d   = (u8 *)&(pKey-
1da00 3e 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20  >aColl[nCol]);. 
1da10 20 20 20 61 73 73 65 72 74 28 20 26 70 4b 65 79     assert( &pKey
1da20 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f  ->aSortOrder[nCo
1da30 6c 5d 3d 3d 26 28 28 28 75 38 20 2a 29 70 4b 65  l]==&(((u8 *)pKe
1da40 79 29 5b 6e 42 79 74 65 73 5d 29 20 29 3b 0a 20  y)[nBytes]) );. 
1da50 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
1da60 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
1da70 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49  char *zColl = pI
1da80 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20  dx->azColl[i];. 
1da90 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 43 6f       assert( zCo
1daa0 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 4b 65 79  ll );.      pKey
1dab0 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c  ->aColl[i] = sql
1dac0 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
1dad0 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29  q(pParse, zColl)
1dae0 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53  ;.      pKey->aS
1daf0 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49  ortOrder[i] = pI
1db00 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  dx->aSortOrder[i
1db10 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65  ];.    }.    pKe
1db20 79 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36  y->nField = (u16
1db30 29 6e 43 6f 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66  )nCol;.  }..  if
1db40 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
1db50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
1db60 72 65 65 28 64 62 2c 20 70 4b 65 79 29 3b 0a 20  ree(db, pKey);. 
1db70 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20 7d     pKey = 0;.  }
1db80 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a  .  return pKey;.
1db90 7d 0a                                            }.