/ Hex Artifact Content
Login

Artifact 7926e17a5dc3f698dd8b15511a4902f48c73ac50:


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 61 73 73 65 72 74 28 20   *v;..  assert( 
0f40: 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65  pParse->pTopleve
0f50: 6c 3d 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  l==0 );.  db = p
0f60: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
0f70: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
0f80: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
0f90: 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  ( pParse->nested
0fa0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
0fb0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
0fc0: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65  return;..  /* Be
0fd0: 67 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e  gin by generatin
0fe0: 67 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69  g some terminati
0ff0: 6f 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20 65  on code at the e
1000: 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76  nd of the.  ** v
1010: 64 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f  dbe program.  */
1020: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1030: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1040: 20 61 73 73 65 72 74 28 20 21 70 50 61 72 73 65   assert( !pParse
1050: 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a  ->isMultiWrite .
1060: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
1070: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
1080: 6f 72 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d  ort(v, pParse->m
1090: 61 79 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28  ayAbort));.  if(
10a0: 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
10b0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
10c0: 50 5f 48 61 6c 74 29 3b 0a 0a 20 20 20 20 2f 2a  P_Halt);..    /*
10d0: 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b   The cookie mask
10e0: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69   contains one bi
10f0: 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62  t for each datab
1100: 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20  ase file open.. 
1110: 20 20 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20     ** (Bit 0 is 
1120: 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20  for main, bit 1 
1130: 69 73 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64  is for temp, and
1140: 20 73 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74   so forth.)  Bit
1150: 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74  s are.    ** set
1160: 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61   for each databa
1170: 73 65 20 74 68 61 74 20 69 73 20 75 73 65 64 2e  se that is used.
1180: 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20    Generate code 
1190: 74 6f 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a  to start a.    *
11a0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  * transaction on
11b0: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
11c0: 61 73 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66  ase and to verif
11d0: 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  y the schema coo
11e0: 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61  kie.    ** on ea
11f0: 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65  ch used database
1200: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1210: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
1220: 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 79  oto>0 ){.      y
1230: 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 20  DbMask mask;.   
1240: 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
1250: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1260: 70 48 65 72 65 28 76 2c 20 70 50 61 72 73 65 2d  pHere(v, pParse-
1270: 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31 29 3b 0a  >cookieGoto-1);.
1280: 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30 2c        for(iDb=0,
1290: 20 6d 61 73 6b 3d 31 3b 20 69 44 62 3c 64 62 2d   mask=1; iDb<db-
12a0: 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20  >nDb; mask<<=1, 
12b0: 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  iDb++){.        
12c0: 69 66 28 20 28 6d 61 73 6b 20 26 20 70 50 61 72  if( (mask & pPar
12d0: 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d  se->cookieMask)=
12e0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
12f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1300: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
1310: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
1320: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1330: 2c 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c  ,OP_Transaction,
1340: 20 69 44 62 2c 20 28 6d 61 73 6b 20 26 20 70 50   iDb, (mask & pP
1350: 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 29  arse->writeMask)
1360: 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  !=0);.        if
1370: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
1380: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1390: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
13a0: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
13b0: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
13c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
13e0: 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 0a 20 20  VerifyCookie,.  
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1400: 20 20 20 20 20 20 20 20 20 20 69 44 62 2c 20 70            iDb, p
1410: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c  Parse->cookieVal
1420: 75 65 5b 69 44 62 5d 2c 0a 20 20 20 20 20 20 20  ue[iDb],.       
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1440: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
1450: 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65  ].pSchema->iGene
1460: 72 61 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20  ration);.       
1470: 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64   }.      }.#ifnd
1480: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1490: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
14a0: 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20    {.        int 
14b0: 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  i;.        for(i
14c0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56  =0; i<pParse->nV
14d0: 74 61 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20  tabLock; i++){. 
14e0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 76           char *v
14f0: 74 61 62 20 3d 20 28 63 68 61 72 20 2a 29 73 71  tab = (char *)sq
1500: 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
1510: 62 2c 20 70 50 61 72 73 65 2d 3e 61 70 56 74 61  b, pParse->apVta
1520: 62 4c 6f 63 6b 5b 69 5d 29 3b 0a 20 20 20 20 20  bLock[i]);.     
1530: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1540: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 42 65  AddOp4(v, OP_VBe
1550: 67 69 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 76 74  gin, 0, 0, 0, vt
1560: 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20  ab, P4_VTAB);.  
1570: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1580: 70 50 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63  pParse->nVtabLoc
1590: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  k = 0;.      }.#
15a0: 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20  endif..      /* 
15b0: 4f 6e 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f  Once all the coo
15c0: 6b 69 65 73 20 68 61 76 65 20 62 65 65 6e 20 76  kies have been v
15d0: 65 72 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e  erified and tran
15e0: 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c  sactions opened,
15f0: 20 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69   .      ** obtai
1600: 6e 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  n the required t
1610: 61 62 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73  able-locks. This
1620: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65   is a no-op unle
1630: 73 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ss the .      **
1640: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 66 65   shared-cache fe
1650: 61 74 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64  ature is enabled
1660: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1670: 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28   codeTableLocks(
1680: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1690: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e  /* Initialize an
16a0: 79 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  y AUTOINCREMENT 
16b0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
16c0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20  required..      
16d0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
16e0: 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67  AutoincrementBeg
16f0: 69 6e 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20  in(pParse);..   
1700: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1710: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1720: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1730: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1740: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1750: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1760: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72  OP_Goto, 0, pPar
1770: 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29 3b  se->cookieGoto);
1780: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
1790: 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20 70  * Get the VDBE p
17a0: 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72  rogram ready for
17b0: 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a   execution.  */.
17c0: 20 20 69 66 28 20 76 20 26 26 20 41 4c 57 41 59    if( v && ALWAY
17d0: 53 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  S(pParse->nErr==
17e0: 30 29 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  0) && !db->mallo
17f0: 63 46 61 69 6c 65 64 20 29 7b 0a 23 69 66 64 65  cFailed ){.#ifde
1800: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1810: 20 20 20 46 49 4c 45 20 2a 74 72 61 63 65 20 3d     FILE *trace =
1820: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
1830: 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 29 21  LITE_VdbeTrace)!
1840: 3d 30 20 3f 20 73 74 64 6f 75 74 20 3a 20 30 3b  =0 ? stdout : 0;
1850: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1860: 54 72 61 63 65 28 76 2c 20 74 72 61 63 65 29 3b  Trace(v, trace);
1870: 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
1880: 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63  rt( pParse->iCac
1890: 68 65 4c 65 76 65 6c 3d 3d 30 20 29 3b 20 20 2f  heLevel==0 );  /
18a0: 2a 20 44 69 73 61 62 6c 65 73 20 61 6e 64 20 72  * Disables and r
18b0: 65 2d 65 6e 61 62 6c 65 73 20 6d 61 74 63 68 20  e-enables match 
18c0: 2a 2f 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e 69  */.    /* A mini
18d0: 6d 75 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73 6f  mum of one curso
18e0: 72 20 69 73 20 72 65 71 75 69 72 65 64 20 69 66  r is required if
18f0: 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 69   autoincrement i
1900: 73 20 75 73 65 64 0a 20 20 20 20 2a 20 20 53 65  s used.    *  Se
1910: 65 20 74 69 63 6b 65 74 20 5b 61 36 39 36 33 37  e ticket [a69637
1920: 39 63 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20 20  9c1f08866] */.  
1930: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 41    if( pParse->pA
1940: 69 6e 63 21 3d 30 20 26 26 20 70 50 61 72 73 65  inc!=0 && pParse
1950: 2d 3e 6e 54 61 62 3d 3d 30 20 29 20 70 50 61 72  ->nTab==0 ) pPar
1960: 73 65 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20  se->nTab = 1;.  
1970: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b    sqlite3VdbeMak
1980: 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73 65  eReady(v, pParse
1990: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  );.    pParse->r
19a0: 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
19b0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c  .    pParse->col
19c0: 4e 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20  NamesSet = 0;.  
19d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73  }else{.    pPars
19e0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
19f0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72  RROR;.  }.  pPar
1a00: 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20  se->nTab = 0;.  
1a10: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30  pParse->nMem = 0
1a20: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74  ;.  pParse->nSet
1a30: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
1a40: 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72  nVar = 0;.  pPar
1a50: 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d  se->cookieMask =
1a60: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f   0;.  pParse->co
1a70: 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a  okieGoto = 0;.}.
1a80: 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70  ./*.** Run the p
1a90: 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67  arser and code g
1aa0: 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73 69  enerator recursi
1ab0: 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  vely in order to
1ac0: 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64   generate.** cod
1ad0: 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74  e for the SQL st
1ae0: 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e  atement given on
1af0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1b00: 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74  e pParse context
1b10: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
1b20: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1b30: 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61 72 73  .  When the pars
1b40: 65 72 20 69 73 20 72 75 6e 20 72 65 63 75 72 73  er is run recurs
1b50: 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61  ively.** this wa
1b60: 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f  y, the final OP_
1b70: 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65  Halt is not appe
1b80: 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69  nded and other i
1b90: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a  nitialization.**
1ba0: 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f   and finalizatio
1bb0: 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74  n steps are omit
1bc0: 74 65 64 20 62 65 63 61 75 73 65 20 74 68 6f 73  ted because thos
1bd0: 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62  e are handling b
1be0: 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f  y the.** outermo
1bf0: 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a  st parser..**.**
1c00: 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20   Not everything 
1c10: 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68  is nestable.  Th
1c20: 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 64  is facility is d
1c30: 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69  esigned to permi
1c40: 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44  t.** INSERT, UPD
1c50: 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20  ATE, and DELETE 
1c60: 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e  operations again
1c70: 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  st SQLITE_MASTER
1c80: 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69  .  Use.** care i
1c90: 66 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20  f you decide to 
1ca0: 74 72 79 20 74 6f 20 75 73 65 20 74 68 69 73 20  try to use this 
1cb0: 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65  routine for some
1cc0: 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e   other purposes.
1cd0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1ce0: 4e 65 73 74 65 64 50 61 72 73 65 28 50 61 72 73  NestedParse(Pars
1cf0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
1d00: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
1d10: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
1d20: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  ap;.  char *zSql
1d30: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
1d40: 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  g = 0;.  sqlite3
1d50: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1d60: 62 3b 0a 23 20 64 65 66 69 6e 65 20 53 41 56 45  b;.# define SAVE
1d70: 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28 50 61 72  _SZ  (sizeof(Par
1d80: 73 65 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 50  se) - offsetof(P
1d90: 61 72 73 65 2c 6e 56 61 72 29 29 0a 20 20 63 68  arse,nVar)).  ch
1da0: 61 72 20 73 61 76 65 42 75 66 5b 53 41 56 45 5f  ar saveBuf[SAVE_
1db0: 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  SZ];..  if( pPar
1dc0: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
1dd0: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  n;.  assert( pPa
1de0: 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29  rse->nested<10 )
1df0: 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68  ;  /* Nesting sh
1e00: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20  ould only be of 
1e10: 6c 69 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f  limited depth */
1e20: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
1e30: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c  zFormat);.  zSql
1e40: 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e   = sqlite3VMPrin
1e50: 74 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20  tf(db, zFormat, 
1e60: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
1e70: 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  );.  if( zSql==0
1e80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20   ){.    return; 
1e90: 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75    /* A malloc mu
1ea0: 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a  st have failed *
1eb0: 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  /.  }.  pParse->
1ec0: 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63  nested++;.  memc
1ed0: 70 79 28 73 61 76 65 42 75 66 2c 20 26 70 50 61  py(saveBuf, &pPa
1ee0: 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45 5f  rse->nVar, SAVE_
1ef0: 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  SZ);.  memset(&p
1f00: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c 20  Parse->nVar, 0, 
1f10: 53 41 56 45 5f 53 5a 29 3b 0a 20 20 73 71 6c 69  SAVE_SZ);.  sqli
1f20: 74 65 33 52 75 6e 50 61 72 73 65 72 28 70 50 61  te3RunParser(pPa
1f30: 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72  rse, zSql, &zErr
1f40: 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Msg);.  sqlite3D
1f50: 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73  bFree(db, zErrMs
1f60: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
1f70: 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20  ree(db, zSql);. 
1f80: 20 6d 65 6d 63 70 79 28 26 70 50 61 72 73 65 2d   memcpy(&pParse-
1f90: 3e 6e 56 61 72 2c 20 73 61 76 65 42 75 66 2c 20  >nVar, saveBuf, 
1fa0: 53 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72  SAVE_SZ);.  pPar
1fb0: 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a  se->nested--;.}.
1fc0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
1fd0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75  e in-memory stru
1fe0: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
1ff0: 69 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61  ibes a particula
2000: 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61  r database.** ta
2010: 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61  ble given the na
2020: 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65  me of that table
2030: 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79   and (optionally
2040: 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  ) the name of th
2050: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  e.** database co
2060: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
2070: 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  le.  Return NULL
2080: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
2090: 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73  *.** If zDatabas
20a0: 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61  e is 0, all data
20b0: 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68  bases are search
20c0: 65 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ed for the table
20d0: 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73   and the.** firs
20e0: 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65  t matching table
20f0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28   is returned.  (
2100: 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  No checking for 
2110: 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a  duplicate table.
2120: 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65  ** names is done
2130: 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f  .)  The search o
2140: 72 64 65 72 20 69 73 20 54 45 4d 50 20 66 69 72  rder is TEMP fir
2150: 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74  st, then MAIN, t
2160: 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c  hen any.** auxil
2170: 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61  iary databases a
2180: 64 64 65 64 20 75 73 69 6e 67 20 74 68 65 20 41  dded using the A
2190: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TTACH command..*
21a0: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
21b0: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
21c0: 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  ()..*/.Table *sq
21d0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73  lite3FindTable(s
21e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
21f0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63  t char *zName, c
2200: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61  onst char *zData
2210: 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  base){.  Table *
2220: 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  p = 0;.  int i;.
2230: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 61    int nName;.  a
2240: 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20  ssert( zName!=0 
2250: 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c  );.  nName = sql
2260: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
2270: 6d 65 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75  me);.  /* All mu
2280: 74 65 78 65 73 20 61 72 65 20 72 65 71 75 69 72  texes are requir
2290: 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63  ed for schema ac
22a0: 63 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65  cess.  Make sure
22b0: 20 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a   we hold them. *
22c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 44 61 74  /.  assert( zDat
22d0: 61 62 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69  abase!=0 || sqli
22e0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c  te3BtreeHoldsAll
22f0: 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20  Mutexes(db) );. 
2300: 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50   for(i=OMIT_TEMP
2310: 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  DB; i<db->nDb; i
2320: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d  ++){.    int j =
2330: 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69   (i<2) ? i^1 : i
2340: 3b 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45  ;   /* Search TE
2350: 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a  MP before MAIN *
2360: 2f 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 62  /.    if( zDatab
2370: 61 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65  ase!=0 && sqlite
2380: 33 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61  3StrICmp(zDataba
2390: 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a  se, db->aDb[j].z
23a0: 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  Name) ) continue
23b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
23c0: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
23d0: 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29  Held(db, j, 0) )
23e0: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
23f0: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
2400: 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74  Db[j].pSchema->t
2410: 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e  blHash, zName, n
2420: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Name);.    if( p
2430: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
2440: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
2450: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
2460: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
2470: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
2480: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
2490: 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20  tabase.** table 
24a0: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
24b0: 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64  f that table and
24c0: 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68   (optionally) th
24d0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
24e0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
24f0: 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ning the table. 
2500: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
2510: 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f  not found.  Also
2520: 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72   leave an.** err
2530: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
2540: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
2550: 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
2560: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
2570: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c   routine and sql
2580: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20  ite3FindTable() 
2590: 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20  is that this.** 
25a0: 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61  routine leaves a
25b0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
25c0: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
25d0: 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69  sg where.** sqli
25e0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64  te3FindTable() d
25f0: 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c  oes not..*/.Tabl
2600: 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  e *sqlite3Locate
2610: 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a  Table(.  Parse *
2620: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
2630: 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68  /* context in wh
2640: 69 63 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72  ich to report er
2650: 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73  rors */.  int is
2660: 56 69 65 77 2c 20 20 20 20 20 20 20 20 20 20 20  View,           
2670: 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b   /* True if look
2680: 69 6e 67 20 66 6f 72 20 61 20 56 49 45 57 20 72  ing for a VIEW r
2690: 61 74 68 65 72 20 74 68 61 6e 20 61 20 54 41 42  ather than a TAB
26a0: 4c 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  LE */.  const ch
26b0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f  ar *zName,     /
26c0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
26d0: 62 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  ble we are looki
26e0: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73  ng for */.  cons
26f0: 74 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20  t char *zDbase  
2700: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2710: 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67  e database.  Mig
2720: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
2730: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20  .  Table *p;..  
2740: 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
2750: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
2760: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2770: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
2780: 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
2790: 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
27a0: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
27b0: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
27c0: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
27d0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
27e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
27f0: 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74    }..  p = sqlit
2800: 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  e3FindTable(pPar
2810: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  se->db, zName, z
2820: 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  Dbase);.  if( p=
2830: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
2840: 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56  char *zMsg = isV
2850: 69 65 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76  iew ? "no such v
2860: 69 65 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20  iew" : "no such 
2870: 74 61 62 6c 65 22 3b 0a 20 20 20 20 69 66 28 20  table";.    if( 
2880: 7a 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  zDbase ){.      
2890: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
28a0: 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e  pParse, "%s: %s.
28b0: 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73  %s", zMsg, zDbas
28c0: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e, zName);.    }
28d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
28e0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
28f0: 73 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d  se, "%s: %s", zM
2900: 73 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  sg, zName);.    
2910: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68  }.    pParse->ch
2920: 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
2930: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
2940: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
2950: 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66  he table identif
2960: 69 65 64 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a  ied by *p..**.**
2970: 20 54 68 69 73 20 69 73 20 61 20 77 72 61 70 70   This is a wrapp
2980: 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
2990: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 20  3LocateTable(). 
29a0: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
29b0: 65 74 77 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65  etween.** sqlite
29c0: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 20 61  3LocateTable() a
29d0: 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
29e0: 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75   is that this fu
29f0: 6e 63 74 69 6f 6e 20 72 65 73 74 72 69 63 74 73  nction restricts
2a00: 0a 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20 74  .** the search t
2a10: 6f 20 73 63 68 65 6d 61 20 28 70 2d 3e 70 53 63  o schema (p->pSc
2a20: 68 65 6d 61 29 20 69 66 20 69 74 20 69 73 20 6e  hema) if it is n
2a30: 6f 74 20 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68  ot NULL. p->pSch
2a40: 65 6d 61 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f  ema may be.** no
2a50: 6e 2d 4e 55 4c 4c 20 69 66 20 69 74 20 69 73 20  n-NULL if it is 
2a60: 70 61 72 74 20 6f 66 20 61 20 76 69 65 77 20 6f  part of a view o
2a70: 72 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  r trigger progra
2a80: 6d 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65  m definition. Se
2a90: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53  e.** sqlite3FixS
2aa0: 72 63 4c 69 73 74 28 29 20 66 6f 72 20 64 65 74  rcList() for det
2ab0: 61 69 6c 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  ails..*/.Table *
2ac0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
2ad0: 6c 65 49 74 65 6d 28 0a 20 20 50 61 72 73 65 20  leItem(.  Parse 
2ae0: 2a 70 50 61 72 73 65 2c 20 0a 20 20 69 6e 74 20  *pParse, .  int 
2af0: 69 73 56 69 65 77 2c 20 0a 20 20 73 74 72 75 63  isView, .  struc
2b00: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2b10: 70 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  p.){.  const cha
2b20: 72 20 2a 7a 44 62 3b 0a 20 20 61 73 73 65 72 74  r *zDb;.  assert
2b30: 28 20 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20  ( p->pSchema==0 
2b40: 7c 7c 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d  || p->zDatabase=
2b50: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
2b60: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e  Schema ){.    in
2b70: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
2b80: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
2b90: 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68  rse->db, p->pSch
2ba0: 65 6d 61 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20  ema);.    zDb = 
2bb0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
2bc0: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 65  iDb].zName;.  }e
2bd0: 6c 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20 70  lse{.    zDb = p
2be0: 2d 3e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7d  ->zDatabase;.  }
2bf0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2c00: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
2c10: 72 73 65 2c 20 69 73 56 69 65 77 2c 20 70 2d 3e  rse, isView, p->
2c20: 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a  zName, zDb);.}..
2c30: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
2c40: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
2c50: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
2c60: 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63  bes .** a partic
2c70: 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e  ular index given
2c80: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
2c90: 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  t index.** and t
2ca0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
2cb0: 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e  atabase that con
2cc0: 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e  tains the index.
2cd0: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
2ce0: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
2cf0: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
2d00: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
2d10: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
2d20: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62  d for the.** tab
2d30: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  le and the first
2d40: 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20   matching index 
2d50: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
2d60: 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f  o checking.** fo
2d70: 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65  r duplicate inde
2d80: 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  x names is done.
2d90: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
2da0: 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66  der is.** TEMP f
2db0: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2dc0: 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69   then any auxili
2dd0: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
2de0: 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ded.** using the
2df0: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
2e00: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
2e10: 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69  e3FindIndex(sqli
2e20: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
2e30: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
2e40: 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
2e50: 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20  Index *p = 0;.  
2e60: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61  int i;.  int nNa
2e70: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2e80: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 2f  en30(zName);.  /
2e90: 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72  * All mutexes ar
2ea0: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  e required for s
2eb0: 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d  chema access.  M
2ec0: 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64  ake sure we hold
2ed0: 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65   them. */.  asse
2ee0: 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73 71  rt( zDb!=0 || sq
2ef0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
2f00: 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b  llMutexes(db) );
2f10: 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45  .  for(i=OMIT_TE
2f20: 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  MPDB; i<db->nDb;
2f30: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
2f40: 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a   = (i<2) ? i^1 :
2f50: 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54   i;  /* Search T
2f60: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
2f70: 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  */.    Schema *p
2f80: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
2f90: 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20  [j].pSchema;.   
2fa0: 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d 61   assert( pSchema
2fb0: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20   );.    if( zDb 
2fc0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2fd0: 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a  p(zDb, db->aDb[j
2fe0: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
2ff0: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
3000: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3010: 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30  texHeld(db, j, 0
3020: 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  ) );.    p = sql
3030: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 53  ite3HashFind(&pS
3040: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
3050: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
3060: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
3070: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
3080: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61  ;.}../*.** Recla
3090: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73  im the memory us
30a0: 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a  ed by an index.*
30b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
30c0: 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  eeIndex(sqlite3 
30d0: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a  *db, Index *p){.
30e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
30f0: 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71  MIT_ANALYZE.  sq
3100: 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78  lite3DeleteIndex
3110: 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a  Samples(db, p);.
3120: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
3130: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
3140: 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 29  ->pPartIdxWhere)
3150: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
3160: 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66  e(db, p->zColAff
3170: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
3180: 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
3190: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65  .** For the inde
31a0: 78 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d  x called zIdxNam
31b0: 65 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64  e which is found
31c0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
31d0: 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20   iDb,.** unlike 
31e0: 74 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20  that index from 
31f0: 69 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72  its Table then r
3200: 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20  emove the index 
3210: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65  from.** the inde
3220: 78 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64  x hash table and
3230: 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   free all memory
3240: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
3250: 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
3260: 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69  he index..*/.voi
3270: 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41  d sqlite3UnlinkA
3280: 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71  ndDeleteIndex(sq
3290: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
32a0: 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Db, const char *
32b0: 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64  zIdxName){.  Ind
32c0: 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ex *pIndex;.  in
32d0: 74 20 6c 65 6e 3b 0a 20 20 48 61 73 68 20 2a 70  t len;.  Hash *p
32e0: 48 61 73 68 3b 0a 0a 20 20 61 73 73 65 72 74 28  Hash;..  assert(
32f0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3300: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
3310: 20 30 29 20 29 3b 0a 20 20 70 48 61 73 68 20 3d   0) );.  pHash =
3320: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70   &db->aDb[iDb].p
3330: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b  Schema->idxHash;
3340: 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33  .  len = sqlite3
3350: 53 74 72 6c 65 6e 33 30 28 7a 49 64 78 4e 61 6d  Strlen30(zIdxNam
3360: 65 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73  e);.  pIndex = s
3370: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
3380: 28 70 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65  (pHash, zIdxName
3390: 2c 20 6c 65 6e 2c 20 30 29 3b 0a 20 20 69 66 28  , len, 0);.  if(
33a0: 20 41 4c 57 41 59 53 28 70 49 6e 64 65 78 29 20   ALWAYS(pIndex) 
33b0: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  ){.    if( pInde
33c0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
33d0: 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  x==pIndex ){.   
33e0: 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c     pIndex->pTabl
33f0: 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  e->pIndex = pInd
3400: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ex->pNext;.    }
3410: 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
3420: 78 20 2a 70 3b 0a 20 20 20 20 20 20 2f 2a 20 4a  x *p;.      /* J
3430: 75 73 74 69 66 69 63 61 74 69 6f 6e 20 6f 66 20  ustification of 
3440: 41 4c 57 41 59 53 28 29 3b 20 20 54 68 65 20 69  ALWAYS();  The i
3450: 6e 64 65 78 20 6d 75 73 74 20 62 65 20 6f 6e 20  ndex must be on 
3460: 74 68 65 20 6c 69 73 74 20 6f 66 0a 20 20 20 20  the list of.    
3470: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 2a 2f    ** indices. */
3480: 0a 20 20 20 20 20 20 70 20 3d 20 70 49 6e 64 65  .      p = pInde
3490: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
34a0: 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  x;.      while( 
34b0: 41 4c 57 41 59 53 28 70 29 20 26 26 20 70 2d 3e  ALWAYS(p) && p->
34c0: 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 20 29 7b  pNext!=pIndex ){
34d0: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 20 7d   p = p->pNext; }
34e0: 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
34f0: 53 28 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d  S(p && p->pNext=
3500: 3d 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20  =pIndex) ){.    
3510: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
3520: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
3530: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
3540: 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49  freeIndex(db, pI
3550: 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d  ndex);.  }.  db-
3560: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
3570: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
3580: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 74 68  }../*.** Look th
3590: 72 6f 75 67 68 20 74 68 65 20 6c 69 73 74 20 6f  rough the list o
35a0: 66 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  f open database 
35b0: 66 69 6c 65 73 20 69 6e 20 64 62 2d 3e 61 44 62  files in db->aDb
35c0: 5b 5d 20 61 6e 64 20 69 66 0a 2a 2a 20 61 6e 79  [] and if.** any
35d0: 20 68 61 76 65 20 62 65 65 6e 20 63 6c 6f 73 65   have been close
35e0: 64 2c 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66  d, remove them f
35f0: 72 6f 6d 20 74 68 65 20 6c 69 73 74 2e 20 20 52  rom the list.  R
3600: 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 0a 2a 2a  eallocate the.**
3610: 20 64 62 2d 3e 61 44 62 5b 5d 20 73 74 72 75 63   db->aDb[] struc
3620: 74 75 72 65 20 74 6f 20 61 20 73 6d 61 6c 6c 65  ture to a smalle
3630: 72 20 73 69 7a 65 2c 20 69 66 20 70 6f 73 73 69  r size, if possi
3640: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 79  ble..**.** Entry
3650: 20 30 20 28 74 68 65 20 22 6d 61 69 6e 22 20 64   0 (the "main" d
3660: 61 74 61 62 61 73 65 29 20 61 6e 64 20 65 6e 74  atabase) and ent
3670: 72 79 20 31 20 28 74 68 65 20 22 74 65 6d 70 22  ry 1 (the "temp"
3680: 20 64 61 74 61 62 61 73 65 29 0a 2a 2a 20 61 72   database).** ar
3690: 65 20 6e 65 76 65 72 20 63 61 6e 64 69 64 61 74  e never candidat
36a0: 65 73 20 66 6f 72 20 62 65 69 6e 67 20 63 6f 6c  es for being col
36b0: 6c 61 70 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  lapsed..*/.void 
36c0: 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44  sqlite3CollapseD
36d0: 61 74 61 62 61 73 65 41 72 72 61 79 28 73 71 6c  atabaseArray(sql
36e0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
36f0: 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a   i, j;.  for(i=j
3700: 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =2; i<db->nDb; i
3710: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
3720: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
3730: 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
3740: 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20  Db->pBt==0 ){.  
3750: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
3760: 65 28 64 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65  e(db, pDb->zName
3770: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  );.      pDb->zN
3780: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  ame = 0;.      c
3790: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
37a0: 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20     if( j<i ){.  
37b0: 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d      db->aDb[j] =
37c0: 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20   db->aDb[i];.   
37d0: 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a   }.    j++;.  }.
37e0: 20 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61 44    memset(&db->aD
37f0: 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e 44  b[j], 0, (db->nD
3800: 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b-j)*sizeof(db->
3810: 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e  aDb[j]));.  db->
3820: 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64  nDb = j;.  if( d
3830: 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d  b->nDb<=2 && db-
3840: 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61  >aDb!=db->aDbSta
3850: 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  tic ){.    memcp
3860: 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c  y(db->aDbStatic,
3870: 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65   db->aDb, 2*size
3880: 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b  of(db->aDb[0]));
3890: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
38a0: 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 29 3b  ee(db, db->aDb);
38b0: 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64  .    db->aDb = d
38c0: 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20  b->aDbStatic;.  
38d0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74  }.}../*.** Reset
38e0: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
38f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
3900: 69 6e 64 65 78 20 69 44 62 2e 20 20 41 6c 73 6f  index iDb.  Also
3910: 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 54 45   reset the.** TE
3920: 4d 50 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 76 6f  MP schema..*/.vo
3930: 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 4f  id sqlite3ResetO
3940: 6e 65 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33  neSchema(sqlite3
3950: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a   *db, int iDb){.
3960: 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 61 73 73    Db *pDb;.  ass
3970: 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62  ert( iDb<db->nDb
3980: 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 73 65 20 31   );..  /* Case 1
3990: 3a 20 20 52 65 73 65 74 20 74 68 65 20 73 69 6e  :  Reset the sin
39a0: 67 6c 65 20 73 63 68 65 6d 61 20 69 64 65 6e 74  gle schema ident
39b0: 69 66 69 65 64 20 62 79 20 69 44 62 20 2a 2f 0a  ified by iDb */.
39c0: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
39d0: 5b 69 44 62 5d 3b 0a 20 20 61 73 73 65 72 74 28  [iDb];.  assert(
39e0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
39f0: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
3a00: 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28   0) );.  assert(
3a10: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d 30   pDb->pSchema!=0
3a20: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 68   );.  sqlite3Sch
3a30: 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53  emaClear(pDb->pS
3a40: 63 68 65 6d 61 29 3b 0a 0a 20 20 2f 2a 20 49 66  chema);..  /* If
3a50: 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 6f 74   any database ot
3a60: 68 65 72 20 74 68 61 6e 20 54 45 4d 50 20 69 73  her than TEMP is
3a70: 20 72 65 73 65 74 2c 20 74 68 65 6e 20 61 6c 73   reset, then als
3a80: 6f 20 72 65 73 65 74 20 54 45 4d 50 0a 20 20 2a  o reset TEMP.  *
3a90: 2a 20 73 69 6e 63 65 20 54 45 4d 50 20 6d 69 67  * since TEMP mig
3aa0: 68 74 20 62 65 20 68 6f 6c 64 69 6e 67 20 74 72  ht be holding tr
3ab0: 69 67 67 65 72 73 20 74 68 61 74 20 72 65 66 65  iggers that refe
3ac0: 72 65 6e 63 65 20 74 61 62 6c 65 73 20 69 6e 20  rence tables in 
3ad0: 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 64  the.  ** other d
3ae0: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
3af0: 69 66 28 20 69 44 62 21 3d 31 20 29 7b 0a 20 20  if( iDb!=1 ){.  
3b00: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
3b10: 5b 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [1];.    assert(
3b20: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d 30   pDb->pSchema!=0
3b30: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   );.    sqlite3S
3b40: 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e  chemaClear(pDb->
3b50: 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20  pSchema);.  }.  
3b60: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
3b70: 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d   Erase all schem
3b80: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  a information fr
3b90: 6f 6d 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  om all attached 
3ba0: 64 61 74 61 62 61 73 65 73 20 28 69 6e 63 6c 75  databases (inclu
3bb0: 64 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e 22 20 61  ding.** "main" a
3bc0: 6e 64 20 22 74 65 6d 70 22 29 20 66 6f 72 20 61  nd "temp") for a
3bd0: 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
3be0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
3bf0: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65  void sqlite3Rese
3c00: 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e  tAllSchemasOfCon
3c10: 6e 65 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20  nection(sqlite3 
3c20: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *db){.  int i;. 
3c30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
3c40: 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72  erAll(db);.  for
3c50: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
3c60: 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70   i++){.    Db *p
3c70: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
3c80: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
3c90: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
3ca0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65  sqlite3SchemaCle
3cb0: 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29  ar(pDb->pSchema)
3cc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62  ;.    }.  }.  db
3cd0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
3ce0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
3cf0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55  ;.  sqlite3VtabU
3d00: 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20  nlockList(db);. 
3d10: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
3d20: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c  veAll(db);.  sql
3d30: 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61  ite3CollapseData
3d40: 62 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 7d  baseArray(db);.}
3d50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
3d60: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
3d70: 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63  hen a commit occ
3d80: 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  urs..*/.void sql
3d90: 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  ite3CommitIntern
3da0: 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  alChanges(sqlite
3db0: 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c  3 *db){.  db->fl
3dc0: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
3dd0: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a  nternChanges;.}.
3de0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 6d 65  ./*.** Delete me
3df0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 66  mory allocated f
3e00: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  or the column na
3e10: 6d 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  mes of a table o
3e20: 72 20 76 69 65 77 20 28 74 68 65 0a 2a 2a 20 54  r view (the.** T
3e30: 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61 72 72 61  able.aCol[] arra
3e40: 79 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  y)..*/.static vo
3e50: 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 43  id sqliteDeleteC
3e60: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 73 71 6c 69 74  olumnNames(sqlit
3e70: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
3e80: 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Table){.  int i;
3e90: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
3ea0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
3eb0: 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70  e!=0 );.  if( (p
3ec0: 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43  Col = pTable->aC
3ed0: 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f  ol)!=0 ){.    fo
3ee0: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d  r(i=0; i<pTable-
3ef0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
3f00: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
3f10: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
3f20: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
3f30: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
3f40: 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66  te(db, pCol->pDf
3f50: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
3f60: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
3f70: 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 20  l->zDflt);.     
3f80: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3f90: 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b  b, pCol->zType);
3fa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
3fb0: 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a  Free(db, pCol->z
3fc0: 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Coll);.    }.   
3fd0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3fe0: 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29  b, pTable->aCol)
3ff0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
4000: 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79  emove the memory
4010: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
4020: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
4030: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61   the given.** Ta
4040: 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73  ble.  No changes
4050: 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73   are made to dis
4060: 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  k by this routin
4070: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
4080: 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74  utine just delet
4090: 65 73 20 74 68 65 20 64 61 74 61 20 73 74 72 75  es the data stru
40a0: 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20  cture.  It does 
40b0: 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68  not unlink.** th
40c0: 65 20 74 61 62 6c 65 20 64 61 74 61 20 73 74 72  e table data str
40d0: 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
40e0: 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74  hash table.  But
40f0: 20 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79   it does destroy
4100: 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  .** memory struc
4110: 74 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64  tures of the ind
4120: 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e  ices and foreign
4130: 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64   keys associated
4140: 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61   with .** the ta
4150: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ble..**.** The d
4160: 62 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f  b parameter is o
4170: 70 74 69 6f 6e 61 6c 2e 20 20 49 74 20 69 73 20  ptional.  It is 
4180: 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 54 61  needed if the Ta
4190: 62 6c 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63  ble object .** c
41a0: 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61 73 69 64  ontains lookasid
41b0: 65 20 6d 65 6d 6f 72 79 2e 20 20 28 54 61 62 6c  e memory.  (Tabl
41c0: 65 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65  e objects in the
41d0: 20 73 63 68 65 6d 61 20 64 6f 20 6e 6f 74 20 75   schema do not u
41e0: 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 20  se.** lookaside 
41f0: 6d 65 6d 6f 72 79 2c 20 62 75 74 20 73 6f 6d 65  memory, but some
4200: 20 65 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65   ephemeral Table
4210: 20 6f 62 6a 65 63 74 73 20 64 6f 2e 29 20 20 4f   objects do.)  O
4220: 72 20 74 68 65 0a 2a 2a 20 64 62 20 70 61 72 61  r the.** db para
4230: 6d 65 74 65 72 20 63 61 6e 20 62 65 20 75 73 65  meter can be use
4240: 64 20 77 69 74 68 20 64 62 2d 3e 70 6e 42 79 74  d with db->pnByt
4250: 65 73 46 72 65 65 64 20 74 6f 20 6d 65 61 73 75  esFreed to measu
4260: 72 65 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a  re the memory.**
4270: 20 75 73 65 64 20 62 79 20 74 68 65 20 54 61 62   used by the Tab
4280: 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f  le object..*/.vo
4290: 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  id sqlite3Delete
42a0: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
42b0: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  b, Table *pTable
42c0: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
42d0: 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 54 45  ex, *pNext;.  TE
42e0: 53 54 4f 4e 4c 59 28 20 69 6e 74 20 6e 4c 6f 6f  STONLY( int nLoo
42f0: 6b 61 73 69 64 65 3b 20 29 20 2f 2a 20 55 73 65  kaside; ) /* Use
4300: 64 20 74 6f 20 76 65 72 69 66 79 20 6c 6f 6f 6b  d to verify look
4310: 61 73 69 64 65 20 6e 6f 74 20 75 73 65 64 20 66  aside not used f
4320: 6f 72 20 73 63 68 65 6d 61 20 2a 2f 0a 0a 20 20  or schema */..  
4330: 61 73 73 65 72 74 28 20 21 70 54 61 62 6c 65 20  assert( !pTable 
4340: 7c 7c 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3e  || pTable->nRef>
4350: 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  0 );..  /* Do no
4360: 74 20 64 65 6c 65 74 65 20 74 68 65 20 74 61 62  t delete the tab
4370: 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66  le until the ref
4380: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61  erence count rea
4390: 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20  ches zero. */.  
43a0: 69 66 28 20 21 70 54 61 62 6c 65 20 29 20 72 65  if( !pTable ) re
43b0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 28 21 64  turn;.  if( ((!d
43c0: 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73  b || db->pnBytes
43d0: 46 72 65 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d  Freed==0) && (--
43e0: 70 54 61 62 6c 65 2d 3e 6e 52 65 66 29 3e 30 29  pTable->nRef)>0)
43f0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
4400: 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62   Record the numb
4410: 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  er of outstandin
4420: 67 20 6c 6f 6f 6b 61 73 69 64 65 20 61 6c 6c 6f  g lookaside allo
4430: 63 61 74 69 6f 6e 73 20 69 6e 20 73 63 68 65 6d  cations in schem
4440: 61 20 54 61 62 6c 65 73 0a 20 20 2a 2a 20 70 72  a Tables.  ** pr
4450: 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79  ior to doing any
4460: 20 66 72 65 65 28 29 20 6f 70 65 72 61 74 69 6f   free() operatio
4470: 6e 73 2e 20 20 53 69 6e 63 65 20 73 63 68 65 6d  ns.  Since schem
4480: 61 20 54 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20  a Tables do not 
4490: 75 73 65 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69  use.  ** lookasi
44a0: 64 65 2c 20 74 68 69 73 20 6e 75 6d 62 65 72 20  de, this number 
44b0: 73 68 6f 75 6c 64 20 6e 6f 74 20 63 68 61 6e 67  should not chang
44c0: 65 2e 20 2a 2f 0a 20 20 54 45 53 54 4f 4e 4c 59  e. */.  TESTONLY
44d0: 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 28  ( nLookaside = (
44e0: 64 62 20 26 26 20 28 70 54 61 62 6c 65 2d 3e 74  db && (pTable->t
44f0: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
4500: 65 6d 65 72 61 6c 29 3d 3d 30 29 20 3f 0a 20 20  emeral)==0) ?.  
4510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4520: 20 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61         db->looka
4530: 73 69 64 65 2e 6e 4f 75 74 20 3a 20 30 20 29 3b  side.nOut : 0 );
4540: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c  ..  /* Delete al
4550: 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  l indices associ
4560: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74  ated with this t
4570: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
4580: 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e  Index = pTable->
4590: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20  pIndex; pIndex; 
45a0: 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20  pIndex=pNext){. 
45b0: 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65     pNext = pInde
45c0: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73  x->pNext;.    as
45d0: 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53  sert( pIndex->pS
45e0: 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70  chema==pTable->p
45f0: 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66  Schema );.    if
4600: 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42  ( !db || db->pnB
4610: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a  ytesFreed==0 ){.
4620: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
4630: 65 20 3d 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  e = pIndex->zNam
4640: 65 3b 20 0a 20 20 20 20 20 20 54 45 53 54 4f 4e  e; .      TESTON
4650: 4c 59 20 28 20 49 6e 64 65 78 20 2a 70 4f 6c 64  LY ( Index *pOld
4660: 20 3d 20 29 20 73 71 6c 69 74 65 33 48 61 73 68   = ) sqlite3Hash
4670: 49 6e 73 65 72 74 28 0a 20 20 20 20 20 20 20 20  Insert(.        
4680: 20 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d   &pIndex->pSchem
4690: 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d  a->idxHash, zNam
46a0: 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
46b0: 33 30 28 7a 4e 61 6d 65 29 2c 20 30 0a 20 20 20  30(zName), 0.   
46c0: 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
46d0: 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c  rt( db==0 || sql
46e0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
46f0: 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65  eld(db, 0, pInde
4700: 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20  x->pSchema) );. 
4710: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c       assert( pOl
4720: 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c  d==pIndex || pOl
4730: 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  d==0 );.    }.  
4740: 20 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20    freeIndex(db, 
4750: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20  pIndex);.  }..  
4760: 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 66 6f  /* Delete any fo
4770: 72 65 69 67 6e 20 6b 65 79 73 20 61 74 74 61 63  reign keys attac
4780: 68 65 64 20 74 6f 20 74 68 69 73 20 74 61 62 6c  hed to this tabl
4790: 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46  e. */.  sqlite3F
47a0: 6b 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62  kDelete(db, pTab
47b0: 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  le);..  /* Delet
47c0: 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  e the Table stru
47d0: 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20  cture itself..  
47e0: 2a 2f 0a 20 20 73 71 6c 69 74 65 44 65 6c 65 74  */.  sqliteDelet
47f0: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c  eColumnNames(db,
4800: 20 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69   pTable);.  sqli
4810: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
4820: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
4830: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4840: 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66  , pTable->zColAf
4850: 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  f);.  sqlite3Sel
4860: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54  ectDelete(db, pT
4870: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  able->pSelect);.
4880: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4890: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 73 71 6c 69  MIT_CHECK.  sqli
48a0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
48b0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43  e(db, pTable->pC
48c0: 68 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 23 69  heck);.#endif.#i
48d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
48e0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
48f0: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61   sqlite3VtabClea
4900: 72 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 23  r(db, pTable);.#
4910: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44  endif.  sqlite3D
4920: 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65  bFree(db, pTable
4930: 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  );..  /* Verify 
4940: 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73 69 64  that no lookasid
4950: 65 20 6d 65 6d 6f 72 79 20 77 61 73 20 75 73 65  e memory was use
4960: 64 20 62 79 20 73 63 68 65 6d 61 20 74 61 62 6c  d by schema tabl
4970: 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
4980: 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30 20 7c 7c  nLookaside==0 ||
4990: 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 64 62 2d   nLookaside==db-
49a0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20  >lookaside.nOut 
49b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  );.}../*.** Unli
49c0: 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62  nk the given tab
49d0: 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68  le from the hash
49e0: 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20   tables and the 
49f0: 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61  delete the.** ta
4a00: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69  ble structure wi
4a10: 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63  th all its indic
4a20: 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b  es and foreign k
4a30: 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  eys..*/.void sql
4a40: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
4a50: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33  eteTable(sqlite3
4a60: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
4a70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e  onst char *zTabN
4a80: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
4a90: 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20  ;.  Db *pDb;..  
4aa0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
4ab0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
4ac0: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
4ad0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54   );.  assert( zT
4ae0: 61 62 4e 61 6d 65 20 29 3b 0a 20 20 61 73 73 65  abName );.  asse
4af0: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
4b00: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
4b10: 44 62 2c 20 30 29 20 29 3b 0a 20 20 74 65 73 74  Db, 0) );.  test
4b20: 63 61 73 65 28 20 7a 54 61 62 4e 61 6d 65 5b 30  case( zTabName[0
4b30: 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a 65 72 6f  ]==0 );  /* Zero
4b40: 2d 6c 65 6e 67 74 68 20 74 61 62 6c 65 20 6e 61  -length table na
4b50: 6d 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  mes are allowed 
4b60: 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  */.  pDb = &db->
4b70: 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20  aDb[iDb];.  p = 
4b80: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
4b90: 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  t(&pDb->pSchema-
4ba0: 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61  >tblHash, zTabNa
4bb0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
4bc0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
4bd0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 61 62  te3Strlen30(zTab
4be0: 4e 61 6d 65 29 2c 30 29 3b 0a 20 20 73 71 6c 69  Name),0);.  sqli
4bf0: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
4c00: 62 2c 20 70 29 3b 0a 20 20 64 62 2d 3e 66 6c 61  b, p);.  db->fla
4c10: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
4c20: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
4c30: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b  *.** Given a tok
4c40: 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72  en, return a str
4c50: 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74  ing that consist
4c60: 73 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66  s of the text of
4c70: 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 2e 20   that.** token. 
4c80: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
4c90: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
4ca0: 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65  ng.** is obtaine
4cb0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
4cc0: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
4cd0: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
4ce0: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
4cf0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 71 75  on..**.** Any qu
4d00: 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 20 28 65  otation marks (e
4d10: 78 3a 20 20 22 6e 61 6d 65 22 2c 20 27 6e 61 6d  x:  "name", 'nam
4d20: 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72 20 60  e', [name], or `
4d30: 6e 61 6d 65 60 29 20 74 68 61 74 0a 2a 2a 20 73  name`) that.** s
4d40: 75 72 72 6f 75 6e 64 20 74 68 65 20 62 6f 64 79  urround the body
4d50: 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 61 72   of the token ar
4d60: 65 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a  e removed..**.**
4d70: 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74 65   Tokens are ofte
4d80: 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65 72 73 20  n just pointers 
4d90: 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
4da0: 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64 20 73  l SQL text and s
4db0: 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30  o.** are not \00
4dc0: 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64  0 terminated and
4dd0: 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69 73 74   are not persist
4de0: 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ent.  The return
4df0: 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20  ed string.** is 
4e00: 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20  \000 terminated 
4e10: 61 6e 64 20 69 73 20 70 65 72 73 69 73 74 65 6e  and is persisten
4e20: 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  t..*/.char *sqli
4e30: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
4e40: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f  (sqlite3 *db, To
4e50: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63  ken *pName){.  c
4e60: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66  har *zName;.  if
4e70: 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  ( pName ){.    z
4e80: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
4e90: 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61  StrNDup(db, (cha
4ea0: 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  r*)pName->z, pNa
4eb0: 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69  me->n);.    sqli
4ec0: 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65  te3Dequote(zName
4ed0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
4ee0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  zName = 0;.  }. 
4ef0: 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
4f00: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
4f10: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
4f20: 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64  able stored in d
4f30: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69  atabase number i
4f40: 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e  Db for.** writin
4f50: 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  g. The table is 
4f60: 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72  opened using cur
4f70: 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73  sor 0..*/.void s
4f80: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
4f90: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 2c 20  Table(Parse *p, 
4fa0: 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
4fb0: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
4fc0: 56 64 62 65 28 70 29 3b 0a 20 20 73 71 6c 69 74  Vdbe(p);.  sqlit
4fd0: 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69  e3TableLock(p, i
4fe0: 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  Db, MASTER_ROOT,
4ff0: 20 31 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45   1, SCHEMA_TABLE
5000: 28 69 44 62 29 29 3b 0a 20 20 73 71 6c 69 74 65  (iDb));.  sqlite
5010: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5020: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20  P_OpenWrite, 0, 
5030: 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 69 44 62  MASTER_ROOT, iDb
5040: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
5050: 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
5060: 28 63 68 61 72 20 2a 29 35 2c 20 50 34 5f 49 4e  (char *)5, P4_IN
5070: 54 33 32 29 3b 20 20 2f 2a 20 35 20 63 6f 6c 75  T32);  /* 5 colu
5080: 6d 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66  mn table */.  if
5090: 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a  ( p->nTab==0 ){.
50a0: 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b      p->nTab = 1;
50b0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  .  }.}../*.** Pa
50c0: 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f  rameter zName po
50d0: 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65  ints to a nul-te
50e0: 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72 20  rminated buffer 
50f0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
5100: 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61  ame.** of a data
5110: 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74  base ("main", "t
5120: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65  emp" or the name
5130: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
5140: 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  db). This.** fun
5150: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
5160: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
5170: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
5180: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a   db->aDb[], or.*
5190: 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  * -1 if the name
51a0: 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66  d db cannot be f
51b0: 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
51c0: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73  ite3FindDbName(s
51d0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
51e0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
51f0: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20    int i = -1;   
5200: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
5210: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66  e number */.  if
5220: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44  ( zName ){.    D
5230: 62 20 2a 70 44 62 3b 0a 20 20 20 20 69 6e 74 20  b *pDb;.    int 
5240: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
5250: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n30(zName);.    
5260: 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31  for(i=(db->nDb-1
5270: 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b  ), pDb=&db->aDb[
5280: 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  i]; i>=0; i--, p
5290: 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28  Db--){.      if(
52a0: 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c   (!OMIT_TEMPDB |
52b0: 7c 20 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d 73  | i!=1 ) && n==s
52c0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
52d0: 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20  Db->zName) && . 
52e0: 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69           0==sqli
52f0: 74 65 33 53 74 72 49 43 6d 70 28 70 44 62 2d 3e  te3StrICmp(pDb->
5300: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b  zName, zName) ){
5310: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
5320: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5330: 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  }.  return i;.}.
5340: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e  ./*.** The token
5350: 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73   *pName contains
5360: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64   the name of a d
5370: 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20  atabase (either 
5380: 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65  "main" or.** "te
5390: 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20  mp" or the name 
53a0: 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  of an attached d
53b0: 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  b). This routine
53c0: 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20   returns the.** 
53d0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d  index of the nam
53e0: 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64  ed database in d
53f0: 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20  b->aDb[], or -1 
5400: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20  if the named db 
5410: 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  .** does not exi
5420: 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  st..*/.int sqlit
5430: 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33  e3FindDb(sqlite3
5440: 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61   *db, Token *pNa
5450: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  me){.  int i;   
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
5480: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a  atabase number *
5490: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  /.  char *zName;
54a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
54c0: 20 77 65 20 61 72 65 20 73 65 61 72 63 68 69 6e   we are searchin
54d0: 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65  g for */.  zName
54e0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
54f0: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
5500: 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74 65  e);.  i = sqlite
5510: 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
5520: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
5530: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
5540: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  e);.  return i;.
5550: 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  }../* The table 
5560: 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69 67 67  or view or trigg
5570: 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65  er name is passe
5580: 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  d to this routin
5590: 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20  e via tokens.** 
55a0: 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65  pName1 and pName
55b0: 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  2. If the table 
55c0: 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71  name was fully q
55d0: 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78  ualified, for ex
55e0: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45  ample:.**.** CRE
55f0: 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79  ATE TABLE xxx.yy
5600: 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20  y (...);.** .** 
5610: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
5620: 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20  et to "xxx" and 
5630: 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e  pName2 "yyy". On
5640: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20   the other hand 
5650: 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  if.** the table 
5660: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c  name is not full
5670: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65  y qualified, i.e
5680: 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20  .:.**.** CREATE 
5690: 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a  TABLE yyy(...);.
56a0: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  **.** Then pName
56b0: 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79  1 is set to "yyy
56c0: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20  " and pName2 is 
56d0: 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ""..**.** This r
56e0: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
56f0: 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65  *ppUnqual pointe
5700: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
5710: 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20  e token (pName1 
5720: 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68  or.** pName2) th
5730: 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e  at stores the un
5740: 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20  qualified table 
5750: 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78  name.  The index
5760: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
5770: 61 73 65 20 22 78 78 78 22 20 69 73 20 72 65 74  ase "xxx" is ret
5780: 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
5790: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
57a0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
57b0: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  e,      /* Parsi
57c0: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
57d0: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
57e0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
57f0: 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  1,      /* The "
5800: 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  xxx" in the name
5810: 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78   "xxx.yyy" or "x
5820: 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  xx" */.  Token *
5830: 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20  pName2,      /* 
5840: 54 68 65 20 22 79 79 79 22 20 69 6e 20 74 68 65  The "yyy" in the
5850: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
5860: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e  */.  Token **pUn
5870: 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74  qual     /* Writ
5880: 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65  e the unqualifie
5890: 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65  d object name he
58a0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  re */.){.  int i
58b0: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
58c0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
58d0: 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f  se holding the o
58e0: 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
58f0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
5900: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41  >db;..  if( ALWA
5910: 59 53 28 70 4e 61 6d 65 32 21 3d 30 29 20 26 26  YS(pName2!=0) &&
5920: 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a   pName2->n>0 ){.
5930: 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74      if( db->init
5940: 2e 62 75 73 79 20 29 20 7b 0a 20 20 20 20 20 20  .busy ) {.      
5950: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
5960: 70 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74  pParse, "corrupt
5970: 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20   database");.   
5980: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
5990: 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  +;.      return 
59a0: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  -1;.    }.    *p
59b0: 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b  Unqual = pName2;
59c0: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
59d0: 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61  e3FindDb(db, pNa
59e0: 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44  me1);.    if( iD
59f0: 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  b<0 ){.      sql
5a00: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5a10: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61  rse, "unknown da
5a20: 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d  tabase %T", pNam
5a30: 65 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  e1);.      pPars
5a40: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
5a50: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
5a60: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  }.  }else{.    a
5a70: 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e  ssert( db->init.
5a80: 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e  iDb==0 || db->in
5a90: 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 69  it.busy );.    i
5aa0: 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44  Db = db->init.iD
5ab0: 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20  b;.    *pUnqual 
5ac0: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20  = pName1;.  }.  
5ad0: 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f  return iDb;.}../
5ae0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5af0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65  e is used to che
5b00: 63 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38 20  ck if the UTF-8 
5b10: 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20  string zName is 
5b20: 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61  a legal.** unqua
5b30: 6c 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20  lified name for 
5b40: 61 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a  a new schema obj
5b50: 65 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65  ect (table, inde
5b60: 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72  x, view or.** tr
5b70: 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65  igger). All name
5b80: 73 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65  s are legal exce
5b90: 70 74 20 74 68 6f 73 65 20 74 68 61 74 20 62 65  pt those that be
5ba0: 67 69 6e 20 77 69 74 68 20 74 68 65 20 73 74 72  gin with the str
5bb0: 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22  ing.** "sqlite_"
5bc0: 20 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65   (in upper, lowe
5bd0: 72 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29  r or mixed case)
5be0: 2e 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f  . This portion o
5bf0: 66 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a  f the namespace.
5c00: 2a 2a 20 69 73 20 72 65 73 65 72 76 65 64 20 66  ** is reserved f
5c10: 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e  or internal use.
5c20: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
5c30: 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50  heckObjectName(P
5c40: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
5c50: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
5c60: 7b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  {.  if( !pParse-
5c70: 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  >db->init.busy &
5c80: 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  & pParse->nested
5c90: 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26  ==0 .          &
5ca0: 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  & (pParse->db->f
5cb0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72  lags & SQLITE_Wr
5cc0: 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20  iteSchema)==0.  
5cd0: 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
5ce0: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e  lite3StrNICmp(zN
5cf0: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
5d00: 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  7) ){.    sqlite
5d10: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5d20: 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72  , "object name r
5d30: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
5d40: 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a  rnal use: %s", z
5d50: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
5d60: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
5d70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
5d80: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
5d90: 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74   Begin construct
5da0: 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20  ing a new table 
5db0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
5dc0: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
5dd0: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
5de0: 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f  of several actio
5df0: 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20  n routines that 
5e00: 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65  get called in re
5e10: 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43  sponse.** to a C
5e20: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
5e30: 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69  ement.  In parti
5e40: 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74  cular, this rout
5e50: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  ine is called.**
5e60: 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f   after seeing to
5e70: 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e  kens "CREATE" an
5e80: 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68  d "TABLE" and th
5e90: 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68  e table name. Th
5ea0: 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67  e isTemp.** flag
5eb0: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
5ec0: 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20  table should be 
5ed0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75  stored in the au
5ee0: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
5ef0: 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64  .** file instead
5f00: 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   of in the main 
5f10: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
5f20: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
5f30: 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65   the case.** whe
5f40: 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20  n the "TEMP" or 
5f50: 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77  "TEMPORARY" keyw
5f60: 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65  ord occurs in be
5f70: 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20  tween.** CREATE 
5f80: 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a  and TABLE..**.**
5f90: 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   The new table r
5fa0: 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c  ecord is initial
5fb0: 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20  ized and put in 
5fc0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
5fd0: 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66  e..** As more of
5fe0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
5ff0: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  E statement is p
6000: 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61  arsed, additiona
6010: 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74  l action.** rout
6020: 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c  ines will be cal
6030: 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20  led to add more 
6040: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
6050: 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41  his record..** A
6060: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
6070: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
6080: 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c  atement, the sql
6090: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72  ite3EndTable() r
60a0: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
60b0: 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  led to complete 
60c0: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  the construction
60d0: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
60e0: 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69  e record..*/.voi
60f0: 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61  d sqlite3StartTa
6100: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
6110: 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65  arse,   /* Parse
6120: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
6130: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
6140: 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
6150: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
6160: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
6170: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
6180: 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70  2,   /* Second p
6190: 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20  art of the name 
61a0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
61b0: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
61c0: 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72  Temp,      /* Tr
61d0: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
61e0: 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20  TEMP table */.  
61f0: 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20 20  int isView,     
6200: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
6210: 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20   is a VIEW */.  
6220: 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20  int isVirtual,  
6230: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
6240: 20 69 73 20 61 20 56 49 52 54 55 41 4c 20 74 61   is a VIRTUAL ta
6250: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45  ble */.  int noE
6260: 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  rr        /* Do 
6270: 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65  nothing if table
6280: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
6290: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
62a0: 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Table;.  char *z
62b0: 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65  Name = 0; /* The
62c0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77   name of the new
62d0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
62e0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
62f0: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ->db;.  Vdbe *v;
6300: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
6310: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
6320: 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65  number to create
6330: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f   the table in */
6340: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b  .  Token *pName;
6350: 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
6360: 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  ed name of the t
6370: 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a  able to create *
6380: 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  /..  /* The tabl
6390: 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 74  e or view name t
63a0: 6f 20 63 72 65 61 74 65 20 69 73 20 70 61 73 73  o create is pass
63b0: 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ed to this routi
63c0: 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20  ne via tokens.  
63d0: 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e  ** pName1 and pN
63e0: 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62  ame2. If the tab
63f0: 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c  le name was full
6400: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72  y qualified, for
6410: 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   example:.  **. 
6420: 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
6430: 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a   xxx.yyy (...);.
6440: 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20    ** .  ** Then 
6450: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
6460: 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65   "xxx" and pName
6470: 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20  2 "yyy". On the 
6480: 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 20 20  other hand if.  
6490: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  ** the table nam
64a0: 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71  e is not fully q
64b0: 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a  ualified, i.e.:.
64c0: 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45    **.  ** CREATE
64d0: 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b   TABLE yyy(...);
64e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
64f0: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
6500: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
6510: 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20  2 is ""..  **.  
6520: 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f  ** The call belo
6530: 77 20 73 65 74 73 20 74 68 65 20 70 4e 61 6d 65  w sets the pName
6540: 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e   pointer to poin
6550: 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28  t at the token (
6560: 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70  pName1 or.  ** p
6570: 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72  Name2) that stor
6580: 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  es the unqualifi
6590: 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54  ed table name. T
65a0: 68 65 20 76 61 72 69 61 62 6c 65 20 69 44 62 20  he variable iDb 
65b0: 69 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20 74  is.  ** set to t
65c0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
65d0: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 74 68  database that th
65e0: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
65f0: 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72  is to be.  ** cr
6600: 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20  eated in..  */. 
6610: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
6620: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
6630: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
6640: 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  , &pName);.  if(
6650: 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b   iDb<0 ) return;
6660: 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d  .  if( !OMIT_TEM
6670: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 26 26  PDB && isTemp &&
6680: 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20   pName2->n>0 && 
6690: 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  iDb!=1 ){.    /*
66a0: 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 74   If creating a t
66b0: 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e  emp table, the n
66c0: 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71  ame may not be q
66d0: 75 61 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73 73  ualified. Unless
66e0: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74   .    ** the dat
66f0: 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 22 74  abase name is "t
6700: 65 6d 70 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f  emp" anyway.  */
6710: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
6720: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 65  rMsg(pParse, "te
6730: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e 61  mporary table na
6740: 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61  me must be unqua
6750: 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 72 65  lified");.    re
6760: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
6770: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
6780: 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31  isTemp ) iDb = 1
6790: 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61  ;..  pParse->sNa
67a0: 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65  meToken = *pName
67b0: 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ;.  zName = sqli
67c0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
67d0: 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  (db, pName);.  i
67e0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  f( zName==0 ) re
67f0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49  turn;.  if( SQLI
6800: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
6810: 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
6820: 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
6830: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
6840: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  able_error;.  }.
6850: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69    if( db->init.i
6860: 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d  Db==1 ) isTemp =
6870: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
6880: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
6890: 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20  ATION.  assert( 
68a0: 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69 73  (isTemp & 1)==is
68b0: 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20  Temp );.  {.    
68c0: 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 68  int code;.    ch
68d0: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
68e0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
68f0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
6900: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
6910: 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
6920: 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d  HEMA_TABLE(isTem
6930: 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  p), 0, zDb) ){. 
6940: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
6950: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
6960: 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65   }.    if( isVie
6970: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  w ){.      if( !
6980: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
6990: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  sTemp ){.       
69a0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
69b0: 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b  REATE_TEMP_VIEW;
69c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
69d0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
69e0: 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 3b  ITE_CREATE_VIEW;
69f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
6a00: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  se{.      if( !O
6a10: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73  MIT_TEMPDB && is
6a20: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
6a30: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
6a40: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b  EATE_TEMP_TABLE;
6a50: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6a60: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
6a70: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
6a80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6a90: 20 20 20 20 69 66 28 20 21 69 73 56 69 72 74 75      if( !isVirtu
6aa0: 61 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75 74  al && sqlite3Aut
6ab0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
6ac0: 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a  ode, zName, 0, z
6ad0: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
6ae0: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
6af0: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ror;.    }.  }.#
6b00: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65  endif..  /* Make
6b10: 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61   sure the new ta
6b20: 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f  ble name does no
6b30: 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61  t collide with a
6b40: 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
6b50: 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e  index or table n
6b60: 61 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ame in the same 
6b70: 64 61 74 61 62 61 73 65 2e 20 20 49 73 73 75 65  database.  Issue
6b80: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
6b90: 65 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65  e if.  ** it doe
6ba0: 73 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  s. The exception
6bb0: 20 69 73 20 69 66 20 74 68 65 20 73 74 61 74 65   is if the state
6bc0: 6d 65 6e 74 20 62 65 69 6e 67 20 70 61 72 73 65  ment being parse
6bd0: 64 20 77 61 73 20 70 61 73 73 65 64 0a 20 20 2a  d was passed.  *
6be0: 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  * to an sqlite3_
6bf0: 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20 63  declare_vtab() c
6c00: 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63 61 73  all. In that cas
6c10: 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d  e only the colum
6c20: 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64  n names.  ** and
6c30: 20 74 79 70 65 73 20 77 69 6c 6c 20 62 65 20 75   types will be u
6c40: 73 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73  sed, so there is
6c50: 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74   no need to test
6c60: 20 66 6f 72 20 6e 61 6d 65 73 70 61 63 65 0a 20   for namespace. 
6c70: 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a   ** collisions..
6c80: 20 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44    */.  if( !IN_D
6c90: 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20  ECLARE_VTAB ){. 
6ca0: 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64     char *zDb = d
6cb0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
6cc0: 65 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  e;.    if( SQLIT
6cd0: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
6ce0: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
6cf0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
6d00: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6d10: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 6c  .    }.    pTabl
6d20: 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  e = sqlite3FindT
6d30: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
6d40: 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54  zDb);.    if( pT
6d50: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66  able ){.      if
6d60: 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20  ( !noErr ){.    
6d70: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6d80: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
6d90: 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20 65 78  le %T already ex
6da0: 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  ists", pName);. 
6db0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6dc0: 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
6dd0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
6de0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
6df0: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
6e00: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
6e10: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 62    }.      goto b
6e20: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
6e30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6e40: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
6e50: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29  (db, zName, zDb)
6e60: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
6e70: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
6e80: 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61  rse, "there is a
6e90: 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20  lready an index 
6ea0: 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
6eb0: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  );.      goto be
6ec0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6ed0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54  .    }.  }..  pT
6ee0: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62  able = sqlite3Db
6ef0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
6f00: 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
6f10: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
6f20: 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  {.    db->malloc
6f30: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
6f40: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
6f50: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70  ITE_NOMEM;.    p
6f60: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
6f70: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
6f80: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ble_error;.  }. 
6f90: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d   pTable->zName =
6fa0: 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65   zName;.  pTable
6fb0: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
6fc0: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20  pTable->pSchema 
6fd0: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
6fe0: 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65  Schema;.  pTable
6ff0: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54  ->nRef = 1;.  pT
7000: 61 62 6c 65 2d 3e 6e 52 6f 77 45 73 74 20 3d 20  able->nRowEst = 
7010: 31 30 30 30 30 30 30 3b 0a 20 20 61 73 73 65 72  1000000;.  asser
7020: 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  t( pParse->pNewT
7030: 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70 50 61  able==0 );.  pPa
7040: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d  rse->pNewTable =
7050: 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49   pTable;..  /* I
7060: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61  f this is the ma
7070: 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75 65  gic sqlite_seque
7080: 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64 20 62  nce table used b
7090: 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c  y autoincrement,
70a0: 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72  .  ** then recor
70b0: 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  d a pointer to t
70c0: 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68 65  his table in the
70d0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73   main database s
70e0: 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f  tructure.  ** so
70f0: 20 74 68 61 74 20 49 4e 53 45 52 54 20 63 61 6e   that INSERT can
7100: 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   find the table 
7110: 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  easily..  */.#if
7120: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7130: 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
7140: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65   if( !pParse->ne
7150: 73 74 65 64 20 26 26 20 73 74 72 63 6d 70 28 7a  sted && strcmp(z
7160: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 65  Name, "sqlite_se
7170: 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20  quence")==0 ){. 
7180: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
7190: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
71a0: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
71b0: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63  .    pTable->pSc
71c0: 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d 20  hema->pSeqTab = 
71d0: 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64  pTable;.  }.#end
71e0: 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67  if..  /* Begin g
71f0: 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f  enerating the co
7200: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73  de that will ins
7210: 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65  ert the table re
7220: 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74  cord into.  ** t
7230: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
7240: 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e   table.  Note in
7250: 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74   particular that
7260: 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61   we must go ahea
7270: 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63  d.  ** and alloc
7280: 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ate the record n
7290: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
72a0: 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20  ble entry now.  
72b0: 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20  Before any.  ** 
72c0: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
72d0: 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61  NIQUE keywords a
72e0: 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73  re parsed.  Thos
72f0: 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20  e keywords will 
7300: 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63  cause.  ** indic
7310: 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  es to be created
7320: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72   and the table r
7330: 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20  ecord must come 
7340: 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a  before the .  **
7350: 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65   indices.  Hence
7360: 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  , the record num
7370: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
7380: 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  e must be alloca
7390: 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20  ted.  ** now..  
73a0: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
73b0: 69 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20  it.busy && (v = 
73c0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
73d0: 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20  Parse))!=0 ){.  
73e0: 20 20 69 6e 74 20 6a 31 3b 0a 20 20 20 20 69 6e    int j1;.    in
73f0: 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20  t fileFormat;.  
7400: 20 20 69 6e 74 20 72 65 67 31 2c 20 72 65 67 32    int reg1, reg2
7410: 2c 20 72 65 67 33 3b 0a 20 20 20 20 73 71 6c 69  , reg3;.    sqli
7420: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
7430: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
7440: 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66  , iDb);..#ifndef
7450: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
7460: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
7470: 28 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20  ( isVirtual ){. 
7480: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7490: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65  AddOp0(v, OP_VBe
74a0: 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  gin);.    }.#end
74b0: 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  if..    /* If th
74c0: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e  e file format an
74d0: 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68  d encoding in th
74e0: 65 20 64 61 74 61 62 61 73 65 20 68 61 76 65 20  e database have 
74f0: 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20  not been set, . 
7500: 20 20 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e     ** set them n
7510: 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ow..    */.    r
7520: 65 67 31 20 3d 20 70 50 61 72 73 65 2d 3e 72 65  eg1 = pParse->re
7530: 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73  gRowid = ++pPars
7540: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67  e->nMem;.    reg
7550: 32 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52  2 = pParse->regR
7560: 6f 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  oot = ++pParse->
7570: 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d  nMem;.    reg3 =
7580: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
7590: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
75a0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61  AddOp3(v, OP_Rea
75b0: 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65  dCookie, iDb, re
75c0: 67 33 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46  g3, BTREE_FILE_F
75d0: 4f 52 4d 41 54 29 3b 0a 20 20 20 20 73 71 6c 69  ORMAT);.    sqli
75e0: 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
75f0: 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 6a 31  (v, iDb);.    j1
7600: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
7610: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp1(v, OP_If, r
7620: 65 67 33 29 3b 0a 20 20 20 20 66 69 6c 65 46 6f  eg3);.    fileFo
7630: 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61 67  rmat = (db->flag
7640: 73 20 26 20 53 51 4c 49 54 45 5f 4c 65 67 61 63  s & SQLITE_Legac
7650: 79 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a 20  yFileFmt)!=0 ?. 
7660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7670: 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d 41 58 5f   1 : SQLITE_MAX_
7680: 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20 20  FILE_FORMAT;.   
7690: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
76a0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
76b0: 2c 20 66 69 6c 65 46 6f 72 6d 61 74 2c 20 72 65  , fileFormat, re
76c0: 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g3);.    sqlite3
76d0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
76e0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
76f0: 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d   BTREE_FILE_FORM
7700: 41 54 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73  AT, reg3);.    s
7710: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7720: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
7730: 45 4e 43 28 64 62 29 2c 20 72 65 67 33 29 3b 0a  ENC(db), reg3);.
7740: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7750: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
7760: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45  ookie, iDb, BTRE
7770: 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e 47 2c  E_TEXT_ENCODING,
7780: 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69   reg3);.    sqli
7790: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
77a0: 76 2c 20 6a 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  v, j1);..    /* 
77b0: 54 68 69 73 20 6a 75 73 74 20 63 72 65 61 74 65  This just create
77c0: 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72  s a place-holder
77d0: 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 73   record in the s
77e0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
77f0: 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  le..    ** The r
7800: 65 63 6f 72 64 20 63 72 65 61 74 65 64 20 64 6f  ecord created do
7810: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
7820: 6e 79 74 68 69 6e 67 20 79 65 74 2e 20 20 49 74  nything yet.  It
7830: 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 65   will be replace
7840: 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  d.    ** by the 
7850: 72 65 61 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f  real entry in co
7860: 64 65 20 67 65 6e 65 72 61 74 65 64 20 61 74 20  de generated at 
7870: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
7880: 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
7890: 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   The rowid for t
78a0: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20  he new entry is 
78b0: 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72  left in register
78c0: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69   pParse->regRowi
78d0: 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  d..    ** The ro
78e0: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
78f0: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
7900: 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 20 70  is left in reg p
7910: 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a  Parse->regRoot..
7920: 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64      ** The rowid
7930: 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 6e   and root page n
7940: 75 6d 62 65 72 20 76 61 6c 75 65 73 20 61 72 65  umber values are
7950: 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 63   needed by the c
7960: 6f 64 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ode that.    ** 
7970: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 20  sqlite3EndTable 
7980: 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20  will generate.. 
7990: 20 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e     */.#if !defin
79a0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
79b0: 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
79c0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
79d0: 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 69  TUALTABLE).    i
79e0: 66 28 20 69 73 56 69 65 77 20 7c 7c 20 69 73 56  f( isView || isV
79f0: 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20  irtual ){.      
7a00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7a10: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
7a20: 20 30 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d   0, reg2);.    }
7a30: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
7a40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
7a50: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7a60: 43 72 65 61 74 65 54 61 62 6c 65 2c 20 69 44 62  CreateTable, iDb
7a70: 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 0a 20  , reg2);.    }. 
7a80: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61     sqlite3OpenMa
7a90: 73 74 65 72 54 61 62 6c 65 28 70 50 61 72 73 65  sterTable(pParse
7aa0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
7ab0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
7ac0: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c   OP_NewRowid, 0,
7ad0: 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69   reg1);.    sqli
7ae0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
7af0: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
7b00: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
7b10: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
7b20: 49 6e 73 65 72 74 2c 20 30 2c 20 72 65 67 33 2c  Insert, 0, reg3,
7b30: 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69   reg1);.    sqli
7b40: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
7b50: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
7b60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7b70: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43  beAddOp0(v, OP_C
7b80: 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lose);.  }..  /*
7b90: 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72   Normal (non-err
7ba0: 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20  or) return. */. 
7bb0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49   return;..  /* I
7bc0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
7bd0: 73 2c 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20  s, we jump here 
7be0: 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  */.begin_table_e
7bf0: 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44  rror:.  sqlite3D
7c00: 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
7c10: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
7c20: 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20  *.** This macro 
7c30: 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61  is used to compa
7c40: 72 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 69  re two strings i
7c50: 6e 20 61 20 63 61 73 65 2d 69 6e 73 65 6e 73 69  n a case-insensi
7c60: 74 69 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a 2a 20  tive manner..** 
7c70: 49 74 20 69 73 20 73 6c 69 67 68 74 6c 79 20 66  It is slightly f
7c80: 61 73 74 65 72 20 74 68 61 6e 20 63 61 6c 6c 69  aster than calli
7c90: 6e 67 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  ng sqlite3StrICm
7ca0: 70 28 29 20 64 69 72 65 63 74 6c 79 2c 20 62 75  p() directly, bu
7cb0: 74 0a 2a 2a 20 70 72 6f 64 75 63 65 73 20 6c 61  t.** produces la
7cc0: 72 67 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rger code..**.**
7cd0: 20 57 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 6d   WARNING: This m
7ce0: 61 63 72 6f 20 69 73 20 6e 6f 74 20 63 6f 6d 70  acro is not comp
7cf0: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 65 20  atible with the 
7d00: 73 74 72 63 6d 70 28 29 20 66 61 6d 69 6c 79 2e  strcmp() family.
7d10: 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74   It.** returns t
7d20: 72 75 65 20 69 66 20 74 68 65 20 74 77 6f 20 73  rue if the two s
7d30: 74 72 69 6e 67 73 20 61 72 65 20 65 71 75 61 6c  trings are equal
7d40: 2c 20 6f 74 68 65 72 77 69 73 65 20 66 61 6c 73  , otherwise fals
7d50: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54  e..*/.#define ST
7d60: 52 49 43 4d 50 28 78 2c 20 79 29 20 28 5c 0a 73  RICMP(x, y) (\.s
7d70: 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
7d80: 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68  er[*(unsigned ch
7d90: 61 72 20 2a 29 28 78 29 5d 3d 3d 20 20 20 5c 0a  ar *)(x)]==   \.
7da0: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
7db0: 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63  wer[*(unsigned c
7dc0: 68 61 72 20 2a 29 28 79 29 5d 20 20 20 20 20 5c  har *)(y)]     \
7dd0: 0a 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43  .&& sqlite3StrIC
7de0: 6d 70 28 28 78 29 2b 31 2c 28 79 29 2b 31 29 3d  mp((x)+1,(y)+1)=
7df0: 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  =0 )../*.** Add 
7e00: 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20  a new column to 
7e10: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
7e20: 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
7e30: 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ucted..**.** The
7e40: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
7e50: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20  is routine once 
7e60: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
7e70: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69  declaration.** i
7e80: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
7e90: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c   statement.  sql
7ea0: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29  ite3StartTable()
7eb0: 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20   gets called.** 
7ec0: 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69  first to get thi
7ed0: 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e  ngs going.  Then
7ee0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
7ef0: 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68   called for each
7f00: 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76  .** column..*/.v
7f10: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
7f20: 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lumn(Parse *pPar
7f30: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
7f40: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
7f50: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
7f60: 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  z;.  Column *pCo
7f70: 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  l;.  sqlite3 *db
7f80: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
7f90: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
7fa0: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
7fb0: 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 53 51  ) return;.#if SQ
7fc0: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a  LITE_MAX_COLUMN.
7fd0: 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e    if( p->nCol+1>
7fe0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
7ff0: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
8000: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
8010: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8020: 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
8030: 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d   on %s", p->zNam
8040: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
8050: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a 20 3d    }.#endif.  z =
8060: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
8070: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
8080: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
8090: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
80a0: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
80b0: 29 7b 0a 20 20 20 20 69 66 28 20 53 54 52 49 43  ){.    if( STRIC
80c0: 4d 50 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d  MP(z, p->aCol[i]
80d0: 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  .zName) ){.     
80e0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
80f0: 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63  (pParse, "duplic
8100: 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a  ate column name:
8110: 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20   %s", z);.      
8120: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8130: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , z);.      retu
8140: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rn;.    }.  }.  
8150: 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30  if( (p->nCol & 0
8160: 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f  x7)==0 ){.    Co
8170: 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20  lumn *aNew;.    
8180: 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  aNew = sqlite3Db
8190: 52 65 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43  Realloc(db,p->aC
81a0: 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73  ol,(p->nCol+8)*s
81b0: 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d  izeof(p->aCol[0]
81c0: 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77  ));.    if( aNew
81d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
81e0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
81f0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
8200: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43  .    }.    p->aC
8210: 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20  ol = aNew;.  }. 
8220: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
8230: 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d  [p->nCol];.  mem
8240: 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a  set(pCol, 0, siz
8250: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
8260: 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20  ;.  pCol->zName 
8270: 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74  = z;. .  /* If t
8280: 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20  here is no type 
8290: 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d  specified, colum
82a0: 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61  ns have the defa
82b0: 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 2a  ult affinity.  *
82c0: 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20 74 68 65  * 'NONE'. If the
82d0: 72 65 20 69 73 20 61 20 74 79 70 65 20 73 70 65  re is a type spe
82e0: 63 69 66 69 65 64 2c 20 74 68 65 6e 20 73 71 6c  cified, then sql
82f0: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70  ite3AddColumnTyp
8300: 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  e() will.  ** be
8310: 20 63 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20   called next to 
8320: 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  set pCol->affini
8330: 74 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20  ty correctly..  
8340: 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  */.  pCol->affin
8350: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
8360: 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 6e 43 6f 6c  _NONE;.  p->nCol
8370: 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ++;.}../*.** Thi
8380: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8390: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
83a0: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
83b0: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
83c0: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
83d0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41  LE statement.  A
83e0: 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73   "NOT NULL" cons
83f0: 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65  traint has.** be
8400: 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c  en seen on a col
8410: 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  umn.  This routi
8420: 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e  ne sets the notN
8430: 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74  ull flag on.** t
8440: 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e  he column curren
8450: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
8460: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
8470: 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c  sqlite3AddNotNul
8480: 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  l(Parse *pParse,
8490: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20   int onError){. 
84a0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 70 20 3d   Table *p;.  p =
84b0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
84c0: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  le;.  if( p==0 |
84d0: 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c  | NEVER(p->nCol<
84e0: 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  1) ) return;.  p
84f0: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31  ->aCol[p->nCol-1
8500: 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29  ].notNull = (u8)
8510: 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  onError;.}../*.*
8520: 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d  * Scan the colum
8530: 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70  n type name zTyp
8540: 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29  e (length nType)
8550: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a   and return the.
8560: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66  ** associated af
8570: 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a  finity type..**.
8580: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8590: 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65  does a case-inde
85a0: 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f  pendent search o
85b0: 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20  f zType for the 
85c0: 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69  .** substrings i
85d0: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
85e0: 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66  table. If one of
85f0: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20   the substrings 
8600: 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65  is.** found, the
8610: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61   corresponding a
8620: 66 66 69 6e 69 74 79 20 69 73 20 72 65 74 75 72  ffinity is retur
8630: 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f  ned. If zType co
8640: 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74  ntains.** more t
8650: 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  han one of the s
8660: 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69  ubstrings, entri
8670: 65 73 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f  es toward the to
8680: 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62  p of .** the tab
8690: 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79  le take priority
86a0: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
86b0: 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42  f zType is 'BLOB
86c0: 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45  INT', .** SQLITE
86d0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20  _AFF_INTEGER is 
86e0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
86f0: 53 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20  Substring     | 
8700: 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d  Affinity.** ----
8710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
8730: 27 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20  'INT'         | 
8740: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
8750: 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20  ER.** 'CHAR'    
8760: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
8770: 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20  _TEXT.** 'CLOB' 
8780: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
8790: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58  AFF_TEXT.** 'TEX
87a0: 54 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  T'        | SQLI
87b0: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
87c0: 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53  BLOB'        | S
87d0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a  QLITE_AFF_NONE.*
87e0: 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20 20 20  * 'REAL'        
87f0: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  | SQLITE_AFF_REA
8800: 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20  L.** 'FLOA'     
8810: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
8820: 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20  REAL.** 'DOUB'  
8830: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
8840: 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66  FF_REAL.**.** If
8850: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62   none of the sub
8860: 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61  strings in the a
8870: 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20 66  bove table are f
8880: 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ound,.** SQLITE_
8890: 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72  AFF_NUMERIC is r
88a0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72  eturned..*/.char
88b0: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
88c0: 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20  Type(const char 
88d0: 2a 7a 49 6e 29 7b 0a 20 20 75 33 32 20 68 20 3d  *zIn){.  u32 h =
88e0: 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66 20 3d   0;.  char aff =
88f0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
8900: 52 49 43 3b 0a 0a 20 20 69 66 28 20 7a 49 6e 20  RIC;..  if( zIn 
8910: 29 20 77 68 69 6c 65 28 20 7a 49 6e 5b 30 5d 20  ) while( zIn[0] 
8920: 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c 38  ){.    h = (h<<8
8930: 29 20 2b 20 73 71 6c 69 74 65 33 55 70 70 65 72  ) + sqlite3Upper
8940: 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e 29 26 30  ToLower[(*zIn)&0
8950: 78 66 66 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b  xff];.    zIn++;
8960: 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63  .    if( h==(('c
8970: 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29  '<<24)+('h'<<16)
8980: 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29  +('a'<<8)+'r') )
8990: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {             /*
89a0: 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61   CHAR */.      a
89b0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
89c0: 54 45 58 54 3b 20 0a 20 20 20 20 7d 65 6c 73 65  TEXT; .    }else
89d0: 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32   if( h==(('c'<<2
89e0: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
89f0: 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20  '<<8)+'b') ){   
8a00: 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20      /* CLOB */. 
8a10: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
8a20: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
8a30: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
8a40: 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36  t'<<24)+('e'<<16
8a50: 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20  )+('x'<<8)+'t') 
8a60: 29 7b 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54  ){       /* TEXT
8a70: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
8a80: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
8a90: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
8aa0: 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c  ==(('b'<<24)+('l
8ab0: 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b  '<<16)+('o'<<8)+
8ac0: 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a  'b')          /*
8ad0: 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20   BLOB */.       
8ae0: 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45   && (aff==SQLITE
8af0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20  _AFF_NUMERIC || 
8b00: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
8b10: 52 45 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 61  REAL) ){.      a
8b20: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
8b30: 4e 4f 4e 45 3b 0a 23 69 66 6e 64 65 66 20 53 51  NONE;.#ifndef SQ
8b40: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
8b50: 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c  NG_POINT.    }el
8b60: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c  se if( h==(('r'<
8b70: 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28  <24)+('e'<<16)+(
8b80: 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20  'a'<<8)+'l')    
8b90: 20 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f        /* REAL */
8ba0: 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d  .        && aff=
8bb0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
8bc0: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66  RIC ){.      aff
8bd0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   = SQLITE_AFF_RE
8be0: 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  AL;.    }else if
8bf0: 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b  ( h==(('f'<<24)+
8c00: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
8c10: 38 29 2b 27 61 27 29 20 20 20 20 20 20 20 20 20  8)+'a')         
8c20: 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20   /* FLOA */.    
8c30: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
8c40: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
8c50: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
8c60: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20  LITE_AFF_REAL;. 
8c70: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
8c80: 28 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c  (('d'<<24)+('o'<
8c90: 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62  <16)+('u'<<8)+'b
8ca0: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ')          /* D
8cb0: 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  OUB */.        &
8cc0: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
8cd0: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
8ce0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
8cf0: 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66  AFF_REAL;.#endif
8d00: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
8d10: 68 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28  h&0x00FFFFFF)==(
8d20: 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c  ('i'<<16)+('n'<<
8d30: 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a  8)+'t') ){    /*
8d40: 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66   INT */.      af
8d50: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  f = SQLITE_AFF_I
8d60: 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72  NTEGER;.      br
8d70: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
8d80: 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a    return aff;.}.
8d90: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
8da0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
8db0: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
8dc0: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
8dd0: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
8de0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
8df0: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69  tement.  The pFi
8e00: 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  rst token is the
8e10: 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20   first.** token 
8e20: 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  in the sequence 
8e30: 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64  of tokens that d
8e40: 65 73 63 72 69 62 65 20 74 68 65 20 74 79 70 65  escribe the type
8e50: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d   of the.** colum
8e60: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
8e70: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
8e80: 20 20 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c    pLast is the l
8e90: 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20  ast token.** in 
8ea0: 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55  the sequence.  U
8eb0: 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74  se this informat
8ec0: 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ion to construct
8ed0: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61   a string.** tha
8ee0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
8ef0: 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63  ypename of the c
8f00: 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20  olumn and store 
8f10: 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69  that string.** i
8f20: 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69  n zType..*/ .voi
8f30: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  d sqlite3AddColu
8f40: 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  mnType(Parse *pP
8f50: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79  arse, Token *pTy
8f60: 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  pe){.  Table *p;
8f70: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
8f80: 0a 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ..  p = pParse->
8f90: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
8fa0: 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70   p==0 || NEVER(p
8fb0: 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74 75  ->nCol<1) ) retu
8fc0: 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d  rn;.  pCol = &p-
8fd0: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d  >aCol[p->nCol-1]
8fe0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c  ;.  assert( pCol
8ff0: 2d 3e 7a 54 79 70 65 3d 3d 30 20 29 3b 0a 20 20  ->zType==0 );.  
9000: 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71  pCol->zType = sq
9010: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
9020: 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
9030: 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61  Type);.  pCol->a
9040: 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
9050: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 43  3AffinityType(pC
9060: 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f  ol->zType);.}../
9070: 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73  *.** The express
9080: 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61 75  ion is the defau
9090: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
90a0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
90b0: 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f  dded column.** o
90c0: 66 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  f the table curr
90d0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
90e0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
90f0: 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78  Default value ex
9100: 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62  pressions must b
9110: 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69  e constant.  Rai
9120: 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20  se an exception 
9130: 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f  if this.** is no
9140: 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a  t the case..**.*
9150: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9160: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
9170: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
9180: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
9190: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
91a0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
91b0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
91c0: 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  e3AddDefaultValu
91d0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
91e0: 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e   ExprSpan *pSpan
91f0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
9200: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
9210: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9220: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d  Parse->db;.  p =
9230: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
9240: 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29  le;.  if( p!=0 )
9250: 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70  {.    pCol = &(p
9260: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31  ->aCol[p->nCol-1
9270: 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c  ]);.    if( !sql
9280: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
9290: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 53 70  ntOrFunction(pSp
92a0: 61 6e 2d 3e 70 45 78 70 72 29 20 29 7b 0a 20 20  an->pExpr) ){.  
92b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
92c0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 65 66  Msg(pParse, "def
92d0: 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f  ault value of co
92e0: 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74  lumn [%s] is not
92f0: 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20   constant",.    
9300: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d        pCol->zNam
9310: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
9320: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
9330: 66 20 70 45 78 70 72 20 69 73 20 75 73 65 64 20  f pExpr is used 
9340: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 6f  instead of the o
9350: 72 69 67 69 6e 61 6c 2c 20 61 73 20 70 45 78 70  riginal, as pExp
9360: 72 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20  r contains.     
9370: 20 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 61 74 20   ** tokens that 
9380: 70 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 74 69 6c  point to volatil
9390: 65 20 6d 65 6d 6f 72 79 2e 20 54 68 65 20 27 73  e memory. The 's
93a0: 70 61 6e 27 20 6f 66 20 74 68 65 20 65 78 70 72  pan' of the expr
93b0: 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ession.      ** 
93c0: 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 70  is required by p
93d0: 72 61 67 6d 61 20 74 61 62 6c 65 5f 69 6e 66 6f  ragma table_info
93e0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
93f0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
9400: 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66  te(db, pCol->pDf
9410: 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  lt);.      pCol-
9420: 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33  >pDflt = sqlite3
9430: 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 70 61  ExprDup(db, pSpa
9440: 6e 2d 3e 70 45 78 70 72 2c 20 45 58 50 52 44 55  n->pExpr, EXPRDU
9450: 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20  P_REDUCE);.     
9460: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9470: 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b  b, pCol->zDflt);
9480: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 44 66  .      pCol->zDf
9490: 6c 74 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  lt = sqlite3DbSt
94a0: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
94b0: 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a  )pSpan->zStart,.
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94e0: 20 20 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e       (int)(pSpan
94f0: 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e  ->zEnd - pSpan->
9500: 7a 53 74 61 72 74 29 29 3b 0a 20 20 20 20 7d 0a  zStart));.    }.
9510: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
9520: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 53 70 61  rDelete(db, pSpa
9530: 6e 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  n->pExpr);.}../*
9540: 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68  .** Designate th
9550: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f  e PRIMARY KEY fo
9560: 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c  r the table.  pL
9570: 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
9580: 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f   names .** of co
9590: 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20  lumns that form 
95a0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
95b0: 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55    If pList is NU
95c0: 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  LL, then the.** 
95d0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
95e0: 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ded column of th
95f0: 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70  e table is the p
9600: 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a  rimary key..**.*
9610: 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61  * A table can ha
9620: 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70  ve at most one p
9630: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
9640: 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
9650: 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61  y has.** a prima
9660: 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73  ry key (and this
9670: 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   is the second p
9680: 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e  rimary key) then
9690: 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72   create an.** er
96a0: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ror..**.** If th
96b0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
96c0: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   on a single col
96d0: 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79  umn whose dataty
96e0: 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a  pe is INTEGER,.*
96f0: 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74  * then we will t
9700: 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63  ry to use that c
9710: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77  olumn as the row
9720: 69 64 2e 20 20 53 65 74 20 74 68 65 20 54 61 62  id.  Set the Tab
9730: 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c  le.iPKey.** fiel
9740: 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75  d of the table u
9750: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
9760: 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65  n to be the inde
9770: 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45  x of the.** INTE
9780: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
9790: 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69  column.  Table.i
97a0: 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d  PKey is set to -
97b0: 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  1 if there is.**
97c0: 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d   no INTEGER PRIM
97d0: 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49  ARY KEY..**.** I
97e0: 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74  f the key is not
97f0: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
9800: 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72  ARY KEY, then cr
9810: 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a  eate a unique.**
9820: 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b   index for the k
9830: 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73  ey.  No index is
9840: 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54   created for INT
9850: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
9860: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
9870: 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28  e3AddPrimaryKey(
9880: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9890: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
98a0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
98b0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f  rList *pList,  /
98c0: 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20  * List of field 
98d0: 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65  names to be inde
98e0: 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  xed */.  int onE
98f0: 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68  rror,      /* Wh
9900: 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20  at to do with a 
9910: 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c  uniqueness confl
9920: 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74  ict */.  int aut
9930: 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54 72  oInc,      /* Tr
9940: 75 65 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e  ue if the AUTOIN
9950: 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20  CREMENT keyword 
9960: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
9970: 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20  int sortOrder   
9980: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41    /* SQLITE_SO_A
9990: 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f  SC or SQLITE_SO_
99a0: 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  DESC */.){.  Tab
99b0: 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73  le *pTab = pPars
99c0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
99d0: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b  char *zType = 0;
99e0: 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31  .  int iCol = -1
99f0: 2c 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  , i;.  if( pTab=
9a00: 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45  =0 || IN_DECLARE
9a10: 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 70 72 69  _VTAB ) goto pri
9a20: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20  mary_key_exit;. 
9a30: 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c   if( pTab->tabFl
9a40: 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d  ags & TF_HasPrim
9a50: 61 72 79 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  aryKey ){.    sq
9a60: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
9a70: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61  arse, .      "ta
9a80: 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d  ble \"%s\" has m
9a90: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69  ore than one pri
9aa0: 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d  mary key", pTab-
9ab0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
9ac0: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
9ad0: 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e  it;.  }.  pTab->
9ae0: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48  tabFlags |= TF_H
9af0: 61 73 50 72 69 6d 61 72 79 4b 65 79 3b 0a 20 20  asPrimaryKey;.  
9b00: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
9b10: 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d      iCol = pTab-
9b20: 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70  >nCol - 1;.    p
9b30: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
9b40: 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46  colFlags |= COLF
9b50: 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 7d  LAG_PRIMKEY;.  }
9b60: 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
9b70: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
9b80: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  r; i++){.      f
9b90: 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
9ba0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
9bb0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
9bc0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
9bd0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
9be0: 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  e, pTab->aCol[iC
9bf0: 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  ol].zName)==0 ){
9c00: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
9c10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9c20: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43    }.      if( iC
9c30: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  ol<pTab->nCol ){
9c40: 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61  .        pTab->a
9c50: 43 6f 6c 5b 69 43 6f 6c 5d 2e 63 6f 6c 46 6c 61  Col[iCol].colFla
9c60: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52  gs |= COLFLAG_PR
9c70: 49 4d 4b 45 59 3b 0a 20 20 20 20 20 20 7d 0a 20  IMKEY;.      }. 
9c80: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69     }.    if( pLi
9c90: 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 20 69 43  st->nExpr>1 ) iC
9ca0: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69  ol = -1;.  }.  i
9cb0: 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  f( iCol>=0 && iC
9cc0: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  ol<pTab->nCol ){
9cd0: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61  .    zType = pTa
9ce0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54  b->aCol[iCol].zT
9cf0: 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  ype;.  }.  if( z
9d00: 54 79 70 65 20 26 26 20 73 71 6c 69 74 65 33 53  Type && sqlite3S
9d10: 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49  trICmp(zType, "I
9d20: 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 20  NTEGER")==0.    
9d30: 20 20 20 20 26 26 20 73 6f 72 74 4f 72 64 65 72      && sortOrder
9d40: 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20  ==SQLITE_SO_ASC 
9d50: 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b  ){.    pTab->iPK
9d60: 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70  ey = iCol;.    p
9d70: 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28  Tab->keyConf = (
9d80: 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  u8)onError;.    
9d90: 61 73 73 65 72 74 28 20 61 75 74 6f 49 6e 63 3d  assert( autoInc=
9da0: 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31  =0 || autoInc==1
9db0: 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61   );.    pTab->ta
9dc0: 62 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e  bFlags |= autoIn
9dd0: 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  c*TF_Autoincreme
9de0: 6e 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  nt;.  }else if( 
9df0: 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64  autoInc ){.#ifnd
9e00: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
9e10: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
9e20: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9e30: 28 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e  (pParse, "AUTOIN
9e40: 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20  CREMENT is only 
9e50: 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a  allowed on an ".
9e60: 20 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 20         "INTEGER 
9e70: 50 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23  PRIMARY KEY");.#
9e80: 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
9e90: 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
9ea0: 20 70 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61   p = sqlite3Crea
9eb0: 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  teIndex(pParse, 
9ec0: 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20  0, 0, 0, pList, 
9ed0: 6f 6e 45 72 72 6f 72 2c 20 30 2c 0a 20 20 20 20  onError, 0,.    
9ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ef0: 20 20 20 20 20 20 20 30 2c 20 73 6f 72 74 4f 72         0, sortOr
9f00: 64 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  der, 0);.    if(
9f10: 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61   p ){.      p->a
9f20: 75 74 6f 49 6e 64 65 78 20 3d 20 32 3b 0a 20 20  utoIndex = 2;.  
9f30: 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20    }.    pList = 
9f40: 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f  0;.  }..primary_
9f50: 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  key_exit:.  sqli
9f60: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
9f70: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  e(pParse->db, pL
9f80: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ist);.  return;.
9f90: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
9fa0: 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ew CHECK constra
9fb0: 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65  int to the table
9fc0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
9fd0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
9fe0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
9ff0: 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74  dCheckConstraint
a000: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
a010: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
a020: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
a030: 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20  pr *pCheckExpr  
a040: 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78 70  /* The check exp
a050: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69  ression */.){.#i
a060: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a070: 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65 20  T_CHECK.  Table 
a080: 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  *pTab = pParse->
a090: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
a0a0: 20 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45 43   pTab && !IN_DEC
a0b0: 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20  LARE_VTAB ){.   
a0c0: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20   pTab->pCheck = 
a0d0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
a0e0: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 54  ppend(pParse, pT
a0f0: 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68 65  ab->pCheck, pChe
a100: 63 6b 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  ckExpr);.    if(
a110: 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61   pParse->constra
a120: 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a 20 20 20  intName.n ){.   
a130: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
a140: 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65  stSetName(pParse
a150: 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20  , pTab->pCheck, 
a160: 26 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61  &pParse->constra
a170: 69 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20  intName, 1);.   
a180: 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69   }.  }else.#endi
a190: 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  f.  {.    sqlite
a1a0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
a1b0: 73 65 2d 3e 64 62 2c 20 70 43 68 65 63 6b 45 78  se->db, pCheckEx
a1c0: 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  pr);.  }.}../*.*
a1d0: 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74  * Set the collat
a1e0: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20  ion function of 
a1f0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
a200: 79 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63  y parsed table c
a210: 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20  olumn.** to the 
a220: 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a  CollSeq given..*
a230: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
a240: 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72  dCollateType(Par
a250: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
a260: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61  n *pToken){.  Ta
a270: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
a280: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20  .  char *zColl; 
a290: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a2a0: 44 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66  Dequoted name of
a2b0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
a2c0: 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nce */.  sqlite3
a2d0: 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 20   *db;..  if( (p 
a2e0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
a2f0: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
a300: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
a310: 31 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  1;.  db = pParse
a320: 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20  ->db;.  zColl = 
a330: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
a340: 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29  oken(db, pToken)
a350: 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29  ;.  if( !zColl )
a360: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20   return;..  if( 
a370: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
a380: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f  lSeq(pParse, zCo
a390: 6c 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ll) ){.    Index
a3a0: 20 2a 70 49 64 78 3b 0a 20 20 20 20 73 71 6c 69   *pIdx;.    sqli
a3b0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
a3c0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b  >aCol[i].zColl);
a3d0: 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  .    p->aCol[i].
a3e0: 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20  zColl = zColl;. 
a3f0: 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
a400: 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72  column is declar
a410: 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52  ed as "<name> PR
a420: 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54  IMARY KEY COLLAT
a430: 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a  E <type>",.    *
a440: 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20  * then an index 
a450: 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72  may have been cr
a460: 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f  eated on this co
a470: 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a  lumn before the.
a480: 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e      ** collation
a490: 20 74 79 70 65 20 77 61 73 20 61 64 64 65 64 2e   type was added.
a4a0: 20 43 6f 72 72 65 63 74 20 74 68 69 73 20 69 66   Correct this if
a4b0: 20 69 74 20 69 73 20 74 68 65 20 63 61 73 65 2e   it is the case.
a4c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
a4d0: 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20  pIdx=p->pIndex; 
a4e0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
a4f0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61  >pNext){.      a
a500: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f  ssert( pIdx->nCo
a510: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
a520: 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
a530: 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20  umn[0]==i ){.   
a540: 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
a550: 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69  l[0] = p->aCol[i
a560: 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  ].zColl;.      }
a570: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
a580: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
a590: 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  e(db, zColl);.  
a5a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
a5b0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
a5c0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
a5d0: 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61  equence for data
a5e0: 62 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74  base native text
a5f0: 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65  .** encoding ide
a600: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73  ntified by the s
a610: 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e  tring zName, len
a620: 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  gth nName..**.**
a630: 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
a640: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
a650: 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69  ence is not avai
a660: 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76  lable, or not av
a670: 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68  ailable.** in th
a680: 65 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  e database nativ
a690: 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20  e encoding, the 
a6a0: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
a6b0: 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a  y is invoked to.
a6c0: 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49  ** request it. I
a6d0: 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  f the collation 
a6e0: 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74  factory does not
a6f0: 20 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73   supply such a s
a700: 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20  equence,.** and 
a710: 74 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20  the sequence is 
a720: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f  available in ano
a730: 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69  ther text encodi
a740: 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73  ng, then that is
a750: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73  .** returned ins
a760: 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  tead..**.** If n
a770: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
a780: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
a790: 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20  ations sequence 
a7a0: 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f  are available, o
a7b0: 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72  r.** another err
a7c0: 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
a7d0: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
a7e0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
a7f0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
a800: 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54   pParse..**.** T
a810: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
a820: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
a830: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
a840: 65 71 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74  eq().  This rout
a850: 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74  ine.** invokes t
a860: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
a870: 74 6f 72 79 20 69 66 20 74 68 65 20 6e 61 6d 65  tory if the name
a880: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e  d collation cann
a890: 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61  ot be found.** a
a8a0: 6e 64 20 67 65 6e 65 72 61 74 65 73 20 61 6e 20  nd generates an 
a8b0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a  error message..*
a8c0: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73  *.** See also: s
a8d0: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
a8e0: 71 28 29 2c 20 73 71 6c 69 74 65 33 47 65 74 43  q(), sqlite3GetC
a8f0: 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c  ollSeq().*/.Coll
a900: 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  Seq *sqlite3Loca
a910: 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  teCollSeq(Parse 
a920: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
a930: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73  har *zName){.  s
a940: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
a950: 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e  rse->db;.  u8 en
a960: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75  c = ENC(db);.  u
a970: 38 20 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d  8 initbusy = db-
a980: 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f  >init.busy;.  Co
a990: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20  llSeq *pColl;.. 
a9a0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
a9b0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
a9c0: 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69 6e 69 74  enc, zName, init
a9d0: 62 75 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e  busy);.  if( !in
a9e0: 69 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c  itbusy && (!pCol
a9f0: 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d  l || !pColl->xCm
aa00: 70 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  p) ){.    pColl 
aa10: 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c  = sqlite3GetColl
aa20: 53 65 71 28 70 50 61 72 73 65 2c 20 65 6e 63 2c  Seq(pParse, enc,
aa30: 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a   pColl, zName);.
aa40: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43    }..  return pC
aa50: 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  oll;.}.../*.** G
aa60: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
aa70: 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74  t will increment
aa80: 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
aa90: 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63  ie..**.** The sc
aaa0: 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75  hema cookie is u
aab0: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
aac0: 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   when the schema
aad0: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61   for the.** data
aae0: 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41  base changes.  A
aaf0: 66 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61  fter each schema
ab00: 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f   change, the coo
ab10: 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61  kie value.** cha
ab20: 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72  nges.  When a pr
ab30: 6f 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64  ocess first read
ab40: 73 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20  s the schema it 
ab50: 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63  records the.** c
ab60: 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74  ookie.  Thereaft
ab70: 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20  er, whenever it 
ab80: 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74  goes to access t
ab90: 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20  he database,.** 
aba0: 69 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f  it checks the co
abb0: 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  okie to make sur
abc0: 65 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73  e the schema has
abd0: 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20   not changed.** 
abe0: 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73  since it was las
abf0: 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  t read..**.** Th
ac00: 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63  is plan is not c
ac10: 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74  ompletely bullet
ac20: 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70  -proof.  It is p
ac30: 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74  ossible for.** t
ac40: 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61  he schema to cha
ac50: 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  nge multiple tim
ac60: 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63  es and for the c
ac70: 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73  ookie to be.** s
ac80: 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72  et back to prior
ac90: 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68   value.  But sch
aca0: 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20  ema changes are 
acb0: 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e  infrequent.** an
acc0: 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  d the probabilit
acd0: 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65  y of hitting the
ace0: 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c   same cookie val
acf0: 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20  ue is only.** 1 
ad00: 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20  chance in 2^32. 
ad10: 20 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65   So we're safe e
ad20: 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73  nough..*/.void s
ad30: 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
ad40: 69 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ie(Parse *pParse
ad50: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e  , int iDb){.  in
ad60: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
ad70: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
ad80: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
ad90: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
ada0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
adb0: 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
adc0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
add0: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
ade0: 62 2c 20 30 29 20 29 3b 0a 20 20 73 71 6c 69 74  b, 0) );.  sqlit
adf0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ae00: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e  OP_Integer, db->
ae10: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
ae20: 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b  ->schema_cookie+
ae30: 31 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  1, r1);.  sqlite
ae40: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
ae50: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
ae60: 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56  , BTREE_SCHEMA_V
ae70: 45 52 53 49 4f 4e 2c 20 72 31 29 3b 0a 20 20 73  ERSION, r1);.  s
ae80: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
ae90: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
aea0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75  ;.}../*.** Measu
aeb0: 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  re the number of
aec0: 20 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64   characters need
aed0: 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65  ed to output the
aee0: 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69   given.** identi
aef0: 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65  fier.  The numbe
af00: 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75  r returned inclu
af10: 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75  des any quotes u
af20: 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20  sed.** but does 
af30: 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20  not include the 
af40: 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e  null terminator.
af50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d  .**.** The estim
af60: 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74  ate is conservat
af70: 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62  ive.  It might b
af80: 65 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68  e larger that wh
af90: 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20  at is.** really 
afa0: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
afb0: 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74  c int identLengt
afc0: 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  h(const char *z)
afd0: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72  {.  int n;.  for
afe0: 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a  (n=0; *z; n++, z
aff0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  ++){.    if( *z=
b000: 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20  ='"' ){ n++; }. 
b010: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20   }.  return n + 
b020: 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  2;.}../*.** The 
b030: 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20  first parameter 
b040: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
b050: 61 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  an output buffer
b060: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  . The second .**
b070: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
b080: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
b090: 74 65 67 65 72 20 74 68 61 74 20 63 6f 6e 74 61  teger that conta
b0a0: 69 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20 61  ins the offset a
b0b0: 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20 77 72  t.** which to wr
b0c0: 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ite into the out
b0d0: 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 69 73  put buffer. This
b0e0: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73   function copies
b0f0: 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d   the.** nul-term
b100: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 70 6f  inated string po
b110: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
b120: 74 68 69 72 64 20 70 61 72 61 6d 65 74 65 72 2c  third parameter,
b130: 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a   zSignedIdent,.*
b140: 2a 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  * to the specifi
b150: 65 64 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  ed offset in the
b160: 20 62 75 66 66 65 72 20 61 6e 64 20 75 70 64 61   buffer and upda
b170: 74 65 73 20 2a 70 49 64 78 20 74 6f 20 72 65 66  tes *pIdx to ref
b180: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72  er.** to the fir
b190: 73 74 20 62 79 74 65 20 61 66 74 65 72 20 74 68  st byte after th
b1a0: 65 20 6c 61 73 74 20 62 79 74 65 20 77 72 69 74  e last byte writ
b1b0: 74 65 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72  ten before retur
b1c0: 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  ning..** .** If 
b1d0: 74 68 65 20 73 74 72 69 6e 67 20 7a 53 69 67 6e  the string zSign
b1e0: 65 64 49 64 65 6e 74 20 63 6f 6e 73 69 73 74 73  edIdent consists
b1f0: 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c 70   entirely of alp
b200: 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68  ha-numeric.** ch
b210: 61 72 61 63 74 65 72 73 2c 20 64 6f 65 73 20 6e  aracters, does n
b220: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  ot begin with a 
b230: 64 69 67 69 74 20 61 6e 64 20 69 73 20 6e 6f 74  digit and is not
b240: 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c   an SQL keyword,
b250: 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 63  .** then it is c
b260: 6f 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74  opied to the out
b270: 70 75 74 20 62 75 66 66 65 72 20 65 78 61 63 74  put buffer exact
b280: 6c 79 20 61 73 20 69 74 20 69 73 2e 20 4f 74 68  ly as it is. Oth
b290: 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73  erwise,.** it is
b2a0: 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20 64 6f   quoted using do
b2b0: 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a  uble-quotes..*/.
b2c0: 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e  static void iden
b2d0: 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e  tPut(char *z, in
b2e0: 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a  t *pIdx, char *z
b2f0: 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20  SignedIdent){.  
b300: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
b310: 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65  Ident = (unsigne
b320: 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49  d char*)zSignedI
b330: 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  dent;.  int i, j
b340: 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69  , needQuote;.  i
b350: 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72   = *pIdx;..  for
b360: 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b  (j=0; zIdent[j];
b370: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   j++){.    if( !
b380: 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a  sqlite3Isalnum(z
b390: 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64  Ident[j]) && zId
b3a0: 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72  ent[j]!='_' ) br
b3b0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51  eak;.  }.  needQ
b3c0: 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 49 73  uote = sqlite3Is
b3d0: 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29  digit(zIdent[0])
b3e0: 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f   || sqlite3Keywo
b3f0: 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a  rdCode(zIdent, j
b400: 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20  )!=TK_ID;.  if( 
b410: 21 6e 65 65 64 51 75 6f 74 65 20 29 7b 0a 20 20  !needQuote ){.  
b420: 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 7a 49    needQuote = zI
b430: 64 65 6e 74 5b 6a 5d 3b 0a 20 20 7d 0a 0a 20 20  dent[j];.  }..  
b440: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
b450: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
b460: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
b470: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b  j]; j++){.    z[
b480: 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d  i++] = zIdent[j]
b490: 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74  ;.    if( zIdent
b4a0: 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b  [j]=='"' ) z[i++
b4b0: 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69  ] = '"';.  }.  i
b4c0: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
b4d0: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a  [i++] = '"';.  z
b4e0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78  [i] = 0;.  *pIdx
b4f0: 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   = i;.}../*.** G
b500: 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45  enerate a CREATE
b510: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
b520: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
b530: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61   the given.** ta
b540: 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20  ble.  Memory to 
b550: 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66  hold the text of
b560: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
b570: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  s obtained.** fr
b580: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
b590: 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
b5a0: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
b5b0: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
b5c0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65  static char *cre
b5d0: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71 6c  ateTableStmt(sql
b5e0: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
b5f0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c  *p){.  int i, k,
b600: 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d   n;.  char *zStm
b610: 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c  t;.  char *zSep,
b620: 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a   *zSep2, *zEnd;.
b630: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
b640: 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70    n = 0;.  for(p
b650: 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69  Col = p->aCol, i
b660: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
b670: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
b680: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
b690: 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b  h(pCol->zName) +
b6a0: 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69   5;.  }.  n += i
b6b0: 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e  dentLength(p->zN
b6c0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30  ame);.  if( n<50
b6d0: 20 29 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d 20   ){ .    zSep = 
b6e0: 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20  "";.    zSep2 = 
b6f0: 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20  ",";.    zEnd = 
b700: 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ")";.  }else{.  
b710: 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b    zSep = "\n  ";
b720: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c  .    zSep2 = ",\
b730: 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d  n  ";.    zEnd =
b740: 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20   "\n)";.  }.  n 
b750: 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f  += 35 + 6*p->nCo
b760: 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c  l;.  zStmt = sql
b770: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
b780: 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53 74  0, n);.  if( zSt
b790: 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  mt==0 ){.    db-
b7a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
b7b0: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  1;.    return 0;
b7c0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
b7d0: 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74  nprintf(n, zStmt
b7e0: 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  , "CREATE TABLE 
b7f0: 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65  ");.  k = sqlite
b800: 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29  3Strlen30(zStmt)
b810: 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74  ;.  identPut(zSt
b820: 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65  mt, &k, p->zName
b830: 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20  );.  zStmt[k++] 
b840: 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f  = '(';.  for(pCo
b850: 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20  l=p->aCol, i=0; 
b860: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  i<p->nCol; i++, 
b870: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61  pCol++){.    sta
b880: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
b890: 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20   const azType[] 
b8a0: 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  = {.        /* S
b8b0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20  QLITE_AFF_TEXT  
b8c0: 20 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20 20    */ " TEXT",.  
b8d0: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
b8e0: 41 46 46 5f 4e 4f 4e 45 20 20 20 20 2a 2f 20 22  AFF_NONE    */ "
b8f0: 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51  ",.        /* SQ
b900: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
b910: 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20   */ " NUM",.    
b920: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
b930: 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20 49  F_INTEGER */ " I
b940: 4e 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  NT",.        /* 
b950: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
b960: 20 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20     */ " REAL".  
b970: 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e    };.    int len
b980: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
b990: 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73 71   *zType;..    sq
b9a0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
b9b0: 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  -k, &zStmt[k], z
b9c0: 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73  Sep);.    k += s
b9d0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26  qlite3Strlen30(&
b9e0: 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a  zStmt[k]);.    z
b9f0: 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20  Sep = zSep2;.   
ba00: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
ba10: 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65   &k, pCol->zName
ba20: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
ba30: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51  Col->affinity-SQ
ba40: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 3e 3d  LITE_AFF_TEXT >=
ba50: 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74   0 );.    assert
ba60: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
ba70: 2d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  -SQLITE_AFF_TEXT
ba80: 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61 7a 54   < ArraySize(azT
ba90: 79 70 65 29 20 29 3b 0a 20 20 20 20 74 65 73 74  ype) );.    test
baa0: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
bab0: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
bac0: 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 74 65 73  _TEXT );.    tes
bad0: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
bae0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
baf0: 46 5f 4e 4f 4e 45 20 29 3b 0a 20 20 20 20 74 65  F_NONE );.    te
bb00: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
bb10: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
bb20: 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20  FF_NUMERIC );.  
bb30: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
bb40: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
bb50: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29  TE_AFF_INTEGER )
bb60: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
bb70: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
bb80: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
bb90: 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79 70  );.    .    zTyp
bba0: 65 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d  e = azType[pCol-
bbb0: 3e 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c 49  >affinity - SQLI
bbc0: 54 45 5f 41 46 46 5f 54 45 58 54 5d 3b 0a 20 20  TE_AFF_TEXT];.  
bbd0: 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53    len = sqlite3S
bbe0: 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a  trlen30(zType);.
bbf0: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
bc00: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
bc10: 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 0a 20 20 20  TE_AFF_NONE .   
bc20: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c           || pCol
bc30: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69  ->affinity==sqli
bc40: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
bc50: 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20 6d 65  zType) );.    me
bc60: 6d 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20  mcpy(&zStmt[k], 
bc70: 7a 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20  zType, len);.   
bc80: 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61   k += len;.    a
bc90: 73 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20  ssert( k<=n );. 
bca0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70   }.  sqlite3_snp
bcb0: 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d  rintf(n-k, &zStm
bcc0: 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64  t[k], "%s", zEnd
bcd0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d  );.  return zStm
bce0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t;.}../*.** This
bcf0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
bd00: 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65  ed to report the
bd10: 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20   final ")" that 
bd20: 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20  terminates.** a 
bd30: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
bd40: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
bd50: 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  e table structur
bd60: 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74  e that other act
bd70: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76  ion routines hav
bd80: 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a  e been building.
bd90: 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ** is added to t
bda0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  he internal hash
bdb0: 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e   tables, assumin
bdc0: 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65  g no errors have
bdd0: 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  .** occurred..**
bde0: 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72  .** An entry for
bdf0: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61   the table is ma
be00: 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  de in the master
be10: 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20   table on disk, 
be20: 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69  unless.** this i
be30: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  s a temporary ta
be40: 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e  ble or db->init.
be50: 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64  busy==1.  When d
be60: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a  b->init.busy==1.
be70: 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61  ** it means we a
be80: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73  re reading the s
be90: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
bea0: 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75  le because we ju
beb0: 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20  st.** connected 
bec0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
bed0: 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73  or because the s
bee0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
bef0: 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74  le has.** recent
bf00: 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74  ly changed, so t
bf10: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69  he entry for thi
bf20: 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  s table already 
bf30: 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65  exists in.** the
bf40: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
bf50: 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74  able.  We do not
bf60: 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20   want to create 
bf70: 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  it again..**.** 
bf80: 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61  If the pSelect a
bf90: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e  rgument is not N
bfa0: 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ULL, it means th
bfb0: 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  at this routine.
bfc0: 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ** was called to
bfd0: 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20   create a table 
bfe0: 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61  generated from a
bff0: 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42   .** "CREATE TAB
c000: 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54  LE ... AS SELECT
c010: 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e   ..." statement.
c020: 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d    The column nam
c030: 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  es of.** the new
c040: 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63   table will matc
c050: 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  h the result set
c060: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
c070: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
c080: 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  ndTable(.  Parse
c090: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
c0a0: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
c0b0: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
c0c0: 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20  pCons,          
c0d0: 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65   /* The ',' toke
c0e0: 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74  n after the last
c0f0: 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f   column defn. */
c100: 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20  .  Token *pEnd, 
c110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
c120: 65 20 66 69 6e 61 6c 20 27 29 27 20 74 6f 6b 65  e final ')' toke
c130: 6e 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20  n in the CREATE 
c140: 54 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c 65 63  TABLE */.  Selec
c150: 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
c160: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f     /* Select fro
c170: 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e 20  m a "CREATE ... 
c180: 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b  AS SELECT" */.){
c190: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73  .  Table *p;.  s
c1a0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
c1b0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
c1c0: 44 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e 64  Db;..  if( (pEnd
c1d0: 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d  ==0 && pSelect==
c1e0: 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  0) || db->malloc
c1f0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
c200: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  turn;.  }.  p = 
c210: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
c220: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  e;.  if( p==0 ) 
c230: 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
c240: 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
c250: 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b  y || !pSelect );
c260: 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  ..  iDb = sqlite
c270: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
c280: 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  b, p->pSchema);.
c290: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c2a0: 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20  OMIT_CHECK.  /* 
c2b0: 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e  Resolve names in
c2c0: 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74   all CHECK const
c2d0: 72 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  raint expression
c2e0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
c2f0: 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 73  >pCheck ){.    s
c300: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
c310: 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73  fReference(pPars
c320: 65 2c 20 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b  e, p, NC_IsCheck
c330: 2c 20 30 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b  , 0, p->pCheck);
c340: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  .  }.#endif /* !
c350: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
c360: 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20  MIT_CHECK) */.. 
c370: 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69   /* If the db->i
c380: 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69 74  nit.busy is 1 it
c390: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
c3a0: 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66  ading the SQL of
c3b0: 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69  f the.  ** "sqli
c3c0: 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73  te_master" or "s
c3d0: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
c3e0: 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  r" table on the 
c3f0: 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f  disk..  ** So do
c400: 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
c410: 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45  e disk again.  E
c420: 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20  xtract the root 
c430: 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
c440: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66   for the table f
c450: 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74  rom the db->init
c460: 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20  .newTnum field. 
c470: 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65   (The page numbe
c480: 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61  r.  ** should ha
c490: 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65 72  ve been put ther
c4a0: 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f  e by the sqliteO
c4b0: 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a  penCb routine.).
c4c0: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
c4d0: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
c4e0: 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e  p->tnum = db->in
c4f0: 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a  it.newTnum;.  }.
c500: 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69  .  /* If not ini
c510: 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20  tializing, then 
c520: 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20  create a record 
c530: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
c540: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51  e.  ** in the SQ
c550: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
c560: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
c570: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
c580: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52  this is a TEMPOR
c590: 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65  ARY table, write
c5a0: 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20   the entry into 
c5b0: 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20  the auxiliary.  
c5c0: 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  ** file instead 
c5d0: 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  of into the main
c5e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
c5f0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
c600: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
c610: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65   int n;.    Vdbe
c620: 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   *v;.    char *z
c630: 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65  Type;    /* "vie
c640: 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f  w" or "table" */
c650: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65  .    char *zType
c660: 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f  2;   /* "VIEW" o
c670: 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20  r "TABLE" */.   
c680: 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20   char *zStmt;   
c690: 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20   /* Text of the 
c6a0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20  CREATE TABLE or 
c6b0: 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74  CREATE VIEW stat
c6c0: 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20  ement */..    v 
c6d0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
c6e0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
c6f0: 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
c700: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c  return;..    sql
c710: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
c720: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a  , OP_Close, 0);.
c730: 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20  .    /* .    ** 
c740: 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65  Initialize zType
c750: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69 65   for the new vie
c760: 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20 20  w or table..    
c770: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53  */.    if( p->pS
c780: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
c790: 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74    /* A regular t
c7a0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54  able */.      zT
c7b0: 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20  ype = "table";. 
c7c0: 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54       zType2 = "T
c7d0: 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53  ABLE";.#ifndef S
c7e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
c7f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c800: 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20   /* A view */.  
c810: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65      zType = "vie
c820: 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32  w";.      zType2
c830: 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69   = "VIEW";.#endi
c840: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
c850: 49 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45  If this is a CRE
c860: 41 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20  ATE TABLE xx AS 
c870: 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63  SELECT ..., exec
c880: 75 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20  ute the SELECT. 
c890: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
c8a0: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
c8b0: 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72  new table. The r
c8c0: 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20  oot-page number 
c8d0: 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  for the.    ** n
c8e0: 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e 20 72  ew table is in r
c8f0: 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e  egister pParse->
c900: 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a  regRoot..    **.
c910: 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20      ** Once the 
c920: 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20  SELECT has been 
c930: 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33  coded by sqlite3
c940: 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20  Select(), it is 
c950: 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74  in a.    ** suit
c960: 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75  able state to qu
c970: 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ery for the colu
c980: 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70  mn names and typ
c990: 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20  es to be used.  
c9a0: 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20    ** by the new 
c9b0: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  table..    **.  
c9c0: 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61    ** A shared-ca
c9d0: 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69  che write-lock i
c9e0: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74  s not required t
c9f0: 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e  o write to the n
ca00: 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a  ew table,.    **
ca10: 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63   as a schema-loc
ca20: 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  k must have alre
ca30: 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ady been obtaine
ca40: 64 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20  d to create it. 
ca50: 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73  Since.    ** a s
ca60: 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75  chema-lock exclu
ca70: 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61  des all other da
ca80: 74 61 62 61 73 65 20 75 73 65 72 73 2c 20 74 68  tabase users, th
ca90: 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75  e write-lock wou
caa0: 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64  ld.    ** be red
cab0: 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20  undant..    */. 
cac0: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
cad0: 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65  {.      SelectDe
cae0: 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 54  st dest;.      T
caf0: 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 0a  able *pSelTab;..
cb00: 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
cb10: 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20  rse->nTab==1);. 
cb20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cb30: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
cb40: 6e 57 72 69 74 65 2c 20 31 2c 20 70 50 61 72 73  nWrite, 1, pPars
cb50: 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44 62 29  e->regRoot, iDb)
cb60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
cb70: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
cb80: 50 46 4c 41 47 5f 50 32 49 53 52 45 47 29 3b 0a  PFLAG_P2ISREG);.
cb90: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54        pParse->nT
cba0: 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71  ab = 2;.      sq
cbb0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
cbc0: 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 54  nit(&dest, SRT_T
cbd0: 61 62 6c 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  able, 1);.      
cbe0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
cbf0: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26  arse, pSelect, &
cc00: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dest);.      sql
cc10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
cc20: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a  , OP_Close, 1);.
cc30: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
cc40: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
cc50: 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73       pSelTab = s
cc60: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
cc70: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
cc80: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
cc90: 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30    if( pSelTab==0
cca0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
ccb0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43     assert( p->aC
ccc0: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ol==0 );.       
ccd0: 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54   p->nCol = pSelT
cce0: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->nCol;.      
ccf0: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c    p->aCol = pSel
cd00: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  Tab->aCol;.     
cd10: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
cd20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53   = 0;.        pS
cd30: 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
cd40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
cd50: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
cd60: 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20  pSelTab);.      
cd70: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
cd80: 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70  Compute the comp
cd90: 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
cda0: 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e   CREATE statemen
cdb0: 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65  t */.    if( pSe
cdc0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 53  lect ){.      zS
cdd0: 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61 62 6c  tmt = createTabl
cde0: 65 53 74 6d 74 28 64 62 2c 20 70 29 3b 0a 20 20  eStmt(db, p);.  
cdf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
ce00: 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 2d 3e 7a   = (int)(pEnd->z
ce10: 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65   - pParse->sName
ce20: 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a 20 20  Token.z) + 1;.  
ce30: 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69      zStmt = sqli
ce40: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a  te3MPrintf(db, .
ce50: 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
ce60: 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70  E %s %.*s", zTyp
ce70: 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73  e2, n, pParse->s
ce80: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20  NameToken.z.    
ce90: 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
cea0: 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68  /* A slot for th
ceb0: 65 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72  e record has alr
cec0: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
ced0: 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20  ted in the .    
cee0: 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ** SQLITE_MASTER
cef0: 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74   table.  We just
cf00: 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65 20   need to update 
cf10: 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61  that slot with a
cf20: 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  ll.    ** the in
cf30: 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20  formation we've 
cf40: 63 6f 6c 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a  collected..    *
cf50: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  /.    sqlite3Nes
cf60: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
cf70: 0a 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25  .      "UPDATE %
cf80: 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 20  Q.%s ".         
cf90: 22 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20  "SET type='%s', 
cfa0: 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d  name=%Q, tbl_nam
cfb0: 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23  e=%Q, rootpage=#
cfc0: 25 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20  %d, sql=%Q ".   
cfd0: 20 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64      "WHERE rowid
cfe0: 3d 23 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d  =#%d",.      db-
cff0: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
d000: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
d010: 62 29 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c  b),.      zType,
d020: 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c  .      p->zName,
d030: 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c  .      p->zName,
d040: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
d050: 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53  egRoot,.      zS
d060: 74 6d 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73  tmt,.      pPars
d070: 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20  e->regRowid.    
d080: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
d090: 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b  Free(db, zStmt);
d0a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
d0b0: 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
d0c0: 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
d0d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
d0e0: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a  INCREMENT.    /*
d0f0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
d100: 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61   we need to crea
d110: 74 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71  te an sqlite_seq
d120: 75 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a  uence table for.
d130: 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74      ** keeping t
d140: 72 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72  rack of autoincr
d150: 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20  ement keys..    
d160: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 61  */.    if( p->ta
d170: 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
d180: 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20  increment ){.   
d190: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
d1a0: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20  ->aDb[iDb];.    
d1b0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d1c0: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
d1d0: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
d1e0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70        if( pDb->p
d1f0: 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d  Schema->pSeqTab=
d200: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
d210: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
d220: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
d230: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
d240: 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65   %Q.sqlite_seque
d250: 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a  nce(name,seq)",.
d260: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a            pDb->z
d270: 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a  Name.        );.
d280: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
d290: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70  ndif..    /* Rep
d2a0: 61 72 73 65 20 65 76 65 72 79 74 68 69 6e 67 20  arse everything 
d2b0: 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e  to update our in
d2c0: 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75  ternal data stru
d2d0: 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71  ctures */.    sq
d2e0: 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73  lite3VdbeAddPars
d2f0: 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62  eSchemaOp(v, iDb
d300: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d310: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
d320: 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27 25  db, "tbl_name='%
d330: 71 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b  q'", p->zName));
d340: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20  .  }...  /* Add 
d350: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65  the table to the
d360: 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
d370: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
d380: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
d390: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
d3a0: 75 73 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  usy ){.    Table
d3b0: 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65   *pOld;.    Sche
d3c0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d  ma *pSchema = p-
d3d0: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73  >pSchema;.    as
d3e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
d3f0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
d400: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
d410: 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61  pOld = sqlite3Ha
d420: 73 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d  shInsert(&pSchem
d430: 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a  a->tblHash, p->z
d440: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
d450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d460: 20 20 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e     sqlite3Strlen
d470: 33 30 28 70 2d 3e 7a 4e 61 6d 65 29 2c 70 29 3b  30(p->zName),p);
d480: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b  .    if( pOld ){
d490: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d4a0: 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61  ==pOld );  /* Ma
d4b0: 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
d4c0: 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73  ailed inside Has
d4d0: 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20  hInsert() */.   
d4e0: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
d4f0: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  led = 1;.      r
d500: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
d510: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
d520: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  le = 0;.    db->
d530: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
d540: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a  InternChanges;..
d550: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d560: 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20  MIT_ALTERTABLE. 
d570: 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65     if( !p->pSele
d580: 63 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ct ){.      cons
d590: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
d5a0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50  (const char *)pP
d5b0: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
d5c0: 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e  .z;.      int nN
d5d0: 61 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ame;.      asser
d5e0: 74 28 20 21 70 53 65 6c 65 63 74 20 26 26 20 70  t( !pSelect && p
d5f0: 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a  Cons && pEnd );.
d600: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d        if( pCons-
d610: 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >z==0 ){.       
d620: 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20   pCons = pEnd;. 
d630: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61       }.      nNa
d640: 6d 65 20 3d 20 28 69 6e 74 29 28 28 63 6f 6e 73  me = (int)((cons
d650: 74 20 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e  t char *)pCons->
d660: 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  z - zName);.    
d670: 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65    p->addColOffse
d680: 74 20 3d 20 31 33 20 2b 20 73 71 6c 69 74 65 33  t = 13 + sqlite3
d690: 55 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d  Utf8CharLen(zNam
d6a0: 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e, nName);.    }
d6b0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23  .#endif.  }.}..#
d6c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d6d0: 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68  IT_VIEW./*.** Th
d6e0: 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
d6f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f  his routine in o
d700: 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 61  rder to create a
d710: 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69   new VIEW.*/.voi
d720: 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 56  d sqlite3CreateV
d730: 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50  iew(.  Parse *pP
d740: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65  arse,     /* The
d750: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
d760: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65   */.  Token *pBe
d770: 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  gin,     /* The 
d780: 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
d790: 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74 61  t begins the sta
d7a0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65  tement */.  Toke
d7b0: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f  n *pName1,     /
d7c0: 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
d7d0: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
d7e0: 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
d7f0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
d800: 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
d810: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
d820: 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
d830: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
d840: 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45  elect,   /* A SE
d850: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
d860: 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
d870: 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a  the new view */.
d880: 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20    int isTemp,   
d890: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72       /* TRUE for
d8a0: 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65   a TEMPORARY vie
d8b0: 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72  w */.  int noErr
d8c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 70            /* Sup
d8d0: 70 72 65 73 73 20 65 72 72 6f 72 20 6d 65 73 73  press error mess
d8e0: 61 67 65 73 20 69 66 20 56 49 45 57 20 61 6c 72  ages if VIEW alr
d8f0: 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29  eady exists */.)
d900: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
d910: 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63  int n;.  const c
d920: 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20  har *z;.  Token 
d930: 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20  sEnd;.  DbFixer 
d940: 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70  sFix;.  Token *p
d950: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Name = 0;.  int 
d960: 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  iDb;.  sqlite3 *
d970: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
d980: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
d990: 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 73 71  nVar>0 ){.    sq
d9a0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
d9b0: 61 72 73 65 2c 20 22 70 61 72 61 6d 65 74 65 72  arse, "parameter
d9c0: 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65  s are not allowe
d9d0: 64 20 69 6e 20 76 69 65 77 73 22 29 3b 0a 20 20  d in views");.  
d9e0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
d9f0: 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63  elete(db, pSelec
da00: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
da10: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 61    }.  sqlite3Sta
da20: 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  rtTable(pParse, 
da30: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
da40: 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f  isTemp, 1, 0, no
da50: 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  Err);.  p = pPar
da60: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
da70: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
da80: 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
da90: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
daa0: 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74  lete(db, pSelect
dab0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
dac0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50   }.  sqlite3TwoP
dad0: 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
dae0: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
daf0: 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20 3d  &pName);.  iDb =
db00: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
db10: 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63  Index(db, p->pSc
db20: 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  hema);.  sqlite3
db30: 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70  FixInit(&sFix, p
db40: 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76 69 65  Parse, iDb, "vie
db50: 77 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  w", pName);.  if
db60: 28 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65  ( sqlite3FixSele
db70: 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63  ct(&sFix, pSelec
db80: 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  t) ){.    sqlite
db90: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
dba0: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
dbb0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
dbc0: 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  * Make a copy of
dbd0: 20 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45   the entire SELE
dbe0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
dbf0: 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69  t defines the vi
dc00: 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69  ew..  ** This wi
dc10: 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65  ll force all the
dc20: 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61   Expr.token.z va
dc30: 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d  lues to be dynam
dc40: 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f  ically.  ** allo
dc50: 63 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61  cated rather tha
dc60: 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69  n point to the i
dc70: 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68  nput string - wh
dc80: 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20  ich means that. 
dc90: 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65   ** they will pe
dca0: 72 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20  rsist after the 
dcb0: 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f  current sqlite3_
dcc0: 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75  exec() call retu
dcd0: 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  rns..  */.  p->p
dce0: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
dcf0: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 53  SelectDup(db, pS
dd00: 65 6c 65 63 74 2c 20 45 58 50 52 44 55 50 5f 52  elect, EXPRDUP_R
dd10: 45 44 55 43 45 29 3b 0a 20 20 73 71 6c 69 74 65  EDUCE);.  sqlite
dd20: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
dd30: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66  , pSelect);.  if
dd40: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
dd50: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
dd60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 2d  ;.  }.  if( !db-
dd70: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
dd80: 20 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74    sqlite3ViewGet
dd90: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
dda0: 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  se, p);.  }..  /
ddb0: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64  * Locate the end
ddc0: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56   of the CREATE V
ddd0: 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  IEW statement.  
dde0: 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20  Make sEnd point 
ddf0: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e  to.  ** the end.
de00: 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70  .  */.  sEnd = p
de10: 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
de20: 6e 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  n;.  if( ALWAYS(
de30: 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 29 20 26 26  sEnd.z[0]!=0) &&
de40: 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20   sEnd.z[0]!=';' 
de50: 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d  ){.    sEnd.z +=
de60: 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73   sEnd.n;.  }.  s
de70: 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d  End.n = 0;.  n =
de80: 20 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d 20   (int)(sEnd.z - 
de90: 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 7a 20  pBegin->z);.  z 
dea0: 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77  = pBegin->z;.  w
deb0: 68 69 6c 65 28 20 41 4c 57 41 59 53 28 6e 3e 30  hile( ALWAYS(n>0
dec0: 29 20 26 26 20 73 71 6c 69 74 65 33 49 73 73 70  ) && sqlite3Issp
ded0: 61 63 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e  ace(z[n-1]) ){ n
dee0: 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d  --; }.  sEnd.z =
def0: 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64   &z[n-1];.  sEnd
df00: 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73  .n = 1;..  /* Us
df10: 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
df20: 65 28 29 20 74 6f 20 61 64 64 20 74 68 65 20 76  e() to add the v
df30: 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54  iew to the SQLIT
df40: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a  E_MASTER table *
df50: 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61  /.  sqlite3EndTa
df60: 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 26  ble(pParse, 0, &
df70: 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72 65 74 75  sEnd, 0);.  retu
df80: 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rn;.}.#endif /* 
df90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
dfa0: 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
dfb0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
dfc0: 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  EW) || !defined(
dfd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
dfe0: 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20  UALTABLE)./*.** 
dff0: 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
e000: 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65  ure pTable is re
e010: 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69  ally a VIEW.  Fi
e020: 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20  ll in the names 
e030: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  of.** the column
e040: 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e  s of the view in
e050: 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75   the pTable stru
e060: 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74  cture.  Return t
e070: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
e080: 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65  errors.  If an e
e090: 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61  rror is seen lea
e0a0: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
e0b0: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
e0c0: 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
e0d0: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
e0e0: 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a  umnNames(Parse *
e0f0: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
e100: 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20  Table){.  Table 
e110: 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41  *pSelTab;   /* A
e120: 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d   fake table from
e130: 20 77 68 69 63 68 20 77 65 20 67 65 74 20 74 68   which we get th
e140: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
e150: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20    Select *pSel; 
e160: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74      /* Copy of t
e170: 68 65 20 53 45 4c 45 43 54 20 74 68 61 74 20 69  he SELECT that i
e180: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69  mplements the vi
e190: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72  ew */.  int nErr
e1a0: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d   = 0;     /* Num
e1b0: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e  ber of errors en
e1c0: 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69  countered */.  i
e1d0: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
e1e0: 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20   /* Temporarily 
e1f0: 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72  holds the number
e200: 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73 69   of cursors assi
e210: 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  gned */.  sqlite
e220: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
e230: 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65  db;  /* Database
e240: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20   connection for 
e250: 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f  malloc errors */
e260: 0a 20 20 69 6e 74 20 28 2a 78 41 75 74 68 29 28  .  int (*xAuth)(
e270: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
e280: 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72  char*,const char
e290: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  *,const char*,co
e2a0: 6e 73 74 20 63 68 61 72 2a 29 3b 0a 0a 20 20 61  nst char*);..  a
e2b0: 73 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b  ssert( pTable );
e2c0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
e2d0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
e2e0: 4c 45 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  LE.  if( sqlite3
e2f0: 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28  VtabCallConnect(
e300: 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 20  pParse, pTable) 
e310: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
e320: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
e330: 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
e340: 70 54 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e  pTable) ) return
e350: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   0;.#endif..#ifn
e360: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e370: 56 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69  VIEW.  /* A posi
e380: 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20  tive nCol means 
e390: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65  the columns name
e3a0: 73 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20  s for this view 
e3b0: 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79  are.  ** already
e3c0: 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69   known..  */.  i
e3d0: 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e  f( pTable->nCol>
e3e0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
e3f0: 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e   /* A negative n
e400: 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c  Col is a special
e410: 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20   marker meaning 
e420: 74 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72  that we are curr
e430: 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e  ently.  ** tryin
e440: 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  g to compute the
e450: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20   column names.  
e460: 49 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73  If we enter this
e470: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20   routine with.  
e480: 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43  ** a negative nC
e490: 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f  ol, it means two
e4a0: 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66   or more views f
e4b0: 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65  orm a loop, like
e4c0: 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   this:.  **.  **
e4d0: 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
e4e0: 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a   one AS SELECT *
e4f0: 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20   FROM two;.  ** 
e500: 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
e510: 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20  two AS SELECT * 
e520: 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20  FROM one;.  **. 
e530: 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68   ** Actually, th
e540: 65 20 65 72 72 6f 72 20 61 62 6f 76 65 20 69 73  e error above is
e550: 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f   now caught prio
e560: 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68  r to reaching th
e570: 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42  is point..  ** B
e580: 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ut the following
e590: 20 74 65 73 74 20 69 73 20 73 74 69 6c 6c 20 69   test is still i
e5a0: 6d 70 6f 72 74 61 6e 74 20 61 73 20 69 74 20 64  mportant as it d
e5b0: 6f 65 73 20 63 6f 6d 65 20 75 70 0a 20 20 2a 2a  oes come up.  **
e5c0: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
e5d0: 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20  g:.  ** .  **   
e5e0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6d    CREATE TABLE m
e5f0: 61 69 6e 2e 65 78 31 28 61 29 3b 0a 20 20 2a 2a  ain.ex1(a);.  **
e600: 20 20 20 20 20 43 52 45 41 54 45 20 54 45 4d 50       CREATE TEMP
e610: 20 56 49 45 57 20 65 78 31 20 41 53 20 53 45 4c   VIEW ex1 AS SEL
e620: 45 43 54 20 61 20 46 52 4f 4d 20 65 78 31 3b 0a  ECT a FROM ex1;.
e630: 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
e640: 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 65 78 31 3b  * FROM temp.ex1;
e650: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
e660: 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20  le->nCol<0 ){.  
e670: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
e680: 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 20  g(pParse, "view 
e690: 25 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79  %s is circularly
e6a0: 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c   defined", pTabl
e6b0: 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  e->zName);.    r
e6c0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61  eturn 1;.  }.  a
e6d0: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e  ssert( pTable->n
e6e0: 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Col>=0 );..  /* 
e6f0: 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
e700: 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20  ar, it means we 
e710: 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
e720: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e  the table names.
e730: 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
e740: 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
e750: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
e760: 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61  lect() will expa
e770: 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20  nd any.  ** "*" 
e780: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
e790: 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74  results set of t
e7a0: 68 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c  he view and will
e7b0: 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a   assign cursors.
e7c0: 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d    ** to the elem
e7d0: 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d  ents of the FROM
e7e0: 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65   clause.  But we
e7f0: 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65   do not want the
e800: 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20  se changes.  ** 
e810: 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e  to be permanent.
e820: 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61    So the computa
e830: 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20  tion is done on 
e840: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
e850: 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d  LECT.  ** statem
e860: 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
e870: 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a   the view..  */.
e880: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
e890: 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70  ->pSelect );.  p
e8a0: 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  Sel = sqlite3Sel
e8b0: 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 6c  ectDup(db, pTabl
e8c0: 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  e->pSelect, 0);.
e8d0: 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20    if( pSel ){.  
e8e0: 20 20 75 38 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61    u8 enableLooka
e8f0: 73 69 64 65 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61  side = db->looka
e900: 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 3b 0a 20  side.bEnabled;. 
e910: 20 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e     n = pParse->n
e920: 54 61 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Tab;.    sqlite3
e930: 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
e940: 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53 65  sors(pParse, pSe
e950: 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 70 54  l->pSrc);.    pT
e960: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b  able->nCol = -1;
e970: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
e980: 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b  de.bEnabled = 0;
e990: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e9a0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
e9b0: 4f 4e 0a 20 20 20 20 78 41 75 74 68 20 3d 20 64  ON.    xAuth = d
e9c0: 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20 64 62  b->xAuth;.    db
e9d0: 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20 20 20  ->xAuth = 0;.   
e9e0: 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
e9f0: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
ea00: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
ea10: 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68  );.    db->xAuth
ea20: 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a   = xAuth;.#else.
ea30: 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71      pSelTab = sq
ea40: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
ea50: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
ea60: 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Sel);.#endif.   
ea70: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
ea80: 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62 6c 65  Enabled = enable
ea90: 4c 6f 6f 6b 61 73 69 64 65 3b 0a 20 20 20 20 70  Lookaside;.    p
eaa0: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b  Parse->nTab = n;
eab0: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62  .    if( pSelTab
eac0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
ead0: 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d  ( pTable->aCol==
eae0: 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c  0 );.      pTabl
eaf0: 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->nCol = pSelTa
eb00: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70  b->nCol;.      p
eb10: 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53  Table->aCol = pS
eb20: 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
eb30: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
eb40: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c   = 0;.      pSel
eb50: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
eb60: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65       sqlite3Dele
eb70: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c  teTable(db, pSel
eb80: 54 61 62 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Tab);.      asse
eb90: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
eba0: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30  aMutexHeld(db, 0
ebb0: 2c 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d  , pTable->pSchem
ebc0: 61 29 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  a) );.      pTab
ebd0: 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6c 61  le->pSchema->fla
ebe0: 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74  gs |= DB_Unreset
ebf0: 56 69 65 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65  Views;.    }else
ec00: 7b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  {.      pTable->
ec10: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
ec20: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nErr++;.    }.  
ec30: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
ec40: 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 29 3b  elete(db, pSel);
ec50: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
ec60: 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 23 65 6e 64  nErr++;.  }.#end
ec70: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
ec80: 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75  T_VIEW */.  retu
ec90: 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e  rn nErr;  .}.#en
eca0: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
ecb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
ecc0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
ecd0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
ece0: 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e  LTABLE) */..#ifn
ecf0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ed00: 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  VIEW./*.** Clear
ed10: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
ed20: 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45  s from every VIE
ed30: 57 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 64  W in database id
ed40: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
ed50: 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  d sqliteViewRese
ed60: 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  tAll(sqlite3 *db
ed70: 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61  , int idx){.  Ha
ed80: 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73  shElem *i;.  ass
ed90: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
eda0: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
edb0: 69 64 78 2c 20 30 29 20 29 3b 0a 20 20 69 66 28  idx, 0) );.  if(
edc0: 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28   !DbHasProperty(
edd0: 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
ede0: 73 65 74 56 69 65 77 73 29 20 29 20 72 65 74 75  setViews) ) retu
edf0: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69  rn;.  for(i=sqli
ee00: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
ee10: 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d  >aDb[idx].pSchem
ee20: 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69  a->tblHash); i;i
ee30: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
ee40: 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  i)){.    Table *
ee50: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
ee60: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
ee70: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
ee80: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44  ){.      sqliteD
ee90: 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
eea0: 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
eeb0: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30    pTab->aCol = 0
eec0: 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43  ;.      pTab->nC
eed0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ol = 0;.    }.  
eee0: 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65  }.  DbClearPrope
eef0: 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
ef00: 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d  UnresetViews);.}
ef10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
ef20: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
ef30: 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f  ll(A,B).#endif /
ef40: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
ef50: 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  EW */../*.** Thi
ef60: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
ef70: 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44 42 45  lled by the VDBE
ef80: 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69   to adjust the i
ef90: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a  nternal schema.*
efa0: 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65  * used by SQLite
efb0: 20 77 68 65 6e 20 74 68 65 20 62 74 72 65 65 20   when the btree 
efc0: 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61  layer moves a ta
efd0: 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54  ble root page. T
efe0: 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20  he.** root-page 
eff0: 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  of a table or in
f000: 64 65 78 20 69 6e 20 64 61 74 61 62 61 73 65 20  dex in database 
f010: 69 44 62 20 68 61 73 20 63 68 61 6e 67 65 64 20  iDb has changed 
f020: 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f  from iFrom.** to
f030: 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b   iTo..**.** Tick
f040: 65 74 20 23 31 37 32 38 3a 20 20 54 68 65 20 73  et #1728:  The s
f050: 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68  ymbol table migh
f060: 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20  t still contain 
f070: 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f  information.** o
f080: 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20  n tables and/or 
f090: 69 6e 64 69 63 65 73 20 74 68 61 74 20 61 72 65  indices that are
f0a0: 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20   the process of 
f0b0: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a  being deleted..*
f0c0: 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c  * If you are unl
f0d0: 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f  ucky, one of tho
f0e0: 73 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63  se deleted indic
f0f0: 65 73 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67  es or tables mig
f100: 68 74 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73  ht.** have the s
f110: 61 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d  ame rootpage num
f120: 62 65 72 20 61 73 20 74 68 65 20 72 65 61 6c 20  ber as the real 
f130: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
f140: 68 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20  hat is.** being 
f150: 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61  moved.  So we ca
f160: 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68  nnot stop search
f170: 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 66 69  ing after the fi
f180: 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65  rst match .** be
f190: 63 61 75 73 65 20 74 68 65 20 66 69 72 73 74 20  cause the first 
f1a0: 6d 61 74 63 68 20 6d 69 67 68 74 20 62 65 20 66  match might be f
f1b0: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65  or one of the de
f1c0: 6c 65 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a  leted indices.**
f1d0: 20 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e   or tables and n
f1e0: 6f 74 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64  ot the table/ind
f1f0: 65 78 20 74 68 61 74 20 69 73 20 61 63 74 75 61  ex that is actua
f200: 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e  lly being moved.
f210: 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74  .** We must cont
f220: 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74  inue looping unt
f230: 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e  il all tables an
f240: 64 20 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a  d indices with.*
f250: 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f  * rootpage==iFro
f260: 6d 20 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76  m have been conv
f270: 65 72 74 65 64 20 74 6f 20 68 61 76 65 20 61 20  erted to have a 
f280: 72 6f 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a  rootpage of iTo.
f290: 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  ** in order to b
f2a0: 65 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 77  e certain that w
f2b0: 65 20 67 6f 74 20 74 68 65 20 72 69 67 68 74 20  e got the right 
f2c0: 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  one..*/.#ifndef 
f2d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
f2e0: 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69  VACUUM.void sqli
f2f0: 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64  te3RootPageMoved
f300: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
f310: 74 20 69 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d  t iDb, int iFrom
f320: 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61  , int iTo){.  Ha
f330: 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20  shElem *pElem;. 
f340: 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 20 20   Hash *pHash;.  
f350: 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65  Db *pDb;..  asse
f360: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
f370: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
f380: 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 44 62 20  Db, 0) );.  pDb 
f390: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
f3a0: 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d  .  pHash = &pDb-
f3b0: 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
f3c0: 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  h;.  for(pElem=s
f3d0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70  qliteHashFirst(p
f3e0: 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
f3f0: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
f400: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
f410: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
f420: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
f430: 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  em);.    if( pTa
f440: 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29  b->tnum==iFrom )
f450: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e  {.      pTab->tn
f460: 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a  um = iTo;.    }.
f470: 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70    }.  pHash = &p
f480: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db->pSchema->idx
f490: 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65  Hash;.  for(pEle
f4a0: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
f4b0: 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b  t(pHash); pElem;
f4c0: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
f4d0: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
f4e0: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
f4f0: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
f500: 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20  pElem);.    if( 
f510: 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f  pIdx->tnum==iFro
f520: 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  m ){.      pIdx-
f530: 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20  >tnum = iTo;.   
f540: 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
f550: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64  ./*.** Write cod
f560: 65 20 74 6f 20 65 72 61 73 65 20 74 68 65 20 74  e to erase the t
f570: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
f580: 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20  age iTable from 
f590: 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a  database iDb..**
f5a0: 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65   Also write code
f5b0: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73   to modify the s
f5c0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
f5d0: 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20  le and internal 
f5e0: 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72  schema.** if a r
f5f0: 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74  oot-page of anot
f600: 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76  her table is mov
f610: 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 2d  ed by the btree-
f620: 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20  layer whilst.** 
f630: 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28  erasing iTable (
f640: 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
f650: 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63  with an auto-vac
f660: 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a  uum database)..*
f670: 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  / .static void d
f680: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50  estroyRootPage(P
f690: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
f6a0: 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44  t iTable, int iD
f6b0: 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
f6c0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
f6d0: 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 31  Parse);.  int r1
f6e0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
f6f0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
f700: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f710: 33 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c  3(v, OP_Destroy,
f720: 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 69 44 62   iTable, r1, iDb
f730: 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61 79 41  );.  sqlite3MayA
f740: 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 23 69  bort(pParse);.#i
f750: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f760: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
f770: 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 73 74 6f  * OP_Destroy sto
f780: 72 65 73 20 61 6e 20 69 6e 20 69 6e 74 65 67 65  res an in intege
f790: 72 20 72 31 2e 20 49 66 20 74 68 69 73 20 69 6e  r r1. If this in
f7a0: 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f  teger.  ** is no
f7b0: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20  n-zero, then it 
f7c0: 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
f7d0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74 61 62   number of a tab
f7e0: 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a  le moved to.  **
f7f0: 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c 65   location iTable
f800: 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
f810: 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20 74 68  code modifies th
f820: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
f830: 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65  table to.  ** re
f840: 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a  flect this..  **
f850: 0a 20 20 2a 2a 20 54 68 65 20 22 23 4e 4e 4e 22  .  ** The "#NNN"
f860: 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20 61   in the SQL is a
f870: 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e   special constan
f880: 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68 61  t that means wha
f890: 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a  tever value.  **
f8a0: 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72 20   is in register 
f8b0: 4e 4e 4e 2e 20 20 53 65 65 20 67 72 61 6d 6d 61  NNN.  See gramma
f8c0: 72 20 72 75 6c 65 73 20 61 73 73 6f 63 69 61 74  r rules associat
f8d0: 65 64 20 77 69 74 68 20 74 68 65 20 54 4b 5f 52  ed with the TK_R
f8e0: 45 47 49 53 54 45 52 0a 20 20 2a 2a 20 74 6f 6b  EGISTER.  ** tok
f8f0: 65 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  en for additiona
f900: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20  l information.. 
f910: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73   */.  sqlite3Nes
f920: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
f930: 20 0a 20 20 20 20 20 22 55 50 44 41 54 45 20 25   .     "UPDATE %
f940: 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70 61 67  Q.%s SET rootpag
f950: 65 3d 25 64 20 57 48 45 52 45 20 23 25 64 20 41  e=%d WHERE #%d A
f960: 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 22  ND rootpage=#%d"
f970: 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  ,.     pParse->d
f980: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
f990: 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
f9a0: 69 44 62 29 2c 20 69 54 61 62 6c 65 2c 20 72 31  iDb), iTable, r1
f9b0: 2c 20 72 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20  , r1);.#endif.  
f9c0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
f9d0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
f9e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  );.}../*.** Writ
f9f0: 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65  e VDBE code to e
fa00: 72 61 73 65 20 74 61 62 6c 65 20 70 54 61 62 20  rase table pTab 
fa10: 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74  and all associat
fa20: 65 64 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69  ed indices on di
fa30: 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75  sk..** Code to u
fa40: 70 64 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  pdate the sqlite
fa50: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20 61  _master tables a
fa60: 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  nd internal sche
fa70: 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a  ma definitions.*
fa80: 2a 20 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74  * in case a root
fa90: 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20  -page belonging 
faa0: 74 6f 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65  to another table
fab0: 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65   is moved by the
fac0: 20 62 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20   btree layer.** 
fad0: 69 73 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74  is also added (t
fae0: 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77  his can happen w
faf0: 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ith an auto-vacu
fb00: 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  um database)..*/
fb10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73  .static void des
fb20: 74 72 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20  troyTable(Parse 
fb30: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
fb40: 70 54 61 62 29 7b 0a 23 69 66 64 65 66 20 53 51  pTab){.#ifdef SQ
fb50: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
fb60: 43 55 55 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49  CUUM.  Index *pI
fb70: 64 78 3b 0a 20 20 69 6e 74 20 69 44 62 20 3d 20  dx;.  int iDb = 
fb80: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
fb90: 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
fba0: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
fbb0: 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61  .  destroyRootPa
fbc0: 67 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  ge(pParse, pTab-
fbd0: 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 66  >tnum, iDb);.  f
fbe0: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
fbf0: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
fc00: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
fc10: 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61     destroyRootPa
fc20: 67 65 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d  ge(pParse, pIdx-
fc30: 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d  >tnum, iDb);.  }
fc40: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74  .#else.  /* If t
fc50: 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
fc60: 62 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  be auto-vacuum c
fc70: 61 70 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54  apable (if SQLIT
fc80: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
fc90: 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65  M.  ** is not de
fca0: 66 69 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20  fined), then it 
fcb0: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
fcc0: 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20  call OP_Destroy 
fcd0: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c  on the.  ** tabl
fce0: 65 20 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74  e and index root
fcf0: 2d 70 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c  -pages in order,
fd00: 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74   starting with t
fd10: 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a  he numerically .
fd20: 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f    ** largest roo
fd30: 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54  t-page number. T
fd40: 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20 74  his guarantees t
fd50: 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hat none of the 
fd60: 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20  root-pages.  ** 
fd70: 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  to be destroyed 
fd80: 69 73 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20  is relocated by 
fd90: 61 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65  an earlier OP_De
fda0: 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74  stroy. i.e. if t
fdb0: 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  he.  ** followin
fdc0: 67 20 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20  g were coded:.  
fdd0: 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72  **.  ** OP_Destr
fde0: 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a  oy 4 0.  ** ....
fdf0: 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    ** OP_Destroy 
fe00: 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e  5 0.  **.  ** an
fe10: 64 20 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61  d root page 5 ha
fe20: 70 70 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65  ppened to be the
fe30: 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
fe40: 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  ge number in the
fe50: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20  .  ** database, 
fe60: 74 68 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35  then root page 5
fe70: 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20   would be moved 
fe80: 74 6f 20 70 61 67 65 20 34 20 62 79 20 74 68 65  to page 4 by the
fe90: 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72   .  ** "OP_Destr
fea0: 6f 79 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20  oy 4 0" opcode. 
feb0: 54 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 22  The subsequent "
fec0: 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20  OP_Destroy 5 0" 
fed0: 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61  would hit.  ** a
fee0: 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e   free-list page.
fef0: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  .  */.  int iTab
ff00: 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20   = pTab->tnum;. 
ff10: 20 69 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20   int iDestroyed 
ff20: 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31  = 0;..  while( 1
ff30: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
ff40: 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61  Idx;.    int iLa
ff50: 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20  rgest = 0;..    
ff60: 69 66 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d  if( iDestroyed==
ff70: 30 20 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72  0 || iTab<iDestr
ff80: 6f 79 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c  oyed ){.      iL
ff90: 61 72 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20  argest = iTab;. 
ffa0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64     }.    for(pId
ffb0: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
ffc0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
ffd0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
ffe0: 6e 74 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e  nt iIdx = pIdx->
fff0: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65  tnum;.      asse
10000 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d  rt( pIdx->pSchem
10010 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
10020 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   );.      if( (i
10030 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20  Destroyed==0 || 
10040 28 69 49 64 78 3c 69 44 65 73 74 72 6f 79 65 64  (iIdx<iDestroyed
10050 29 29 20 26 26 20 69 49 64 78 3e 69 4c 61 72 67  )) && iIdx>iLarg
10060 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  est ){.        i
10070 4c 61 72 67 65 73 74 20 3d 20 69 49 64 78 3b 0a  Largest = iIdx;.
10080 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10090 20 20 69 66 28 20 69 4c 61 72 67 65 73 74 3d 3d    if( iLargest==
100a0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
100b0 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  n;.    }else{.  
100c0 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
100d0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
100e0 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
100f0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
10100 20 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62       assert( iDb
10110 3e 3d 30 20 26 26 20 69 44 62 3c 70 50 61 72 73  >=0 && iDb<pPars
10120 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  e->db->nDb );.  
10130 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
10140 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72  age(pParse, iLar
10150 67 65 73 74 2c 20 69 44 62 29 3b 0a 20 20 20 20  gest, iDb);.    
10160 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69    iDestroyed = i
10170 4c 61 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20  Largest;.    }. 
10180 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
10190 2a 2a 20 52 65 6d 6f 76 65 20 65 6e 74 72 69 65  ** Remove entrie
101a0 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74  s from the sqlit
101b0 65 5f 73 74 61 74 4e 20 74 61 62 6c 65 73 20 28  e_statN tables (
101c0 66 6f 72 20 4e 20 69 6e 20 28 31 2c 32 2c 33 29  for N in (1,2,3)
101d0 29 0a 2a 2a 20 61 66 74 65 72 20 61 20 44 52 4f  ).** after a DRO
101e0 50 20 49 4e 44 45 58 20 6f 72 20 44 52 4f 50 20  P INDEX or DROP 
101f0 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TABLE command..*
10200 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
10210 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61  lite3ClearStatTa
10220 62 6c 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  bles(.  Parse *p
10230 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
10240 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
10250 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntext */.  int i
10260 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
10270 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
10280 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 6f  e number */.  co
10290 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c  nst char *zType,
102a0 20 20 20 20 20 2f 2a 20 22 69 64 78 22 20 6f 72       /* "idx" or
102b0 20 22 74 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73   "tbl" */.  cons
102c0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20  t char *zName   
102d0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 69 6e     /* Name of in
102e0 64 65 78 20 6f 72 20 74 61 62 6c 65 20 2a 2f 0a  dex or table */.
102f0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  ){.  int i;.  co
10300 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
10310 65 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  e = pParse->db->
10320 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
10330 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 34 3b    for(i=1; i<=4;
10340 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
10350 7a 54 61 62 5b 32 34 5d 3b 0a 20 20 20 20 73 71  zTab[24];.    sq
10360 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
10370 69 7a 65 6f 66 28 7a 54 61 62 29 2c 7a 54 61 62  izeof(zTab),zTab
10380 2c 22 73 71 6c 69 74 65 5f 73 74 61 74 25 64 22  ,"sqlite_stat%d"
10390 2c 69 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ,i);.    if( sql
103a0 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50  ite3FindTable(pP
103b0 61 72 73 65 2d 3e 64 62 2c 20 7a 54 61 62 2c 20  arse->db, zTab, 
103c0 7a 44 62 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  zDbName) ){.    
103d0 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
103e0 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
103f0 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
10400 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 25 73  M %Q.%s WHERE %s
10410 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 7a 44  =%Q",.        zD
10420 62 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 7a 54 79  bName, zTab, zTy
10430 70 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20  pe, zName.      
10440 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
10450 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
10460 6f 64 65 20 74 6f 20 64 72 6f 70 20 61 20 74 61  ode to drop a ta
10470 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
10480 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c  ite3CodeDropTabl
10490 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
104a0 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e   Table *pTab, in
104b0 74 20 69 44 62 2c 20 69 6e 74 20 69 73 56 69 65  t iDb, int isVie
104c0 77 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  w){.  Vdbe *v;. 
104d0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
104e0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 54 72 69  Parse->db;.  Tri
104f0 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a  gger *pTrigger;.
10500 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
10510 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 76 20  >aDb[iDb];..  v 
10520 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
10530 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
10540 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71  rt( v!=0 );.  sq
10550 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
10560 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
10570 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64   1, iDb);..#ifnd
10580 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
10590 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
105a0 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
105b0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
105c0 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
105d0 5f 56 42 65 67 69 6e 29 3b 0a 20 20 7d 0a 23 65  _VBegin);.  }.#e
105e0 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20  ndif..  /* Drop 
105f0 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73 73  all triggers ass
10600 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
10610 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
10620 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 2a 2a 20  pped. Code.  ** 
10630 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  is generated to 
10640 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66  remove entries f
10650 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  rom sqlite_maste
10660 72 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73 71  r and/or.  ** sq
10670 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
10680 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20   if required..  
10690 2a 2f 0a 20 20 70 54 72 69 67 67 65 72 20 3d 20  */.  pTrigger = 
106a0 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 4c 69  sqlite3TriggerLi
106b0 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  st(pParse, pTab)
106c0 3b 0a 20 20 77 68 69 6c 65 28 20 70 54 72 69 67  ;.  while( pTrig
106d0 67 65 72 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ger ){.    asser
106e0 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63  t( pTrigger->pSc
106f0 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
10700 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ema || .        
10710 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d  pTrigger->pSchem
10720 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  a==db->aDb[1].pS
10730 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c  chema );.    sql
10740 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 50  ite3DropTriggerP
10750 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69 67  tr(pParse, pTrig
10760 67 65 72 29 3b 0a 20 20 20 20 70 54 72 69 67 67  ger);.    pTrigg
10770 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70  er = pTrigger->p
10780 4e 65 78 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  Next;.  }..#ifnd
10790 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
107a0 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f  UTOINCREMENT.  /
107b0 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74  * Remove any ent
107c0 72 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69  ries of the sqli
107d0 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
107e0 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
107f0 68 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65  h.  ** the table
10800 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20   being dropped. 
10810 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66  This is done bef
10820 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20 69 73  ore the table is
10830 20 64 72 6f 70 70 65 64 0a 20 20 2a 2a 20 61 74   dropped.  ** at
10840 20 74 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c   the btree level
10850 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 71  , in case the sq
10860 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
10870 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 2a  ble needs to.  *
10880 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75  * move as a resu
10890 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28  lt of the drop (
108a0 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75  can happen in au
108b0 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e  to-vacuum mode).
108c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
108d0 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
108e0 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b  Autoincrement ){
108f0 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
10900 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
10910 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
10920 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71  OM %Q.sqlite_seq
10930 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d 65  uence WHERE name
10940 3d 25 51 22 2c 0a 20 20 20 20 20 20 70 44 62 2d  =%Q",.      pDb-
10950 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e  >zName, pTab->zN
10960 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23  ame.    );.  }.#
10970 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70  endif..  /* Drop
10980 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54   all SQLITE_MAST
10990 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64  ER table and ind
109a0 65 78 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ex entries that 
109b0 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20 2a  refer to the.  *
109c0 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f  * table. The pro
109d0 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20  gram name loops 
109e0 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74  through the mast
109f0 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c  er table and del
10a00 65 74 65 73 0a 20 20 2a 2a 20 65 76 65 72 79 20  etes.  ** every 
10a10 72 6f 77 20 74 68 61 74 20 72 65 66 65 72 73 20  row that refers 
10a20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68  to a table of th
10a30 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74  e same name as t
10a40 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a  he one being.  *
10a50 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67  * dropped. Trigg
10a60 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20  ers are handled 
10a70 73 65 70 61 72 61 74 65 6c 79 20 62 65 63 61 75  separately becau
10a80 73 65 20 61 20 74 72 69 67 67 65 72 20 63 61 6e  se a trigger can
10a90 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64   be.  ** created
10aa0 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74   in the temp dat
10ab0 61 62 61 73 65 20 74 68 61 74 20 72 65 66 65 72  abase that refer
10ac0 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20  s to a table in 
10ad0 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 64 61 74  another.  ** dat
10ae0 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  abase..  */.  sq
10af0 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
10b00 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
10b10 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
10b20 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d  %s WHERE tbl_nam
10b30 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27  e=%Q and type!='
10b40 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20  trigger'",.     
10b50 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48   pDb->zName, SCH
10b60 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20  EMA_TABLE(iDb), 
10b70 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
10b80 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20 21  if( !isView && !
10b90 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
10ba0 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 54 61  ){.    destroyTa
10bb0 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
10bc0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d  );.  }..  /* Rem
10bd0 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 65 6e  ove the table en
10be0 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65 27  try from SQLite'
10bf0 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  s internal schem
10c00 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20 2a  a and modify.  *
10c10 2a 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  * the schema coo
10c20 6b 69 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  kie..  */.  if( 
10c30 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
10c40 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
10c50 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56  beAddOp4(v, OP_V
10c60 44 65 73 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c  Destroy, iDb, 0,
10c70 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   0, pTab->zName,
10c80 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
10c90 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
10ca0 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69 44  OP_DropTable, iD
10cb0 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  b, 0, 0, pTab->z
10cc0 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Name, 0);.  sqli
10cd0 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
10ce0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
10cf0 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
10d00 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a  ll(db, iDb);.}..
10d10 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
10d20 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
10d30 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61  do the work of a
10d40 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74   DROP TABLE stat
10d50 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20  ement..** pName 
10d60 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
10d70 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64  he table to be d
10d80 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  ropped..*/.void 
10d90 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65  sqlite3DropTable
10da0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
10db0 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20  SrcList *pName, 
10dc0 69 6e 74 20 69 73 56 69 65 77 2c 20 69 6e 74 20  int isView, int 
10dd0 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c 65 20  noErr){.  Table 
10de0 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20 2a 76  *pTab;.  Vdbe *v
10df0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
10e00 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
10e10 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20  int iDb;..  if( 
10e20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
10e30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
10e40 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
10e50 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  }.  assert( pPar
10e60 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20  se->nErr==0 );. 
10e70 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e   assert( pName->
10e80 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28  nSrc==1 );.  if(
10e90 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70   noErr ) db->sup
10ea0 70 72 65 73 73 45 72 72 2b 2b 3b 0a 20 20 70 54  pressErr++;.  pT
10eb0 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
10ec0 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72  teTableItem(pPar
10ed0 73 65 2c 20 69 73 56 69 65 77 2c 20 26 70 4e 61  se, isView, &pNa
10ee0 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 69 66 28  me->a[0]);.  if(
10ef0 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70   noErr ) db->sup
10f00 70 72 65 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69  pressErr--;..  i
10f10 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
10f20 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 73 71    if( noErr ) sq
10f30 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e  lite3CodeVerifyN
10f40 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72 73  amedSchema(pPars
10f50 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
10f60 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 67  Database);.    g
10f70 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
10f80 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d  ble;.  }.  iDb =
10f90 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
10fa0 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
10fb0 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65  pSchema);.  asse
10fc0 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
10fd0 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20  b<db->nDb );..  
10fe0 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20 61 20  /* If pTab is a 
10ff0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 63  virtual table, c
11000 61 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c 75 6d  all ViewGetColum
11010 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e 73 75  nNames() to ensu
11020 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 69 6e  re.  ** it is in
11030 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
11040 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
11050 70 54 61 62 29 20 26 26 20 73 71 6c 69 74 65 33  pTab) && sqlite3
11060 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
11070 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
11080 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
11090 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
110a0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
110b0 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
110c0 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ION.  {.    int 
110d0 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  code;.    const 
110e0 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48  char *zTab = SCH
110f0 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a  EMA_TABLE(iDb);.
11100 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
11110 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
11120 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  b].zName;.    co
11130 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20  nst char *zArg2 
11140 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  = 0;.    if( sql
11150 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
11160 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
11170 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
11180 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  b)){.      goto 
11190 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
111a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
111b0 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
111c0 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
111d0 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
111e0 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
111f0 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45  TE_DROP_TEMP_VIE
11200 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  W;.      }else{.
11210 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
11220 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b  QLITE_DROP_VIEW;
11230 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
11240 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
11250 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65  TUALTABLE.    }e
11260 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61  lse if( IsVirtua
11270 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
11280 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
11290 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20  ROP_VTABLE;.    
112a0 20 20 7a 41 72 67 32 20 3d 20 73 71 6c 69 74 65    zArg2 = sqlite
112b0 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
112c0 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d  Tab)->pMod->zNam
112d0 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  e;.#endif.    }e
112e0 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
112f0 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
11300 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
11310 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
11320 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a  ROP_TEMP_TABLE;.
11330 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11340 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
11350 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20  TE_DROP_TABLE;. 
11360 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
11370 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
11380 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
11390 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  de, pTab->zName,
113a0 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a   zArg2, zDb) ){.
113b0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
113c0 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
113d0 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
113e0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
113f0 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
11400 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
11410 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
11420 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
11430 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  able;.    }.  }.
11440 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c  #endif.  if( sql
11450 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61  ite3StrNICmp(pTa
11460 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  b->zName, "sqlit
11470 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20  e_", 7)==0 .    
11480 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
11490 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  mp(pTab->zName, 
114a0 22 73 71 6c 69 74 65 5f 73 74 61 74 22 2c 20 31  "sqlite_stat", 1
114b0 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  1)!=0 ){.    sql
114c0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
114d0 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
114e0 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  ay not be droppe
114f0 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
11500 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
11510 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
11520 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11530 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45  OMIT_VIEW.  /* E
11540 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45  nsure DROP TABLE
11550 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20   is not used on 
11560 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50  a view, and DROP
11570 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65   VIEW is not use
11580 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c  d.  ** on a tabl
11590 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  e..  */.  if( is
115a0 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53  View && pTab->pS
115b0 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
115c0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
115d0 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
115e0 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74  P TABLE to delet
115f0 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61  e table %s", pTa
11600 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
11610 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
11620 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  ble;.  }.  if( !
11630 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e  isView && pTab->
11640 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
11650 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
11660 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50  Parse, "use DROP
11670 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20   VIEW to delete 
11680 76 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e  view %s", pTab->
11690 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
116a0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
116b0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
116c0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
116d0 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74   to remove the t
116e0 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61  able from the ma
116f0 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20  ster table.  ** 
11700 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
11710 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
11720 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
11730 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
11740 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
11750 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
11760 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
11770 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65  e3ClearStatTable
11780 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  s(pParse, iDb, "
11790 74 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  tbl", pTab->zNam
117a0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  e);.    sqlite3F
117b0 6b 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73  kDropTable(pPars
117c0 65 2c 20 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b  e, pName, pTab);
117d0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
117e0 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65  DropTable(pParse
117f0 2c 20 70 54 61 62 2c 20 69 44 62 2c 20 69 73 56  , pTab, iDb, isV
11800 69 65 77 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f  iew);.  }..exit_
11810 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71  drop_table:.  sq
11820 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
11830 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d  te(db, pName);.}
11840 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
11850 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
11860 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66  o create a new f
11870 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68  oreign key on th
11880 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65  e table.** curre
11890 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
118a0 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43  ruction.  pFromC
118b0 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  ol determines wh
118c0 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69  ich columns.** i
118d0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  n the current ta
118e0 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ble point to the
118f0 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49   foreign key.  I
11900 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68  f pFromCol==0 th
11910 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68  en.** connect th
11920 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73  e key to the las
11930 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65  t column inserte
11940 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e  d.  pTo is the n
11950 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61  ame of.** the ta
11960 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e  ble referred to.
11970 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69    pToCol is a li
11980 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  st of tables in 
11990 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f  the other.** pTo
119a0 20 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20   table that the 
119b0 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e  foreign key poin
119c0 74 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f  ts to.  flags co
119d0 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e  ntains all.** in
119e0 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
119f0 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73  the conflict res
11a00 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
11a10 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  ms specified.** 
11a20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45  in the ON DELETE
11a30 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20  , ON UPDATE and 
11a40 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65  ON INSERT clause
11a50 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79  s..**.** An FKey
11a60 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72   structure is cr
11a70 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64 20  eated and added 
11a80 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
11a90 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20  rently.** under 
11aa0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20  construction in 
11ab0 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  the pParse->pNew
11ac0 54 61 62 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a  Table field..**.
11ad0 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b  ** The foreign k
11ae0 65 79 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d  ey is set for IM
11af0 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73 73 69  MEDIATE processi
11b00 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e  ng.  A subsequen
11b10 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c  t call.** to sql
11b20 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
11b30 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e  Key() might chan
11b40 67 65 20 74 68 69 73 20 74 6f 20 44 45 46 45 52  ge this to DEFER
11b50 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  RED..*/.void sql
11b60 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 69 67  ite3CreateForeig
11b70 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70  nKey(.  Parse *p
11b80 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
11b90 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
11ba0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
11bb0 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c  FromCol,  /* Col
11bc0 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62  umns in this tab
11bd0 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  le that point to
11be0 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
11bf0 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20    Token *pTo,   
11c00 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
11c10 66 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c  f the other tabl
11c20 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
11c30 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43  *pToCol,    /* C
11c40 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74  olumns in the ot
11c50 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  her table */.  i
11c60 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
11c70 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20      /* Conflict 
11c80 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72  resolution algor
11c90 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73  ithms. */.){.  s
11ca0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
11cb0 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66  rse->db;.#ifndef
11cc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
11cd0 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20  EIGN_KEY.  FKey 
11ce0 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 46 4b  *pFKey = 0;.  FK
11cf0 65 79 20 2a 70 4e 65 78 74 54 6f 3b 0a 20 20 54  ey *pNextTo;.  T
11d00 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65  able *p = pParse
11d10 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
11d20 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
11d30 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20  i;.  int nCol;. 
11d40 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73   char *z;..  ass
11d50 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20  ert( pTo!=0 );. 
11d60 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 49 4e 5f   if( p==0 || IN_
11d70 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67  DECLARE_VTAB ) g
11d80 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66  oto fk_end;.  if
11d90 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b  ( pFromCol==0 ){
11da0 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  .    int iCol = 
11db0 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69  p->nCol-1;.    i
11dc0 66 28 20 4e 45 56 45 52 28 69 43 6f 6c 3c 30 29  f( NEVER(iCol<0)
11dd0 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
11de0 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26      if( pToCol &
11df0 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21  & pToCol->nExpr!
11e00 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
11e10 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
11e20 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79  se, "foreign key
11e30 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20   on %s".        
11e40 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65   " should refere
11e50 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c  nce only one col
11e60 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22  umn of table %T"
11e70 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43  ,.         p->aC
11e80 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20  ol[iCol].zName, 
11e90 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  pTo);.      goto
11ea0 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20   fk_end;.    }. 
11eb0 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d     nCol = 1;.  }
11ec0 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20  else if( pToCol 
11ed0 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72  && pToCol->nExpr
11ee0 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70  !=pFromCol->nExp
11ef0 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
11f00 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11f10 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72  .        "number
11f20 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66   of columns in f
11f30 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20  oreign key does 
11f40 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75  not match the nu
11f50 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20  mber of ".      
11f60 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68    "columns in th
11f70 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  e referenced tab
11f80 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66  le");.    goto f
11f90 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  k_end;.  }else{.
11fa0 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d      nCol = pFrom
11fb0 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a  Col->nExpr;.  }.
11fc0 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
11fd0 28 2a 70 46 4b 65 79 29 20 2b 20 28 6e 43 6f 6c  (*pFKey) + (nCol
11fe0 2d 31 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79  -1)*sizeof(pFKey
11ff0 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f  ->aCol[0]) + pTo
12000 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70  ->n + 1;.  if( p
12010 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72  ToCol ){.    for
12020 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e  (i=0; i<pToCol->
12030 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
12040 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69     nByte += sqli
12050 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43  te3Strlen30(pToC
12060 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20  ol->a[i].zName) 
12070 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  + 1;.    }.  }. 
12080 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   pFKey = sqlite3
12090 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
120a0 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
120b0 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20  pFKey==0 ){.    
120c0 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d  goto fk_end;.  }
120d0 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20  .  pFKey->pFrom 
120e0 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e  = p;.  pFKey->pN
120f0 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b  extFrom = p->pFK
12100 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a  ey;.  z = (char*
12110 29 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43  )&pFKey->aCol[nC
12120 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54  ol];.  pFKey->zT
12130 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28  o = z;.  memcpy(
12140 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e  z, pTo->z, pTo->
12150 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20  n);.  z[pTo->n] 
12160 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  = 0;.  sqlite3De
12170 71 75 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d  quote(z);.  z +=
12180 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b   pTo->n+1;.  pFK
12190 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b  ey->nCol = nCol;
121a0 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d  .  if( pFromCol=
121b0 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d  =0 ){.    pFKey-
121c0 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d  >aCol[0].iFrom =
121d0 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65   p->nCol-1;.  }e
121e0 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  lse{.    for(i=0
121f0 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
12200 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
12210 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
12220 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
12230 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
12240 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b  StrICmp(p->aCol[
12250 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43  j].zName, pFromC
12260 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  ol->a[i].zName)=
12270 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
12280 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  pFKey->aCol[i].i
12290 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20  From = j;.      
122a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
122b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
122c0 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f     if( j>=p->nCo
122d0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
122e0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
122f0 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
12300 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20  "unknown column 
12310 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67  \"%s\" in foreig
12320 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
12330 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46  ", .          pF
12340 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
12350 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
12360 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20  o fk_end;.      
12370 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
12380 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
12390 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
123a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
123b0 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
123c0 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  en30(pToCol->a[i
123d0 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
123e0 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  pFKey->aCol[i].z
123f0 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d  Col = z;.      m
12400 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d  emcpy(z, pToCol-
12410 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b  >a[i].zName, n);
12420 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b  .      z[n] = 0;
12430 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b  .      z += n+1;
12440 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
12450 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
12460 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63   0;.  pFKey->aAc
12470 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28 66  tion[0] = (u8)(f
12480 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20 20 20  lags & 0xff);   
12490 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 44           /* ON D
124a0 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a  ELETE action */.
124b0 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e    pFKey->aAction
124c0 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c 61 67  [1] = (u8)((flag
124d0 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 29  s >> 8 ) & 0xff)
124e0 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54  ;    /* ON UPDAT
124f0 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61  E action */..  a
12500 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
12510 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
12520 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  , 0, p->pSchema)
12530 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d 20   );.  pNextTo = 
12540 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65 33 48  (FKey *)sqlite3H
12550 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53  ashInsert(&p->pS
12560 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c  chema->fkeyHash,
12570 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a   .      pFKey->z
12580 54 6f 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  To, sqlite3Strle
12590 6e 33 30 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2c  n30(pFKey->zTo),
125a0 20 28 76 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20   (void *)pFKey. 
125b0 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 78 74 54   );.  if( pNextT
125c0 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a 20 20 20 20  o==pFKey ){.    
125d0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
125e0 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 66   = 1;.    goto f
125f0 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  k_end;.  }.  if(
12600 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20 20 20   pNextTo ){.    
12610 61 73 73 65 72 74 28 20 70 4e 65 78 74 54 6f 2d  assert( pNextTo-
12620 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20  >pPrevTo==0 );. 
12630 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54     pFKey->pNextT
12640 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20  o = pNextTo;.   
12650 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54   pNextTo->pPrevT
12660 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a  o = pFKey;.  }..
12670 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f    /* Link the fo
12680 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65  reign key to the
12690 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61   table as the la
126a0 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20  st step..  */.  
126b0 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79  p->pFKey = pFKey
126c0 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a  ;.  pFKey = 0;..
126d0 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65  fk_end:.  sqlite
126e0 33 44 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65  3DbFree(db, pFKe
126f0 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  y);.#endif /* !d
12700 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
12710 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20  IT_FOREIGN_KEY) 
12720 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
12730 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
12740 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  FromCol);.  sqli
12750 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
12760 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d  e(db, pToCol);.}
12770 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
12780 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
12790 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59  hen an INITIALLY
127a0 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e   IMMEDIATE or IN
127b0 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
127c0 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65  .** clause is se
127d0 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  en as part of a 
127e0 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
127f0 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44  nition.  The isD
12800 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d  eferred.** param
12810 65 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e  eter is 1 for IN
12820 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
12830 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49   and 0 for INITI
12840 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a  ALLY IMMEDIATE..
12850 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20  ** The behavior 
12860 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
12870 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72  ntly created for
12880 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75  eign key is adju
12890 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e  sted.** accordin
128a0 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  gly..*/.void sql
128b0 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
128c0 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  Key(Parse *pPars
128d0 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65  e, int isDeferre
128e0 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  d){.#ifndef SQLI
128f0 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
12900 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  KEY.  Table *pTa
12910 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  b;.  FKey *pFKey
12920 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20  ;.  if( (pTab = 
12930 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
12940 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20  e)==0 || (pFKey 
12950 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d  = pTab->pFKey)==
12960 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
12970 73 65 72 74 28 20 69 73 44 65 66 65 72 72 65 64  sert( isDeferred
12980 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65 72 72 65  ==0 || isDeferre
12990 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52  d==1 ); /* EV: R
129a0 2d 33 30 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a  -30323-21917 */.
129b0 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72    pFKey->isDefer
129c0 72 65 64 20 3d 20 28 75 38 29 69 73 44 65 66 65  red = (u8)isDefe
129d0 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rred;.#endif.}..
129e0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
129f0 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72  ode that will er
12a00 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69  ase and refill i
12a10 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69  ndex *pIdx.  Thi
12a20 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  s is.** used to 
12a30 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77  initialize a new
12a40 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 65 78  ly created index
12a50 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65   or to recompute
12a60 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
12a70 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72  of an index in r
12a80 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49  esponse to a REI
12a90 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  NDEX command..**
12aa0 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61  .** if memRootPa
12ab0 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69  ge is not negati
12ac0 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ve, it means tha
12ad0 74 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e  t the index is n
12ae0 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e  ewly.** created.
12af0 20 20 54 68 65 20 72 65 67 69 73 74 65 72 20 73    The register s
12b00 70 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52  pecified by memR
12b10 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  ootPage contains
12b20 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
12b30 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
12b40 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f  index.  If memRo
12b50 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  otPage is negati
12b60 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ve, then.** the 
12b70 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
12b80 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65  ists and must be
12b90 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20   cleared before 
12ba0 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61  being refilled a
12bb0 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70  nd.** the root p
12bc0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
12bd0 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e  e index is taken
12be0 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e   from pIndex->tn
12bf0 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  um..*/.static vo
12c00 69 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c  id sqlite3Refill
12c10 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
12c20 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64  rse, Index *pInd
12c30 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50  ex, int memRootP
12c40 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  age){.  Table *p
12c50 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54  Tab = pIndex->pT
12c60 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61  able;  /* The ta
12c70 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64 65  ble that is inde
12c80 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  xed */.  int iTa
12c90 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
12ca0 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65  ++;     /* Btree
12cb0 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   cursor used for
12cc0 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69   pTab */.  int i
12cd0 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
12ce0 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72  ab++;     /* Btr
12cf0 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
12d00 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69  or pIndex */.  i
12d10 6e 74 20 69 53 6f 72 74 65 72 3b 20 20 20 20 20  nt iSorter;     
12d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12d30 20 43 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 62   Cursor opened b
12d40 79 20 4f 70 65 6e 53 6f 72 74 65 72 20 28 69 66  y OpenSorter (if
12d50 20 69 6e 20 75 73 65 29 20 2a 2f 0a 20 20 69 6e   in use) */.  in
12d60 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20  t addr1;        
12d70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12d80 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f  Address of top o
12d90 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  f loop */.  int 
12da0 61 64 64 72 32 3b 20 20 20 20 20 20 20 20 20 20  addr2;          
12db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
12dc0 64 72 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f  dress to jump to
12dd0 20 66 6f 72 20 6e 65 78 74 20 69 74 65 72 61 74   for next iterat
12de0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75  ion */.  int tnu
12df0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
12e00 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
12e10 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  page of index */
12e20 0a 20 20 69 6e 74 20 69 50 61 72 74 49 64 78 4c  .  int iPartIdxL
12e30 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  abel;           
12e40 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69    /* Jump to thi
12e50 73 20 6c 61 62 65 6c 20 74 6f 20 73 6b 69 70 20  s label to skip 
12e60 61 20 72 6f 77 20 2a 2f 0a 20 20 56 64 62 65 20  a row */.  Vdbe 
12e70 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
12e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
12e90 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
12ea0 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
12eb0 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  hine */.  KeyInf
12ec0 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20  o *pKey;        
12ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49           /* KeyI
12ee0 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f  nfo for index */
12ef0 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
12f00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12f10 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
12f20 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c 69 65 64  lding assemblied
12f30 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f   index record */
12f40 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
12f50 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
12f60 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
12f70 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
12f80 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
12f90 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
12fa0 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63  (db, pIndex->pSc
12fb0 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20  hema);..#ifndef 
12fc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
12fd0 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  ORIZATION.  if( 
12fe0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
12ff0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
13000 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d  REINDEX, pIndex-
13010 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20  >zName, 0,.     
13020 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
13030 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74  ame ) ){.    ret
13040 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
13050 0a 20 20 2f 2a 20 52 65 71 75 69 72 65 20 61 20  .  /* Require a 
13060 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
13070 65 20 74 61 62 6c 65 20 74 6f 20 70 65 72 66 6f  e table to perfo
13080 72 6d 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  rm this operatio
13090 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61  n */.  sqlite3Ta
130a0 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
130b0 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
130c0 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   1, pTab->zName)
130d0 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
130e0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
130f0 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
13100 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52  turn;.  if( memR
13110 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20  ootPage>=0 ){.  
13120 20 20 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74    tnum = memRoot
13130 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Page;.  }else{. 
13140 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78     tnum = pIndex
13150 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 73 71 6c 69  ->tnum;.    sqli
13160 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13170 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c   OP_Clear, tnum,
13180 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 4b 65   iDb);.  }.  pKe
13190 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  y = sqlite3Index
131a0 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20  Keyinfo(pParse, 
131b0 70 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69 74  pIndex);.  sqlit
131c0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
131d0 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49  OP_OpenWrite, iI
131e0 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a  dx, tnum, iDb, .
131f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13200 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65 79      (char *)pKey
13210 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
13220 44 4f 46 46 29 3b 0a 20 20 73 71 6c 69 74 65 33  DOFF);.  sqlite3
13230 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
13240 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52 7c 28  OPFLAG_BULKCSR|(
13250 28 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 29  (memRootPage>=0)
13260 3f 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47 3a  ?OPFLAG_P2ISREG:
13270 30 29 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  0));..  /* Open 
13280 74 68 65 20 73 6f 72 74 65 72 20 63 75 72 73 6f  the sorter curso
13290 72 20 69 66 20 77 65 20 61 72 65 20 74 6f 20 75  r if we are to u
132a0 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 53 6f  se one. */.  iSo
132b0 72 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rter = pParse->n
132c0 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  Tab++;.  sqlite3
132d0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
132e0 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 69 53 6f  _SorterOpen, iSo
132f0 72 74 65 72 2c 20 30 2c 20 30 2c 20 28 63 68 61  rter, 0, 0, (cha
13300 72 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49  r*)pKey, P4_KEYI
13310 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  NFO);..  /* Open
13320 20 74 68 65 20 74 61 62 6c 65 2e 20 4c 6f 6f 70   the table. Loop
13330 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f 77   through all row
13340 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2c 20  s of the table, 
13350 69 6e 73 65 72 74 69 6e 67 20 69 6e 64 65 78 0a  inserting index.
13360 20 20 2a 2a 20 72 65 63 6f 72 64 73 20 69 6e 74    ** records int
13370 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f  o the sorter. */
13380 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61  .  sqlite3OpenTa
13390 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ble(pParse, iTab
133a0 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
133b0 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64 64  OpenRead);.  add
133c0 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
133d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
133e0 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20  ind, iTab, 0);. 
133f0 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
13400 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
13410 50 61 72 73 65 29 3b 0a 0a 20 20 73 71 6c 69 74  Parse);..  sqlit
13420 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b  e3GenerateIndexK
13430 65 79 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ey(pParse, pInde
13440 78 2c 20 69 54 61 62 2c 20 72 65 67 52 65 63 6f  x, iTab, regReco
13450 72 64 2c 20 31 2c 20 26 69 50 61 72 74 49 64 78  rd, 1, &iPartIdx
13460 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65  Label);.  sqlite
13470 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13480 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20  P_SorterInsert, 
13490 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63 6f  iSorter, regReco
134a0 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rd);.  sqlite3Vd
134b0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
134c0 2c 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c 29  , iPartIdxLabel)
134d0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
134e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
134f0 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29  , iTab, addr1+1)
13500 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
13510 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
13520 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  );.  addr1 = sql
13530 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13540 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c  , OP_SorterSort,
13550 20 69 53 6f 72 74 65 72 2c 20 30 29 3b 0a 20 20   iSorter, 0);.  
13560 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  if( pIndex->onEr
13570 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a  ror!=OE_None ){.
13580 20 20 20 20 69 6e 74 20 6a 32 20 3d 20 73 71 6c      int j2 = sql
13590 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
135a0 64 64 72 28 76 29 20 2b 20 33 3b 0a 20 20 20 20  ddr(v) + 3;.    
135b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
135c0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
135d0 20 6a 32 29 3b 0a 20 20 20 20 61 64 64 72 32 20   j2);.    addr2 
135e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
135f0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
13600 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13610 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 43  p3(v, OP_SorterC
13620 6f 6d 70 61 72 65 2c 20 69 53 6f 72 74 65 72 2c  ompare, iSorter,
13630 20 6a 32 2c 20 72 65 67 52 65 63 6f 72 64 29 3b   j2, regRecord);
13640 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74  .    sqlite3Halt
13650 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
13660 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  e, SQLITE_CONSTR
13670 41 49 4e 54 5f 55 4e 49 51 55 45 2c 0a 20 20 20  AINT_UNIQUE,.   
13680 20 20 20 20 20 4f 45 5f 41 62 6f 72 74 2c 20 22       OE_Abort, "
13690 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20  indexed columns 
136a0 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c  are not unique",
136b0 20 50 34 5f 53 54 41 54 49 43 0a 20 20 20 20 29   P4_STATIC.    )
136c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
136d0 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
136e0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
136f0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
13700 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13710 53 6f 72 74 65 72 44 61 74 61 2c 20 69 53 6f 72  SorterData, iSor
13720 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  ter, regRecord);
13730 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
13740 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp3(v, OP_IdxIn
13750 73 65 72 74 2c 20 69 49 64 78 2c 20 72 65 67 52  sert, iIdx, regR
13760 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20 73 71 6c  ecord, 1);.  sql
13770 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
13780 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
13790 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c  EKRESULT);.  sql
137a0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
137b0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
137c0 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
137d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
137e0 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 53 6f  _SorterNext, iSo
137f0 72 74 65 72 2c 20 61 64 64 72 32 29 3b 0a 20 20  rter, addr2);.  
13800 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
13810 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a  ere(v, addr1);..
13820 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13830 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
13840 20 69 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65   iTab);.  sqlite
13850 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
13860 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 29 3b 0a  P_Close, iIdx);.
13870 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13880 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
13890 20 69 53 6f 72 74 65 72 29 3b 0a 7d 0a 0a 2f 2a   iSorter);.}../*
138a0 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
138b0 20 61 76 65 72 61 67 65 20 77 69 64 74 68 20 6f   average width o
138c0 66 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  f a table column
138d0 20 62 61 73 65 64 20 6f 6e 20 69 74 73 20 61 66   based on its af
138e0 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2f 0a  finity type..*/.
138f0 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
13900 65 73 74 69 6d 61 74 65 64 43 6f 6c 75 6d 6e 57  estimatedColumnW
13910 69 64 74 68 28 63 6f 6e 73 74 20 43 6f 6c 75 6d  idth(const Colum
13920 6e 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  n *p){.  if( p->
13930 61 66 66 69 6e 69 74 79 3e 3d 53 51 4c 49 54 45  affinity>=SQLITE
13940 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 20 72  _AFF_NUMERIC ) r
13950 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70  eturn 1;.  if( p
13960 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
13970 54 45 5f 41 46 46 5f 54 45 58 54 20 29 20 72 65  TE_AFF_TEXT ) re
13980 74 75 72 6e 20 33 3b 0a 20 20 72 65 74 75 72 6e  turn 3;.  return
13990 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   2;.}../*.** Cre
139a0 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20  ate a new index 
139b0 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65  for an SQL table
139c0 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32  .  pName1.pName2
139d0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
139e0 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e  the index .** an
139f0 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74 68  d pTblList is th
13a00 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
13a10 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
13a20 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68  e indexed.  Both
13a30 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c   will .** be NUL
13a40 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20  L for a primary 
13a50 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20  key or an index 
13a60 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20  that is created 
13a70 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20  to satisfy a.** 
13a80 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
13a90 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e  t.  If pTable an
13aa0 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c  d pIndex are NUL
13ab0 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70  L, use pParse->p
13ac0 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74  NewTable.** as t
13ad0 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
13ae0 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d  ndexed.  pParse-
13af0 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20  >pNewTable is a 
13b00 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a  table that is.**
13b10 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
13b20 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
13b30 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
13b40 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
13b50 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
13b60 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  of columns to be
13b70 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74   indexed.  pList
13b80 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66   will be NULL if
13b90 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72   this.** is a pr
13ba0 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69  imary key or uni
13bb0 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f  que-constraint o
13bc0 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
13bd0 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a  t column added.*
13be0 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  * to the table c
13bf0 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
13c00 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a  onstruction.  .*
13c10 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 64 65  *.** If the inde
13c20 78 20 69 73 20 63 72 65 61 74 65 64 20 73 75 63  x is created suc
13c30 63 65 73 73 66 75 6c 6c 79 2c 20 72 65 74 75 72  cessfully, retur
13c40 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
13c50 68 65 20 6e 65 77 20 49 6e 64 65 78 0a 2a 2a 20  he new Index.** 
13c60 73 74 72 75 63 74 75 72 65 2e 20 54 68 69 73 20  structure. This 
13c70 69 73 20 75 73 65 64 20 62 79 20 73 71 6c 69 74  is used by sqlit
13c80 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28  e3AddPrimaryKey(
13c90 29 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 69 6e  ) to mark the in
13ca0 64 65 78 0a 2a 2a 20 61 73 20 74 68 65 20 74 61  dex.** as the ta
13cb0 62 6c 65 73 20 70 72 69 6d 61 72 79 20 6b 65 79  bles primary key
13cc0 20 28 49 6e 64 65 78 2e 61 75 74 6f 49 6e 64 65   (Index.autoInde
13cd0 78 3d 3d 32 29 2e 0a 2a 2f 0a 49 6e 64 65 78 20  x==2)..*/.Index 
13ce0 2a 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e  *sqlite3CreateIn
13cf0 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
13d00 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c  arse,     /* All
13d10 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
13d20 75 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f  ut this parse */
13d30 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
13d40 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70  ,     /* First p
13d50 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d  art of index nam
13d60 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  e. May be NULL *
13d70 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
13d80 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64  2,     /* Second
13d90 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e   part of index n
13da0 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ame. May be NULL
13db0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
13dc0 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c  TblName, /* Tabl
13dd0 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20  e to index. Use 
13de0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
13df0 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72  e if 0 */.  Expr
13e00 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f  List *pList,   /
13e10 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  * A list of colu
13e20 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
13e30 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  d */.  int onErr
13e40 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f  or,       /* OE_
13e50 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65  Abort, OE_Ignore
13e60 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72  , OE_Replace, or
13e70 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f   OE_None */.  To
13e80 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20  ken *pStart,    
13e90 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
13ea0 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
13eb0 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
13ec0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50 49 57 68  */.  Expr *pPIWh
13ed0 65 72 65 2c 20 20 20 20 2f 2a 20 57 48 45 52 45  ere,    /* WHERE
13ee0 20 63 6c 61 75 73 65 20 66 6f 72 20 70 61 72 74   clause for part
13ef0 69 61 6c 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20  ial indices */. 
13f00 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20   int sortOrder, 
13f10 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65      /* Sort orde
13f20 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79  r of primary key
13f30 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c   when pList==NUL
13f40 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74  L */.  int ifNot
13f50 45 78 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69  Exist     /* Omi
13f60 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78  t error if index
13f70 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
13f80 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
13f90 52 65 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Ret = 0;     /* 
13fa0 50 6f 69 6e 74 65 72 20 74 6f 20 72 65 74 75 72  Pointer to retur
13fb0 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  n */.  Table *pT
13fc0 61 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  ab = 0;     /* T
13fd0 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
13fe0 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
13ff0 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20  Index = 0;   /* 
14000 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
14010 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61  created */.  cha
14020 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20  r *zName = 0;   
14030 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
14040 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
14050 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
14060 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
14070 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d  aracters in zNam
14080 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  e */.  int i, j;
14090 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b  .  Token nullId;
140a0 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20          /* Fake 
140b0 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70  token for an emp
140c0 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20  ty ID list */.  
140d0 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20  DbFixer sFix;   
140e0 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69       /* For assi
140f0 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e  gning database n
14100 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a  ames to pTable *
14110 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
14120 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f  rMask;   /* 1 to
14130 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69   honor DESC in i
14140 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f  ndex.  0 to igno
14150 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  re. */.  sqlite3
14160 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
14170 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  b;.  Db *pDb;   
14180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14190 20 73 70 65 63 69 66 69 63 20 74 61 62 6c 65 20   specific table 
141a0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69  containing the i
141b0 6e 64 65 78 65 64 20 64 61 74 61 62 61 73 65 20  ndexed database 
141c0 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
141d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
141e0 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
141f0 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  se that is being
14200 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f   written */.  To
14210 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20  ken *pName = 0; 
14220 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65     /* Unqualifie
14230 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  d name of the in
14240 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f  dex to create */
14250 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
14260 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74  st_item *pListIt
14270 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  em; /* For loopi
14280 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f  ng over pList */
14290 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 54 61 62  .  unsigned wTab
142a0 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  le = 0;         
142b0 20 20 20 20 2f 2a 20 41 70 70 72 6f 78 69 6d 61      /* Approxima
142c0 74 65 20 22 77 69 64 74 68 22 20 6f 66 20 74 68  te "width" of th
142d0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e 73  e table */.  uns
142e0 69 67 6e 65 64 20 77 49 6e 64 65 78 20 3d 20 30  igned wIndex = 0
142f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
14300 20 41 70 70 72 6f 78 69 6d 61 74 65 20 22 77 69   Approximate "wi
14310 64 74 68 22 20 6f 66 20 74 68 69 73 20 69 6e 64  dth" of this ind
14320 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 43 6f  ex */.  const Co
14330 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 20 20  lumn *pTabCol;  
14340 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f           /* A co
14350 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c  lumn in the tabl
14360 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  e */.  int nCol;
14370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14380 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
14390 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  r of columns */.
143a0 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30    int nExtra = 0
143b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
143c0 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f     /* Space allo
143d0 63 61 74 65 64 20 66 6f 72 20 7a 45 78 74 72 61  cated for zExtra
143e0 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45  [] */.  char *zE
143f0 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
14400 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
14410 61 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68  a space after th
14420 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a  e Index object *
14430 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
14440 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20  rse->nErr==0 ); 
14450 20 20 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61       /* Never ca
14460 6c 6c 65 64 20 77 69 74 68 20 70 72 69 6f 72 20  lled with prior 
14470 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20  errors */.  if( 
14480 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
14490 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56   || IN_DECLARE_V
144a0 54 41 42 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  TAB ){.    goto 
144b0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
144c0 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c  x;.  }.  if( SQL
144d0 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
144e0 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
144f0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
14500 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
14510 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
14520 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74  Find the table t
14530 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64  hat is to be ind
14540 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61  exed.  Return ea
14550 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  rly if not found
14560 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62  ..  */.  if( pTb
14570 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20  lName!=0 ){..   
14580 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d   /* Use the two-
14590 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20  part index name 
145a0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
145b0 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a   database .    *
145c0 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20  * to search for 
145d0 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27  the table. 'Fix'
145e0 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
145f0 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a  to this db.    *
14600 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67  * before looking
14610 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20   up the table.. 
14620 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
14630 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d  ( pName1 && pNam
14640 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20  e2 );.    iDb = 
14650 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
14660 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
14670 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
14680 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  e);.    if( iDb<
14690 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
146a0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
146b0 61 73 73 65 72 74 28 20 70 4e 61 6d 65 20 26 26  assert( pName &&
146c0 20 70 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69   pName->z );..#i
146d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
146e0 54 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20  T_TEMPDB.    /* 
146f0 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  If the index nam
14700 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65  e was unqualifie
14710 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  d, check if the 
14720 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  table.    ** is 
14730 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66  a temp table. If
14740 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74   so, set the dat
14750 61 62 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e  abase to 1. Do n
14760 6f 74 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a  ot do this.    *
14770 2a 20 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e  * if initialisin
14780 67 20 61 20 64 61 74 61 62 61 73 65 20 73 63 68  g a database sch
14790 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ema..    */.    
147a0 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
147b0 73 79 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  sy ){.      pTab
147c0 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
147d0 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20  tLookup(pParse, 
147e0 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20  pTblName);.     
147f0 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d   if( pName2->n==
14800 30 20 26 26 20 70 54 61 62 20 26 26 20 70 54 61  0 && pTab && pTa
14810 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e  b->pSchema==db->
14820 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[1].pSchema )
14830 7b 0a 20 20 20 20 20 20 20 20 69 44 62 20 3d 20  {.        iDb = 
14840 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
14850 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c  .#endif..    sql
14860 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69  ite3FixInit(&sFi
14870 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20  x, pParse, iDb, 
14880 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 3b  "index", pName);
14890 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
148a0 46 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78  FixSrcList(&sFix
148b0 2c 20 70 54 62 6c 4e 61 6d 65 29 20 29 7b 0a 20  , pTblName) ){. 
148c0 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
148d0 74 68 65 20 70 61 72 73 65 72 20 63 6f 6e 73 74  the parser const
148e0 72 75 63 74 73 20 70 54 62 6c 4e 61 6d 65 20 66  ructs pTblName f
148f0 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69 64 65  rom a single ide
14900 6e 74 69 66 69 65 72 2c 0a 20 20 20 20 20 20 2a  ntifier,.      *
14910 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c  * sqlite3FixSrcL
14920 69 73 74 20 63 61 6e 20 6e 65 76 65 72 20 66 61  ist can never fa
14930 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  il. */.      ass
14940 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ert(0);.    }.  
14950 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
14960 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28  LocateTableItem(
14970 70 50 61 72 73 65 2c 20 30 2c 20 26 70 54 62 6c  pParse, 0, &pTbl
14980 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20  Name->a[0]);.   
14990 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
149a0 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20  locFailed==0 || 
149b0 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69  pTab==0 );.    i
149c0 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74  f( pTab==0 ) got
149d0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
149e0 64 65 78 3b 0a 20 20 20 20 69 66 28 20 69 44 62  dex;.    if( iDb
149f0 3d 3d 31 20 26 26 20 64 62 2d 3e 61 44 62 5b 69  ==1 && db->aDb[i
14a00 44 62 5d 2e 70 53 63 68 65 6d 61 21 3d 70 54 61  Db].pSchema!=pTa
14a10 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  b->pSchema ){.  
14a20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14a30 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
14a40 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20          "cannot 
14a50 63 72 65 61 74 65 20 61 20 54 45 4d 50 20 69 6e  create a TEMP in
14a60 64 65 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50 20  dex on non-TEMP 
14a70 74 61 62 6c 65 20 5c 22 25 73 5c 22 22 2c 0a 20  table \"%s\"",. 
14a80 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
14a90 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  zName);.      go
14aa0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
14ab0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ndex;.    }.  }e
14ac0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
14ad0 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20   pName==0 );.   
14ae0 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74 3d   assert( pStart=
14af0 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d  =0 );.    pTab =
14b00 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
14b10 6c 65 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61  le;.    if( !pTa
14b20 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  b ) goto exit_cr
14b30 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
14b40 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
14b50 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
14b60 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
14b70 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e   }.  pDb = &db->
14b80 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 61 73 73  aDb[iDb];..  ass
14b90 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
14ba0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
14bb0 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69  ->nErr==0 );.  i
14bc0 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
14bd0 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  mp(pTab->zName, 
14be0 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
14bf0 20 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69   .       && sqli
14c00 74 65 33 53 74 72 4e 49 43 6d 70 28 26 70 54 61  te3StrNICmp(&pTa
14c10 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 61 6c 74  b->zName[7],"alt
14c20 65 72 74 61 62 5f 22 2c 39 29 21 3d 30 20 29 7b  ertab_",9)!=0 ){
14c30 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
14c40 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
14c50 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62  ble %s may not b
14c60 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62  e indexed", pTab
14c70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
14c80 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
14c90 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  ndex;.  }.#ifnde
14ca0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
14cb0 45 57 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70  EW.  if( pTab->p
14cc0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
14cd0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
14ce0 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79  arse, "views may
14cf0 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
14d00 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
14d10 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
14d20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   }.#endif.#ifnde
14d30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
14d40 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
14d50 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
14d60 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
14d70 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
14d80 22 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20  "virtual tables 
14d90 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
14da0 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ed");.    goto e
14db0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
14dc0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
14dd0 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
14de0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
14df0 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  ex.  Make sure t
14e00 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  here is not alre
14e10 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a  ady another.  **
14e20 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
14e30 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
14e40 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  me.  .  **.  ** 
14e50 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77  Exception:  If w
14e60 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
14e70 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61  e names of perma
14e80 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f  nent indices fro
14e90 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  m the.  ** sqlit
14ea0 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28  e_master table (
14eb0 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68  because some oth
14ec0 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67  er process chang
14ed0 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20 61  ed the schema) a
14ee0 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74  nd.  ** one of t
14ef0 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63  he index names c
14f00 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68 65  ollides with the
14f10 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f   name of a tempo
14f20 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20  rary table or.  
14f30 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77  ** index, then w
14f40 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
14f50 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73 20  to process this 
14f60 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
14f70 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20   If pName==0 it 
14f80 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72  means that we ar
14f90 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77  e.  ** dealing w
14fa0 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65  ith a primary ke
14fb0 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  y or UNIQUE cons
14fc0 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65  traint.  We have
14fd0 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20   to invent our. 
14fe0 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20   ** own name..  
14ff0 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29  */.  if( pName )
15000 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  {.    zName = sq
15010 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
15020 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  en(db, pName);. 
15030 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
15040 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
15050 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73  te_index;.    as
15060 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 7a 21 3d  sert( pName->z!=
15070 30 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  0 );.    if( SQL
15080 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43  ITE_OK!=sqlite3C
15090 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70  heckObjectName(p
150a0 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b  Parse, zName) ){
150b0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
150c0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
150d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62     }.    if( !db
150e0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
150f0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
15100 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
15110 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20  ame, 0)!=0 ){.  
15120 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
15130 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
15140 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
15150 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73  a table named %s
15160 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
15170 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
15180 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
15190 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
151a0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
151b0 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62  x(db, zName, pDb
151c0 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  ->zName)!=0 ){. 
151d0 20 20 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45       if( !ifNotE
151e0 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  xist ){.        
151f0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15200 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25  pParse, "index %
15210 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  s already exists
15220 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
15230 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15240 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69  assert( !db->ini
15250 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20  t.busy );.      
15260 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
15270 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
15280 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a  , iDb);.      }.
15290 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
152a0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
152b0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
152c0 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65   int n;.    Inde
152d0 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f  x *pLoop;.    fo
152e0 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49  r(pLoop=pTab->pI
152f0 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70  ndex, n=1; pLoop
15300 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
15310 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  Next, n++){}.   
15320 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
15330 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c  MPrintf(db, "sql
15340 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73  ite_autoindex_%s
15350 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  _%d", pTab->zNam
15360 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a  e, n);.    if( z
15370 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
15380 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
15390 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
153a0 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66   }..  /* Check f
153b0 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  or authorization
153c0 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e   to create an in
153d0 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  dex..  */.#ifnde
153e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
153f0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
15400 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
15410 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65  zDb = pDb->zName
15420 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
15430 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
15440 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
15450 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
15460 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  Db), 0, zDb) ){.
15470 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
15480 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
15490 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49    }.    i = SQLI
154a0 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b  TE_CREATE_INDEX;
154b0 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  .    if( !OMIT_T
154c0 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
154d0 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ) i = SQLITE_CRE
154e0 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a  ATE_TEMP_INDEX;.
154f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
15500 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
15510 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d   i, zName, pTab-
15520 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
15530 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
15540 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
15550 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
15560 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30    /* If pList==0
15570 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  , it means this 
15580 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
15590 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69  ed to make a pri
155a0 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75  mary.  ** key ou
155b0 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f  t of the last co
155c0 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68  lumn added to th
155d0 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
155e0 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a  nstruction..  **
155f0 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b   So create a fak
15600 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61  e list to simula
15610 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20  te this..  */.  
15620 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
15630 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70      nullId.z = p
15640 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e  Tab->aCol[pTab->
15650 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20  nCol-1].zName;. 
15660 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 71     nullId.n = sq
15670 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 28 63  lite3Strlen30((c
15680 68 61 72 2a 29 6e 75 6c 6c 49 64 2e 7a 29 3b 0a  har*)nullId.z);.
15690 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
156a0 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
156b0 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b  d(pParse, 0, 0);
156c0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
156d0 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
156e0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
156f0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
15700 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  etName(pParse, p
15710 4c 69 73 74 2c 20 26 6e 75 6c 6c 49 64 2c 20 30  List, &nullId, 0
15720 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  );.    pList->a[
15730 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 28  0].sortOrder = (
15740 75 38 29 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  u8)sortOrder;.  
15750 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  }..  /* Figure o
15760 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65  ut how many byte
15770 73 20 6f 66 20 73 70 61 63 65 20 61 72 65 20 72  s of space are r
15780 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65  equired to store
15790 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a   explicitly.  **
157a0 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 6c 61   specified colla
157b0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
157c0 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  mes..  */.  for(
157d0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
157e0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
157f0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69  xpr *pExpr = pLi
15800 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
15810 20 20 20 20 69 66 28 20 70 45 78 70 72 20 29 7b      if( pExpr ){
15820 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15830 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
15840 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20 6e 45  LATE );.      nE
15850 78 74 72 61 20 2b 3d 20 28 31 20 2b 20 73 71 6c  xtra += (1 + sql
15860 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 45 78  ite3Strlen30(pEx
15870 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 29 3b 0a  pr->u.zToken));.
15880 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
15890 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  ** Allocate t
158a0 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  he index structu
158b0 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d  re. .  */.  nNam
158c0 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
158d0 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 43  n30(zName);.  nC
158e0 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ol = pList->nExp
158f0 72 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  r;.  pIndex = sq
15900 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
15910 6f 28 64 62 2c 20 0a 20 20 20 20 20 20 52 4f 55  o(db, .      ROU
15920 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78  ND8(sizeof(Index
15930 29 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20  )) +            
15940 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63    /* Index struc
15950 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20 20 52  ture  */.      R
15960 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 74 52 6f  OUND8(sizeof(tRo
15970 77 63 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29 29 20  wcnt)*(nCol+1)) 
15980 2b 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52  +   /* Index.aiR
15990 6f 77 45 73 74 20 20 20 2a 2f 0a 20 20 20 20 20  owEst   */.     
159a0 20 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 2a   sizeof(char *)*
159b0 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20  nCol +          
159c0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
159d0 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20  zColl     */.   
159e0 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e     sizeof(int)*n
159f0 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20  Col +           
15a00 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
15a10 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20  .aiColumn   */. 
15a20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29 2a       sizeof(u8)*
15a30 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20  nCol +          
15a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
15a50 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f  ex.aSortOrder */
15a60 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 31  .      nName + 1
15a70 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
15a80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
15a90 6e 64 65 78 2e 7a 4e 61 6d 65 20 20 20 20 20 20  ndex.zName      
15aa0 2a 2f 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20  */.      nExtra 
15ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15ad0 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   Collation seque
15ae0 6e 63 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 29  nce names */.  )
15af0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
15b00 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
15b10 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
15b20 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 7a 45  _index;.  }.  zE
15b30 78 74 72 61 20 3d 20 28 63 68 61 72 2a 29 70 49  xtra = (char*)pI
15b40 6e 64 65 78 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  ndex;.  pIndex->
15b50 61 69 52 6f 77 45 73 74 20 3d 20 28 74 52 6f 77  aiRowEst = (tRow
15b60 63 6e 74 2a 29 26 7a 45 78 74 72 61 5b 52 4f 55  cnt*)&zExtra[ROU
15b70 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78  ND8(sizeof(Index
15b80 29 29 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  ))];.  pIndex->a
15b90 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29  zColl = (char**)
15ba0 0a 20 20 20 20 20 28 28 63 68 61 72 2a 29 70 49  .     ((char*)pI
15bb0 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 20 2b  ndex->aiRowEst +
15bc0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 74   ROUND8(sizeof(t
15bd0 52 6f 77 63 6e 74 29 2a 6e 43 6f 6c 2b 31 29 29  Rowcnt)*nCol+1))
15be0 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
15bf0 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
15c00 28 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73  (pIndex->aiRowEs
15c10 74 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  t) );.  assert( 
15c20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
15c30 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 7a 43  MENT(pIndex->azC
15c40 6f 6c 6c 29 20 29 3b 0a 20 20 70 49 6e 64 65 78  oll) );.  pIndex
15c50 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e  ->aiColumn = (in
15c60 74 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 7a  t *)(&pIndex->az
15c70 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70  Coll[nCol]);.  p
15c80 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
15c90 72 20 3d 20 28 75 38 20 2a 29 28 26 70 49 6e 64  r = (u8 *)(&pInd
15ca0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f  ex->aiColumn[nCo
15cb0 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a  l]);.  pIndex->z
15cc0 4e 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 28  Name = (char *)(
15cd0 26 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72  &pIndex->aSortOr
15ce0 64 65 72 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 7a 45  der[nCol]);.  zE
15cf0 78 74 72 61 20 3d 20 28 63 68 61 72 20 2a 29 28  xtra = (char *)(
15d00 26 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 5b 6e  &pIndex->zName[n
15d10 4e 61 6d 65 2b 31 5d 29 3b 0a 20 20 6d 65 6d 63  Name+1]);.  memc
15d20 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  py(pIndex->zName
15d30 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31  , zName, nName+1
15d40 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61  );.  pIndex->pTa
15d50 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49  ble = pTab;.  pI
15d60 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20  ndex->nColumn = 
15d70 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
15d80 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
15d90 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20  = (u8)onError;. 
15da0 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74   pIndex->uniqNot
15db0 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3d 3d  Null = onError==
15dc0 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 49 6e 64  OE_Abort;.  pInd
15dd0 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20  ex->autoIndex = 
15de0 28 75 38 29 28 70 4e 61 6d 65 3d 3d 30 29 3b 0a  (u8)(pName==0);.
15df0 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d    pIndex->pSchem
15e00 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
15e10 2e 70 53 63 68 65 6d 61 3b 0a 20 20 69 66 28 20  .pSchema;.  if( 
15e20 70 50 49 57 68 65 72 65 20 29 7b 0a 20 20 20 20  pPIWhere ){.    
15e30 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
15e40 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72  lfReference(pPar
15e50 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 50 61 72  se, pTab, NC_Par
15e60 74 49 64 78 2c 20 70 50 49 57 68 65 72 65 2c 20  tIdx, pPIWhere, 
15e70 30 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  0);.    pIndex->
15e80 70 50 61 72 74 49 64 78 57 68 65 72 65 20 3d 20  pPartIdxWhere = 
15e90 70 50 49 57 68 65 72 65 3b 0a 20 20 20 20 70 50  pPIWhere;.    pP
15ea0 49 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a  IWhere = 0;.  }.
15eb0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15ec0 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
15ed0 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
15ee0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
15ef0 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20  ee if we should 
15f00 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65  honor DESC reque
15f10 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c  sts on index col
15f20 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  umns.  */.  if( 
15f30 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69  pDb->pSchema->fi
15f40 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a  le_format>=4 ){.
15f50 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73      sortOrderMas
15f60 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e  k = -1;   /* Hon
15f70 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c  or DESC */.  }el
15f80 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65  se{.    sortOrde
15f90 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a  rMask = 0;    /*
15fa0 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a   Ignore DESC */.
15fb0 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74    }..  /* Scan t
15fc0 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
15fd0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74  columns of the t
15fe0 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
15ff0 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64  ed and.  ** load
16000 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69   the column indi
16010 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64  ces into the Ind
16020 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  ex structure.  R
16030 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20  eport an error. 
16040 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d   ** if any colum
16050 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  n is not found..
16060 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20    **.  ** TODO: 
16070 20 41 64 64 20 61 20 74 65 73 74 20 74 6f 20 6d   Add a test to m
16080 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
16090 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73  e same column is
160a0 20 6e 6f 74 20 6e 61 6d 65 64 0a 20 20 2a 2a 20   not named.  ** 
160b0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 77  more than once w
160c0 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 69  ithin the same i
160d0 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20  ndex.  Only the 
160e0 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65 20 6f  first instance o
160f0 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6c 75 6d  f.  ** the colum
16100 6e 20 77 69 6c 6c 20 65 76 65 72 20 62 65 20 75  n will ever be u
16110 73 65 64 20 62 79 20 74 68 65 20 6f 70 74 69 6d  sed by the optim
16120 69 7a 65 72 2e 20 20 4e 6f 74 65 20 74 68 61 74  izer.  Note that
16130 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
16140 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 6d 6f 72 65  same column more
16150 20 74 68 61 6e 20 6f 6e 63 65 20 63 61 6e 6e 6f   than once canno
16160 74 20 62 65 20 61 6e 20 65 72 72 6f 72 20 62 65  t be an error be
16170 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64  cause that would
16180 20 0a 20 20 2a 2a 20 62 72 65 61 6b 20 62 61 63   .  ** break bac
16190 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
161a0 6c 69 74 79 20 2d 20 69 74 20 6e 65 65 64 73 20  lity - it needs 
161b0 74 6f 20 62 65 20 61 20 77 61 72 6e 69 6e 67 2e  to be a warning.
161c0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
161d0 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73 74   pListItem=pList
161e0 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  ->a; i<pList->nE
161f0 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49  xpr; i++, pListI
16200 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  tem++){.    cons
16210 74 20 63 68 61 72 20 2a 7a 43 6f 6c 4e 61 6d 65  t char *zColName
16220 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 7a 4e   = pListItem->zN
16230 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 72 65 71  ame;.    int req
16240 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b  uestedSortOrder;
16250 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  .    char *zColl
16260 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16270 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e      /* Collation
16280 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a   sequence name *
16290 2f 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  /..    for(j=0, 
162a0 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43  pTabCol=pTab->aC
162b0 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  ol; j<pTab->nCol
162c0 3b 20 6a 2b 2b 2c 20 70 54 61 62 43 6f 6c 2b 2b  ; j++, pTabCol++
162d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
162e0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6c  ite3StrICmp(zCol
162f0 4e 61 6d 65 2c 20 70 54 61 62 43 6f 6c 2d 3e 7a  Name, pTabCol->z
16300 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
16310 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
16320 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  j>=pTab->nCol ){
16330 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
16340 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
16350 74 61 62 6c 65 20 25 73 20 68 61 73 20 6e 6f 20  table %s has no 
16360 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22  column named %s"
16370 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ,.        pTab->
16380 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61 6d 65 29  zName, zColName)
16390 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
163a0 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
163b0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
163c0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
163d0 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
163e0 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a  >aiColumn[i] = j
163f0 3b 0a 20 20 20 20 77 49 6e 64 65 78 20 2b 3d 20  ;.    wIndex += 
16400 65 73 74 69 6d 61 74 65 64 43 6f 6c 75 6d 6e 57  estimatedColumnW
16410 69 64 74 68 28 70 54 61 62 43 6f 6c 29 3b 0a 20  idth(pTabCol);. 
16420 20 20 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d     if( pListItem
16430 2d 3e 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->pExpr ){.     
16440 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20   int nColl;.    
16450 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 49    assert( pListI
16460 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d  tem->pExpr->op==
16470 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20  TK_COLLATE );.  
16480 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73      zColl = pLis
16490 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 75 2e  tItem->pExpr->u.
164a0 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 43  zToken;.      nC
164b0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72  oll = sqlite3Str
164c0 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b 20 31  len30(zColl) + 1
164d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
164e0 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b  nExtra>=nColl );
164f0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 45  .      memcpy(zE
16500 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f  xtra, zColl, nCo
16510 6c 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  ll);.      zColl
16520 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20 20 20   = zExtra;.     
16530 20 7a 45 78 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c   zExtra += nColl
16540 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2d  ;.      nExtra -
16550 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c  = nColl;.    }el
16560 73 65 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20  se{.      zColl 
16570 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
16580 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69 66 28  zColl;.      if(
16590 20 21 7a 43 6f 6c 6c 20 29 20 7a 43 6f 6c 6c 20   !zColl ) zColl 
165a0 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20  = "BINARY";.    
165b0 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  }.    if( !db->i
165c0 6e 69 74 2e 62 75 73 79 20 26 26 20 21 73 71 6c  nit.busy && !sql
165d0 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
165e0 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29  q(pParse, zColl)
165f0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
16600 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
16610 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
16620 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20  ex->azColl[i] = 
16630 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65  zColl;.    reque
16640 73 74 65 64 53 6f 72 74 4f 72 64 65 72 20 3d 20  stedSortOrder = 
16650 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f  pListItem->sortO
16660 72 64 65 72 20 26 20 73 6f 72 74 4f 72 64 65 72  rder & sortOrder
16670 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78  Mask;.    pIndex
16680 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
16690 3d 20 28 75 38 29 72 65 71 75 65 73 74 65 64 53  = (u8)requestedS
166a0 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 69 66  ortOrder;.    if
166b0 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ( pTab->aCol[j].
166c0 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 20 70 49 6e  notNull==0 ) pIn
166d0 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  dex->uniqNotNull
166e0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
166f0 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74  te3DefaultRowEst
16700 28 70 49 6e 64 65 78 29 3b 0a 20 20 66 6f 72 28  (pIndex);.  for(
16710 6a 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54  j=pTab->nCol, pT
16720 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c  abCol=pTab->aCol
16730 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 61 62  ; j>0; j--, pTab
16740 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 77 54 61 62  Col++){.    wTab
16750 6c 65 20 2b 3d 20 65 73 74 69 6d 61 74 65 64 43  le += estimatedC
16760 6f 6c 75 6d 6e 57 69 64 74 68 28 70 54 61 62 43  olumnWidth(pTabC
16770 6f 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ol);.  }.  asser
16780 74 28 20 31 30 30 2a 77 49 6e 64 65 78 2f 77 54  t( 100*wIndex/wT
16790 61 62 6c 65 20 3c 3d 20 32 35 35 20 29 3b 0a 20  able <= 255 );. 
167a0 20 70 49 6e 64 65 78 2d 3e 69 53 63 61 6e 52 61   pIndex->iScanRa
167b0 74 69 6f 20 3d 20 28 75 38 29 28 31 32 38 2a 77  tio = (u8)(128*w
167c0 49 6e 64 65 78 2f 77 54 61 62 6c 65 29 3b 0a 0a  Index/wTable);..
167d0 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72    if( pTab==pPar
167e0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b  se->pNewTable ){
167f0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  .    /* This rou
16800 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61  tine has been ca
16810 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
16820 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
16830 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65  x as a.    ** re
16840 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52  sult of a PRIMAR
16850 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
16860 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75  clause on a colu
16870 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f  mn definition, o
16880 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41  r.    ** a PRIMA
16890 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
168a0 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e   clause followin
168b0 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66  g the column def
168c0 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  initions..    **
168d0 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20   i.e. one of:.  
168e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41    **.    ** CREA
168f0 54 45 20 54 41 42 4c 45 20 74 28 78 20 50 52 49  TE TABLE t(x PRI
16900 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20  MARY KEY, y);.  
16910 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
16920 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45  E t(x, y, UNIQUE
16930 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a  (x, y));.    **.
16940 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61      ** Either wa
16950 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  y, check to see 
16960 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72  if the table alr
16970 65 61 64 79 20 68 61 73 20 73 75 63 68 20 61 6e  eady has such an
16980 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a   index. If.    *
16990 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68  * so, don't both
169a0 65 72 20 63 72 65 61 74 69 6e 67 20 74 68 69 73  er creating this
169b0 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20   one. This only 
169c0 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a  applies to.    *
169d0 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
169e0 63 72 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e  created indices.
169f0 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73   Users can do as
16a00 20 74 68 65 79 20 77 69 73 68 20 77 69 74 68 0a   they wish with.
16a10 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20      ** explicit 
16a20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a  indices..    **.
16a30 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55      ** Two UNIQU
16a40 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59  E or PRIMARY KEY
16a50 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
16a60 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 69   considered equi
16a70 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61  valent.    ** (a
16a80 6e 64 20 74 68 75 73 20 73 75 70 70 72 65 73 73  nd thus suppress
16a90 69 6e 67 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  ing the second o
16aa0 6e 65 29 20 65 76 65 6e 20 69 66 20 74 68 65 79  ne) even if they
16ab0 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a   have different.
16ac0 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65      ** sort orde
16ad0 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rs..    **.    *
16ae0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
16af0 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69  ifferent collati
16b00 6e 67 20 73 65 71 75 65 6e 63 65 73 20 6f 72 20  ng sequences or 
16b10 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  if the columns o
16b20 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e  f.    ** the con
16b30 73 74 72 61 69 6e 74 20 6f 63 63 75 72 20 69 6e  straint occur in
16b40 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72   different order
16b50 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73  s, then the cons
16b60 74 72 61 69 6e 74 73 20 61 72 65 0a 20 20 20 20  traints are.    
16b70 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69  ** considered di
16b80 73 74 69 6e 63 74 20 61 6e 64 20 62 6f 74 68 20  stinct and both 
16b90 72 65 73 75 6c 74 20 69 6e 20 73 65 70 61 72 61  result in separa
16ba0 74 65 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  te indices..    
16bb0 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
16bc0 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  dx;.    for(pIdx
16bd0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
16be0 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
16bf0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
16c00 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t k;.      asser
16c10 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  t( pIdx->onError
16c20 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20  !=OE_None );.   
16c30 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
16c40 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20 20  >autoIndex );.  
16c50 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
16c60 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  ex->onError!=OE_
16c70 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20 69  None );..      i
16c80 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  f( pIdx->nColumn
16c90 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  !=pIndex->nColum
16ca0 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
16cb0 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
16cc0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b  Idx->nColumn; k+
16cd0 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
16ce0 74 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20  t char *z1;.    
16cf0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
16d00 7a 32 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z2;.        if( 
16d10 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  pIdx->aiColumn[k
16d20 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  ]!=pIndex->aiCol
16d30 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a  umn[k] ) break;.
16d40 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 49 64          z1 = pId
16d50 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
16d60 20 20 20 20 20 20 7a 32 20 3d 20 70 49 6e 64 65        z2 = pInde
16d70 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
16d80 20 20 20 20 20 20 69 66 28 20 7a 31 21 3d 7a 32        if( z1!=z2
16d90 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
16da0 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65  mp(z1, z2) ) bre
16db0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
16dc0 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e    if( k==pIdx->n
16dd0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
16de0 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
16df0 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45  ror!=pIndex->onE
16e00 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rror ){.        
16e10 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72    /* This constr
16e20 61 69 6e 74 20 63 72 65 61 74 65 73 20 74 68 65  aint creates the
16e30 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61   same index as a
16e40 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
16e50 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
16e60 74 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65  t specified some
16e70 77 68 65 72 65 20 69 6e 20 74 68 65 20 43 52 45  where in the CRE
16e80 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
16e90 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ent..          *
16ea0 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e  * However the ON
16eb0 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
16ec0 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e  s are different.
16ed0 20 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20   If both this . 
16ee0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
16ef0 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70  traint and the p
16f00 72 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65  revious equivale
16f10 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  nt constraint ha
16f20 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20  ve explicit.    
16f30 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46        ** ON CONF
16f40 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74 68 69  LICT clauses thi
16f50 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f  s is an error. O
16f60 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68  therwise, use th
16f70 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  e.          ** e
16f80 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
16f90 69 65 64 20 62 65 68 61 76 69 6f 72 20 66 6f 72  ied behavior for
16fa0 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
16fb0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
16fc0 20 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f     if( !(pIdx->o
16fd0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
16fe0 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e  lt || pIndex->on
16ff0 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
17000 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
17010 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
17020 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
17030 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66             "conf
17040 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c  licting ON CONFL
17050 49 43 54 20 63 6c 61 75 73 65 73 20 73 70 65 63  ICT clauses spec
17060 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  ified", 0);.    
17070 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17080 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
17090 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror==OE_Default 
170a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
170b0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70  Idx->onError = p
170c0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a  Index->onError;.
170d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
170e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f      }.        go
170f0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
17100 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
17110 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69    }.  }..  /* Li
17120 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78  nk the new Index
17130 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74   structure to it
17140 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74  s table and to t
17150 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e  he other.  ** in
17160 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
17170 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20   structures. .  
17180 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
17190 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e  t.busy ){.    In
171a0 64 65 78 20 2a 70 3b 0a 20 20 20 20 61 73 73 65  dex *p;.    asse
171b0 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
171c0 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30  aMutexHeld(db, 0
171d0 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  , pIndex->pSchem
171e0 61 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71  a) );.    p = sq
171f0 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
17200 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61  &pIndex->pSchema
17210 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20  ->idxHash, .    
17220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17230 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
17240 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ame, sqlite3Strl
17250 65 6e 33 30 28 70 49 6e 64 65 78 2d 3e 7a 4e 61  en30(pIndex->zNa
17260 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  me),.           
17270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
17280 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20  Index);.    if( 
17290 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
172a0 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20  t( p==pIndex ); 
172b0 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
172c0 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
172d0 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46       db->mallocF
172e0 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  ailed = 1;.     
172f0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
17300 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
17310 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
17320 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
17330 6e 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54  nges;.    if( pT
17340 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20  blName!=0 ){.   
17350 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20     pIndex->tnum 
17360 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  = db->init.newTn
17370 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  um;.    }.  }.. 
17380 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69   /* If the db->i
17390 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 74 68  nit.busy is 0 th
173a0 65 6e 20 63 72 65 61 74 65 20 74 68 65 20 69 6e  en create the in
173b0 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68  dex on disk.  Th
173c0 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73  is.  ** involves
173d0 20 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64   writing the ind
173e0 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74  ex into the mast
173f0 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c  er table and fil
17400 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a  ling in the.  **
17410 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20   index with the 
17420 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f  current table co
17430 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a  ntents..  **.  *
17440 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  * The db->init.b
17450 75 73 79 20 69 73 20 30 20 77 68 65 6e 20 74 68  usy is 0 when th
17460 65 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74  e user first ent
17470 65 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44  ers a CREATE IND
17480 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64  EX .  ** command
17490 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  .  db->init.busy
174a0 20 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74   is 1 when a dat
174b0 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20  abase is opened 
174c0 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45  and .  ** CREATE
174d0 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
174e0 73 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f  s are read out o
174f0 66 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  f the master tab
17500 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65  le.  In.  ** the
17510 20 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65   latter case the
17520 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65   index already e
17530 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77  xists on disk, w
17540 68 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a  hich is why.  **
17550 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74   we don't want t
17560 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20  o recreate it.. 
17570 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c   **.  ** If pTbl
17580 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
17590 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67   this index is g
175a0 65 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72  enerated as a pr
175b0 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f  imary key.  ** o
175c0 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
175d0 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20  int of a CREATE 
175e0 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
175f0 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c    Since the tabl
17600 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20  e.  ** has just 
17610 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74  been created, it
17620 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
17630 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  a and the index 
17640 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  initialization. 
17650 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20   ** step can be 
17660 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
17670 65 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d  else if( pParse-
17680 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
17690 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61  Vdbe *v;.    cha
176a0 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e  r *zStmt;.    in
176b0 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  t iMem = ++pPars
176c0 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76 20  e->nMem;..    v 
176d0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
176e0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
176f0 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ( v==0 ) goto ex
17700 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
17710 0a 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ...    /* Create
17720 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f   the rootpage fo
17730 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20  r the index.    
17740 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  */.    sqlite3Be
17750 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
17760 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
17770 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
17780 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
17790 72 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c  reateIndex, iDb,
177a0 20 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20   iMem);..    /* 
177b0 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c  Gather the compl
177c0 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
177d0 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
177e0 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20  tement into.    
177f0 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72  ** the zStmt var
17800 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20  iable.    */.   
17810 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
17820 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e       int n = (in
17830 74 29 28 70 50 61 72 73 65 2d 3e 73 4c 61 73 74  t)(pParse->sLast
17840 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e 61 6d 65 2d  Token.z - pName-
17850 3e 7a 29 20 2b 20 70 50 61 72 73 65 2d 3e 73 4c  >z) + pParse->sL
17860 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20  astToken.n;.    
17870 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e 7a 5b 6e    if( pName->z[n
17880 2d 31 5d 3d 3d 27 3b 27 20 29 20 6e 2d 2d 3b 0a  -1]==';' ) n--;.
17890 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64        /* A named
178a0 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65   index with an e
178b0 78 70 6c 69 63 69 74 20 43 52 45 41 54 45 20 49  xplicit CREATE I
178c0 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
178d0 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  /.      zStmt = 
178e0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
178f0 62 2c 20 22 43 52 45 41 54 45 25 73 20 49 4e 44  b, "CREATE%s IND
17900 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20  EX %.*s",.      
17910 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f    onError==OE_No
17920 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51  ne ? "" : " UNIQ
17930 55 45 22 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a  UE", n, pName->z
17940 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
17950 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61      /* An automa
17960 74 69 63 20 69 6e 64 65 78 20 63 72 65 61 74 65  tic index create
17970 64 20 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b  d by a PRIMARY K
17980 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  EY or UNIQUE con
17990 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20  straint */.     
179a0 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69   /* zStmt = sqli
179b0 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20  te3MPrintf(""); 
179c0 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  */.      zStmt =
179d0 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
179e0 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69  * Add an entry i
179f0 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  n sqlite_master 
17a00 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20  for this index. 
17a10 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
17a20 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
17a30 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 49  rse, .        "I
17a40 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73  NSERT INTO %Q.%s
17a50 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c   VALUES('index',
17a60 25 51 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c  %Q,%Q,#%d,%Q);",
17a70 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62  .        db->aDb
17a80 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48  [iDb].zName, SCH
17a90 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a  EMA_TABLE(iDb),.
17aa0 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
17ab0 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 70  zName,.        p
17ac0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
17ad0 20 20 20 20 69 4d 65 6d 2c 0a 20 20 20 20 20 20      iMem,.      
17ae0 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20    zStmt.    );. 
17af0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
17b00 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20  (db, zStmt);..  
17b10 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e    /* Fill the in
17b20 64 65 78 20 77 69 74 68 20 64 61 74 61 20 61 6e  dex with data an
17b30 64 20 72 65 70 61 72 73 65 20 74 68 65 20 73 63  d reparse the sc
17b40 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50  hema. Code an OP
17b50 5f 45 78 70 69 72 65 0a 20 20 20 20 2a 2a 20 74  _Expire.    ** t
17b60 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  o invalidate all
17b70 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74   pre-compiled st
17b80 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f  atements..    */
17b90 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  .    if( pTblNam
17ba0 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
17bb0 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
17bc0 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d  arse, pIndex, iM
17bd0 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  em);.      sqlit
17be0 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
17bf0 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
17c00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17c10 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76  dParseSchemaOp(v
17c20 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20  , iDb,.         
17c30 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
17c40 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27 20 41 4e  b, "name='%q' AN
17c50 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c  D type='index'",
17c60 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29   pIndex->zName))
17c70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
17c80 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
17c90 45 78 70 69 72 65 2c 20 30 29 3b 0a 20 20 20 20  Expire, 0);.    
17ca0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  }.  }..  /* When
17cb0 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78   adding an index
17cc0 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
17cd0 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61  indices for a ta
17ce0 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73  ble, make.  ** s
17cf0 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ure all indices 
17d00 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61  labeled OE_Repla
17d10 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c  ce come after al
17d20 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a  l those labeled.
17d30 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20    ** OE_Ignore. 
17d40 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
17d50 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  ry for the corre
17d60 63 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68  ct constraint ch
17d70 65 63 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73  eck.  ** process
17d80 69 6e 67 20 28 69 6e 20 73 71 6c 69 74 65 33 47  ing (in sqlite3G
17d90 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e  enerateConstrain
17da0 74 43 68 65 63 6b 73 28 29 29 20 61 73 20 70 61  tChecks()) as pa
17db0 72 74 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54  rt of.  ** UPDAT
17dc0 45 20 61 6e 64 20 49 4e 53 45 52 54 20 73 74 61  E and INSERT sta
17dd0 74 65 6d 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a  tements.  .  */.
17de0 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
17df0 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d  usy || pTblName=
17e00 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e  =0 ){.    if( on
17e10 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
17e20 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65  e || pTab->pInde
17e30 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  x==0.         ||
17e40 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f   pTab->pIndex->o
17e50 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
17e60 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  ce){.      pInde
17e70 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d  x->pNext = pTab-
17e80 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70  >pIndex;.      p
17e90 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  Tab->pIndex = pI
17ea0 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ndex;.    }else{
17eb0 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f  .      Index *pO
17ec0 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e  ther = pTab->pIn
17ed0 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  dex;.      while
17ee0 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20  ( pOther->pNext 
17ef0 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74  && pOther->pNext
17f00 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ->onError!=OE_Re
17f10 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  place ){.       
17f20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72   pOther = pOther
17f30 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
17f40 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
17f50 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70  Next = pOther->p
17f60 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68  Next;.      pOth
17f70 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64  er->pNext = pInd
17f80 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52  ex;.    }.    pR
17f90 65 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  et = pIndex;.   
17fa0 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d   pIndex = 0;.  }
17fb0 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20  ..  /* Clean up 
17fc0 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a  before exiting *
17fd0 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  /.exit_create_in
17fe0 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65  dex:.  if( pInde
17ff0 78 20 29 20 66 72 65 65 49 6e 64 65 78 28 64 62  x ) freeIndex(db
18000 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c  , pIndex);.  sql
18010 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
18020 62 2c 20 70 50 49 57 68 65 72 65 29 3b 0a 20 20  b, pPIWhere);.  
18030 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
18040 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
18050 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  ;.  sqlite3SrcLi
18060 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 62  stDelete(db, pTb
18070 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  lName);.  sqlite
18080 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
18090 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  e);.  return pRe
180a0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c  t;.}../*.** Fill
180b0 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77   the Index.aiRow
180c0 45 73 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68  Est[] array with
180d0 20 64 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61   default informa
180e0 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69  tion - informati
180f0 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65 64  on.** to be used
18100 20 77 68 65 6e 20 77 65 20 68 61 76 65 20 6e 6f   when we have no
18110 74 20 72 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a  t run the ANALYZ
18120 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  E command..**.**
18130 20 61 69 52 6f 77 45 73 74 5b 30 5d 20 69 73 20   aiRowEst[0] is 
18140 73 75 70 70 6f 73 65 20 74 6f 20 63 6f 6e 74 61  suppose to conta
18150 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  in the number of
18160 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
18170 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65   index..** Since
18180 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c   we do not know,
18190 20 67 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e   guess 1 million
181a0 2e 20 20 61 69 52 6f 77 45 73 74 5b 31 5d 20 69  .  aiRowEst[1] i
181b0 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
181c0 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
181d0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
181e0 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20 61  ble that match a
181f0 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 76 61  ny particular va
18200 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  lue of the.** fi
18210 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  rst column of th
18220 65 20 69 6e 64 65 78 2e 20 20 61 69 52 6f 77 45  e index.  aiRowE
18230 73 74 5b 32 5d 20 69 73 20 61 6e 20 65 73 74 69  st[2] is an esti
18240 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62  mate of the numb
18250 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68  er.** of rows th
18260 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72  at match any par
18270 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 69 61  ticular combinia
18280 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73  tion of the firs
18290 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f  t 2 columns.** o
182a0 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 41 6e  f the index.  An
182b0 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 74 20  d so forth.  It 
182c0 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20 74  must always be t
182d0 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a  he case that.*.*
182e0 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f  *           aiRo
182f0 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73  wEst[N]<=aiRowEs
18300 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20  t[N-1].**       
18310 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e      aiRowEst[N]>
18320 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66  =1.**.** Apart f
18330 72 6f 6d 20 74 68 61 74 2c 20 77 65 20 68 61 76  rom that, we hav
18340 65 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f  e little to go o
18350 6e 20 62 65 73 69 64 65 73 20 69 6e 74 75 69 74  n besides intuit
18360 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77  ion as to.** how
18370 20 61 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75   aiRowEst[] shou
18380 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ld be initialize
18390 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 73 20  d.  The numbers 
183a0 67 65 6e 65 72 61 74 65 64 20 68 65 72 65 0a 2a  generated here.*
183b0 2a 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 74  * are based on t
183c0 79 70 69 63 61 6c 20 76 61 6c 75 65 73 20 66 6f  ypical values fo
183d0 75 6e 64 20 69 6e 20 61 63 74 75 61 6c 20 69 6e  und in actual in
183e0 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dices..*/.void s
183f0 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77  qlite3DefaultRow
18400 45 73 74 28 49 6e 64 65 78 20 2a 70 49 64 78 29  Est(Index *pIdx)
18410 7b 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 20 3d  {.  tRowcnt *a =
18420 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 3b   pIdx->aiRowEst;
18430 0a 20 20 69 6e 74 20 69 3b 0a 20 20 74 52 6f 77  .  int i;.  tRow
18440 63 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28  cnt n;.  assert(
18450 20 61 21 3d 30 20 29 3b 0a 20 20 61 5b 30 5d 20   a!=0 );.  a[0] 
18460 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
18470 6e 52 6f 77 45 73 74 3b 0a 20 20 69 66 28 20 61  nRowEst;.  if( a
18480 5b 30 5d 3c 31 30 20 29 20 61 5b 30 5d 20 3d 20  [0]<10 ) a[0] = 
18490 31 30 3b 0a 20 20 6e 20 3d 20 31 30 3b 0a 20 20  10;.  n = 10;.  
184a0 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 49 64 78  for(i=1; i<=pIdx
184b0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
184c0 0a 20 20 20 20 61 5b 69 5d 20 3d 20 6e 3b 0a 20  .    a[i] = n;. 
184d0 20 20 20 69 66 28 20 6e 3e 35 20 29 20 6e 2d 2d     if( n>5 ) n--
184e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78  ;.  }.  if( pIdx
184f0 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
18500 6e 65 20 29 7b 0a 20 20 20 20 61 5b 70 49 64 78  ne ){.    a[pIdx
18510 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d 20 31 3b 0a  ->nColumn] = 1;.
18520 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
18530 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  s routine will d
18540 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20  rop an existing 
18550 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68  named index.  Th
18560 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d  is routine.** im
18570 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f  plements the DRO
18580 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  P INDEX statemen
18590 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
185a0 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73  e3DropIndex(Pars
185b0 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
185c0 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  st *pName, int i
185d0 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65  fExists){.  Inde
185e0 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62  x *pIndex;.  Vdb
185f0 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
18600 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
18610 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
18620 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
18630 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20  nErr==0 );   /* 
18640 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74  Never called wit
18650 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a  h prior errors *
18660 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  /.  if( db->mall
18670 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
18680 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
18690 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ndex;.  }.  asse
186a0 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d  rt( pName->nSrc=
186b0 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  =1 );.  if( SQLI
186c0 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
186d0 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
186e0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
186f0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
18700 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  }.  pIndex = sql
18710 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
18720 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  , pName->a[0].zN
18730 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ame, pName->a[0]
18740 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69  .zDatabase);.  i
18750 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a  f( pIndex==0 ){.
18760 20 20 20 20 69 66 28 20 21 69 66 45 78 69 73 74      if( !ifExist
18770 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
18780 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
18790 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
187a0 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30  x: %S", pName, 0
187b0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
187c0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
187d0 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61  erifyNamedSchema
187e0 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e  (pParse, pName->
187f0 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
18800 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
18810 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
18820 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   1;.    goto exi
18830 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
18840 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  }.  if( pIndex->
18850 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20  autoIndex ){.   
18860 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
18870 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20  (pParse, "index 
18880 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
18890 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22  UNIQUE ".      "
188a0 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
188b0 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74  onstraint cannot
188c0 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29   be dropped", 0)
188d0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
188e0 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
188f0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
18900 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
18910 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
18920 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
18930 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
18940 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
18950 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
18960 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54  ROP_INDEX;.    T
18970 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
18980 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20  dex->pTable;.   
18990 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
189a0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
189b0 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  zName;.    const
189c0 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43   char *zTab = SC
189d0 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b  HEMA_TABLE(iDb);
189e0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
189f0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
18a00 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
18a10 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29   zTab, 0, zDb) )
18a20 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
18a30 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
18a40 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49    }.    if( !OMI
18a50 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 20  T_TEMPDB && iDb 
18a60 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  ) code = SQLITE_
18a70 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  DROP_TEMP_INDEX;
18a80 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
18a90 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
18aa0 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e  , code, pIndex->
18ab0 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
18ac0 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
18ad0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
18ae0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
18af0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
18b00 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
18b10 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78  remove the index
18b20 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61   and from the ma
18b30 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ster table */.  
18b40 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
18b50 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
18b60 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
18b70 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
18b80 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
18b90 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
18ba0 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
18bb0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45  arse,.       "DE
18bc0 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
18bd0 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 20 41 4e  WHERE name=%Q AN
18be0 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c  D type='index'",
18bf0 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  .       db->aDb[
18c00 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
18c10 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70  MA_TABLE(iDb), p
18c20 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20  Index->zName.   
18c30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   );.    sqlite3C
18c40 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70  learStatTables(p
18c50 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 64 78  Parse, iDb, "idx
18c60 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ", pIndex->zName
18c70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
18c80 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
18c90 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73  e, iDb);.    des
18ca0 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
18cb0 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75  rse, pIndex->tnu
18cc0 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  m, iDb);.    sql
18cd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
18ce0 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20  , OP_DropIndex, 
18cf0 69 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65  iDb, 0, 0, pInde
18d00 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  x->zName, 0);.  
18d10 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  }..exit_drop_ind
18d20 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63  ex:.  sqlite3Src
18d30 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
18d40 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
18d50 70 41 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e  pArray is a poin
18d60 74 65 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20  ter to an array 
18d70 6f 66 20 6f 62 6a 65 63 74 73 2e 20 45 61 63 68  of objects. Each
18d80 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a   object in the.*
18d90 2a 20 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74  * array is szEnt
18da0 72 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ry bytes in size
18db0 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75  . This routine u
18dc0 73 65 73 20 73 71 6c 69 74 65 33 44 62 52 65 61  ses sqlite3DbRea
18dd0 6c 6c 6f 63 28 29 0a 2a 2a 20 74 6f 20 65 78 74  lloc().** to ext
18de0 65 6e 64 20 74 68 65 20 61 72 72 61 79 20 73 6f  end the array so
18df0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73   that there is s
18e00 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20 6f  pace for a new o
18e10 62 6a 65 63 74 20 61 74 20 74 68 65 20 65 6e 64  bject at the end
18e20 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
18e30 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
18e40 6c 6c 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 63  lled, *pnEntry c
18e50 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 75 72 72  ontains the curr
18e60 65 6e 74 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74  ent size of.** t
18e70 68 65 20 61 72 72 61 79 20 28 69 6e 20 65 6e 74  he array (in ent
18e80 72 69 65 73 20 2d 20 73 6f 20 74 68 65 20 61 6c  ries - so the al
18e90 6c 6f 63 61 74 69 6f 6e 20 69 73 20 28 28 2a 70  location is ((*p
18ea0 6e 45 6e 74 72 79 29 20 2a 20 73 7a 45 6e 74 72  nEntry) * szEntr
18eb0 79 29 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20 74  y) bytes.** in t
18ec0 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  otal)..**.** If 
18ed0 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 69 73  the realloc() is
18ee0 20 73 75 63 63 65 73 73 66 75 6c 20 28 69 2e 65   successful (i.e
18ef0 2e 20 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64  . if no OOM cond
18f00 69 74 69 6f 6e 20 6f 63 63 75 72 73 29 2c 20 74  ition occurs), t
18f10 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 6c 6c 6f  he.** space allo
18f20 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 6e 65  cated for the ne
18f30 77 20 6f 62 6a 65 63 74 20 69 73 20 7a 65 72 6f  w object is zero
18f40 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 75 70 64  ed, *pnEntry upd
18f50 61 74 65 64 20 74 6f 0a 2a 2a 20 72 65 66 6c 65  ated to.** refle
18f60 63 74 20 74 68 65 20 6e 65 77 20 73 69 7a 65 20  ct the new size 
18f70 6f 66 20 74 68 65 20 61 72 72 61 79 20 61 6e 64  of the array and
18f80 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
18f90 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
18fa0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 2a 70  .** returned. *p
18fb0 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  Idx is set to th
18fc0 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
18fd0 65 77 20 61 72 72 61 79 20 65 6e 74 72 79 20 69  ew array entry i
18fe0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
18ff0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
19000 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 66   the realloc() f
19010 61 69 6c 73 2c 20 2a 70 49 64 78 20 69 73 20 73  ails, *pIdx is s
19020 65 74 20 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74  et to -1, *pnEnt
19030 72 79 20 72 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e  ry remains.** un
19040 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 63 6f  changed and a co
19050 70 79 20 6f 66 20 70 41 72 72 61 79 20 72 65 74  py of pArray ret
19060 75 72 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  urned..*/.void *
19070 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
19080 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20  cate(.  sqlite3 
19090 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e  *db,      /* Con
190a0 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66  nection to notif
190b0 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  y of malloc fail
190c0 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  ures */.  void *
190d0 70 41 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41  pArray,     /* A
190e0 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e  rray of objects.
190f0 20 20 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c    Might be reall
19100 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ocated */.  int 
19110 73 7a 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a  szEntry,      /*
19120 20 53 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62   Size of each ob
19130 6a 65 63 74 20 69 6e 20 74 68 65 20 61 72 72 61  ject in the arra
19140 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e  y */.  int *pnEn
19150 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62  try,     /* Numb
19160 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 63 75  er of objects cu
19170 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a  rrently in use *
19180 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78 20 20 20  /.  int *pIdx   
19190 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
191a0 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 6e 65  he index of a ne
191b0 77 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29  w slot here */.)
191c0 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  {.  char *z;.  i
191d0 6e 74 20 6e 20 3d 20 2a 70 6e 45 6e 74 72 79 3b  nt n = *pnEntry;
191e0 0a 20 20 69 66 28 20 28 6e 20 26 20 28 6e 2d 31  .  if( (n & (n-1
191f0 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))==0 ){.    int
19200 20 73 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f 20 31   sz = (n==0) ? 1
19210 20 3a 20 32 2a 6e 3b 0a 20 20 20 20 76 6f 69 64   : 2*n;.    void
19220 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
19230 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41  DbRealloc(db, pA
19240 72 72 61 79 2c 20 73 7a 2a 73 7a 45 6e 74 72 79  rray, sz*szEntry
19250 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
19260 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64  =0 ){.      *pId
19270 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  x = -1;.      re
19280 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20 20 20  turn pArray;.   
19290 20 7d 0a 20 20 20 20 70 41 72 72 61 79 20 3d 20   }.    pArray = 
192a0 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  pNew;.  }.  z = 
192b0 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b 0a 20  (char*)pArray;. 
192c0 20 6d 65 6d 73 65 74 28 26 7a 5b 6e 20 2a 20 73   memset(&z[n * s
192d0 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e  zEntry], 0, szEn
192e0 74 72 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  try);.  *pIdx = 
192f0 6e 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b  n;.  ++*pnEntry;
19300 0a 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79  .  return pArray
19310 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
19320 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
19330 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c  to the given IdL
19340 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
19350 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20  ew IdList if.** 
19360 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41  need be..**.** A
19370 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72   new IdList is r
19380 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
19390 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   if malloc() fai
193a0 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73  ls..*/.IdList *s
193b0 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
193c0 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nd(sqlite3 *db, 
193d0 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  IdList *pList, T
193e0 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
193f0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
19400 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
19410 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
19420 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
19430 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a  zeof(IdList) );.
19440 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
19450 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
19460 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71  .  pList->a = sq
19470 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
19480 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20  te(.      db,.  
19490 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20      pList->a,.  
194a0 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74      sizeof(pList
194b0 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 26  ->a[0]),.      &
194c0 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20  pList->nId,.    
194d0 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20    &i.  );.  if( 
194e0 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  i<0 ){.    sqlit
194f0 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
19500 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72  b, pList);.    r
19510 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
19520 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
19530 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
19540 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b  omToken(db, pTok
19550 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  en);.  return pL
19560 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ist;.}../*.** De
19570 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a  lete an IdList..
19580 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49  */.void sqlite3I
19590 64 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  dListDelete(sqli
195a0 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
195b0 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
195c0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
195d0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
195e0 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
195f0 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  Id; i++){.    sq
19600 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
19610 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
19620 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
19630 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
19640 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  t->a);.  sqlite3
19650 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
19660 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
19670 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  rn the index in 
19680 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65  pList of the ide
19690 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49  ntifier named zI
196a0 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a  d.  Return -1.**
196b0 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
196c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c  /.int sqlite3IdL
196d0 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20  istIndex(IdList 
196e0 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68  *pList, const ch
196f0 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
19700 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
19710 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  ==0 ) return -1;
19720 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
19730 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
19740 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
19750 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
19760 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  i].zName, zName)
19770 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
19780 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
19790 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64  .}../*.** Expand
197a0 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63   the space alloc
197b0 61 74 65 64 20 66 6f 72 20 74 68 65 20 67 69 76  ated for the giv
197c0 65 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63  en SrcList objec
197d0 74 20 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67  t by.** creating
197e0 20 6e 45 78 74 72 61 20 6e 65 77 20 73 6c 6f 74   nExtra new slot
197f0 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 69  s beginning at i
19800 53 74 61 72 74 2e 20 20 69 53 74 61 72 74 20 69  Start.  iStart i
19810 73 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a  s zero based..**
19820 20 4e 65 77 20 73 6c 6f 74 73 20 61 72 65 20 7a   New slots are z
19830 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  eroed..**.** For
19840 20 65 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73   example, suppos
19850 65 20 61 20 53 72 63 4c 69 73 74 20 69 6e 69 74  e a SrcList init
19860 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74  ially contains t
19870 77 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e  wo entries: A,B.
19880 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20 33 20  .** To append 3 
19890 6e 65 77 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f  new entries onto
198a0 20 74 68 65 20 65 6e 64 2c 20 64 6f 20 74 68 69   the end, do thi
198b0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69  s:.**.**    sqli
198c0 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
198d0 65 28 64 62 2c 20 70 53 72 63 6c 69 73 74 2c 20  e(db, pSrclist, 
198e0 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74  3, 2);.**.** Aft
198f0 65 72 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76  er the call abov
19900 65 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61  e it would conta
19910 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20  in:  A, B, nil, 
19920 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20  nil, nil..** If 
19930 74 68 65 20 69 53 74 61 72 74 20 61 72 67 75 6d  the iStart argum
19940 65 6e 74 20 68 61 64 20 62 65 65 6e 20 31 20 69  ent had been 1 i
19950 6e 73 74 65 61 64 20 6f 66 20 32 2c 20 74 68 65  nstead of 2, the
19960 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  n the result.** 
19970 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 3a  would have been:
19980 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e    A, nil, nil, n
19990 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65 70 65  il, B.  To prepe
199a0 6e 64 20 74 68 65 20 6e 65 77 20 73 6c 6f 74 73  nd the new slots
199b0 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61 72 74 20  ,.** the iStart 
199c0 76 61 6c 75 65 20 77 6f 75 6c 64 20 62 65 20 30  value would be 0
199d0 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 74 68  .  The result th
199e0 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20  en would.** be: 
199f0 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41  nil, nil, nil, A
19a00 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  , B..**.** If a 
19a10 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
19a20 6e 20 66 61 69 6c 73 20 74 68 65 20 53 72 63 4c  n fails the SrcL
19a30 69 73 74 20 69 73 20 75 6e 63 68 61 6e 67 65 64  ist is unchanged
19a40 2e 20 20 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61  .  The.** db->ma
19a50 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
19a60 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74  will be set to t
19a70 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  rue..*/.SrcList 
19a80 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45  *sqlite3SrcListE
19a90 6e 6c 61 72 67 65 28 0a 20 20 73 71 6c 69 74 65  nlarge(.  sqlite
19aa0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a 20  3 *db,       /* 
19ab0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
19ac0 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66  ion to notify of
19ad0 20 4f 4f 4d 20 65 72 72 6f 72 73 20 2a 2f 0a 20   OOM errors */. 
19ae0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
19af0 20 20 20 20 2f 2a 20 54 68 65 20 53 72 63 4c 69      /* The SrcLi
19b00 73 74 20 74 6f 20 62 65 20 65 6e 6c 61 72 67 65  st to be enlarge
19b10 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  d */.  int nExtr
19b20 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  a,        /* Num
19b30 62 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73  ber of new slots
19b40 20 74 6f 20 61 64 64 20 74 6f 20 70 53 72 63 2d   to add to pSrc-
19b50 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53  >a[] */.  int iS
19b60 74 61 72 74 20 20 20 20 20 20 20 20 20 2f 2a 20  tart         /* 
19b70 49 6e 64 65 78 20 69 6e 20 70 53 72 63 2d 3e 61  Index in pSrc->a
19b80 5b 5d 20 6f 66 20 66 69 72 73 74 20 6e 65 77 20  [] of first new 
19b90 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  slot */.){.  int
19ba0 20 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79   i;..  /* Sanity
19bb0 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c   checking on cal
19bc0 6c 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  ling parameters 
19bd0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  */.  assert( iSt
19be0 61 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  art>=0 );.  asse
19bf0 72 74 28 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b  rt( nExtra>=1 );
19c00 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21  .  assert( pSrc!
19c10 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
19c20 69 53 74 61 72 74 3c 3d 70 53 72 63 2d 3e 6e 53  iStart<=pSrc->nS
19c30 72 63 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  rc );..  /* Allo
19c40 63 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  cate additional 
19c50 73 70 61 63 65 20 69 66 20 6e 65 65 64 65 64 20  space if needed 
19c60 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  */.  if( pSrc->n
19c70 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d  Src+nExtra>pSrc-
19c80 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53  >nAlloc ){.    S
19c90 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
19ca0 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70    int nAlloc = p
19cb0 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61  Src->nSrc+nExtra
19cc0 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a  ;.    int nGot;.
19cd0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
19ce0 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
19cf0 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20  pSrc,.          
19d00 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53 72       sizeof(*pSr
19d10 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a  c) + (nAlloc-1)*
19d20 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
19d30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ]) );.    if( pN
19d40 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ew==0 ){.      a
19d50 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
19d60 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
19d70 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20 20   return pSrc;.  
19d80 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20 70    }.    pSrc = p
19d90 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20  New;.    nGot = 
19da0 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  (sqlite3DbMalloc
19db0 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 20 2d  Size(db, pNew) -
19dc0 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f   sizeof(*pSrc))/
19dd0 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
19de0 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e  ])+1;.    pSrc->
19df0 6e 41 6c 6c 6f 63 20 3d 20 28 75 38 29 6e 47 6f  nAlloc = (u8)nGo
19e00 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76  t;.  }..  /* Mov
19e10 65 20 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73  e existing slots
19e20 20 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72   that come after
19e30 20 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72   the newly inser
19e40 74 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f  ted slots.  ** o
19e50 75 74 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f  ut of the way */
19e60 0a 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e  .  for(i=pSrc->n
19e70 53 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74  Src-1; i>=iStart
19e80 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63  ; i--){.    pSrc
19e90 2d 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20  ->a[i+nExtra] = 
19ea0 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a  pSrc->a[i];.  }.
19eb0 20 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20    pSrc->nSrc += 
19ec0 28 69 38 29 6e 45 78 74 72 61 3b 0a 0a 20 20 2f  (i8)nExtra;..  /
19ed0 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c 79  * Zero the newly
19ee0 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73   allocated slots
19ef0 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 53   */.  memset(&pS
19f00 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30  rc->a[iStart], 0
19f10 2c 20 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61  , sizeof(pSrc->a
19f20 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20  [0])*nExtra);.  
19f30 66 6f 72 28 69 3d 69 53 74 61 72 74 3b 20 69 3c  for(i=iStart; i<
19f40 69 53 74 61 72 74 2b 6e 45 78 74 72 61 3b 20 69  iStart+nExtra; i
19f50 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61  ++){.    pSrc->a
19f60 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31  [i].iCursor = -1
19f70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75  ;.  }..  /* Retu
19f80 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
19f90 74 68 65 20 65 6e 6c 61 72 67 65 64 20 53 72 63  the enlarged Src
19fa0 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e  List */.  return
19fb0 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   pSrc;.}.../*.**
19fc0 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61   Append a new ta
19fd0 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20  ble name to the 
19fe0 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20  given SrcList.  
19ff0 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63  Create a new Src
1a000 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
1a010 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79  be.  A new entry
1a020 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74   is created in t
1a030 68 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20  he SrcList even 
1a040 69 66 20 70 54 61 62 6c 65 20 69 73 20 4e 55 4c  if pTable is NUL
1a050 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69  L..**.** A SrcLi
1a060 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  st is returned, 
1a070 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65  or NULL if there
1a080 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   is an OOM error
1a090 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 0a  .  The returned.
1a0a0 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74  ** SrcList might
1a0b0 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
1a0c0 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
1a0d0 20 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69 74   was input or it
1a0e0 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e   might be.** a n
1a0f0 65 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f  ew one.  If an O
1a100 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  OM error does oc
1a110 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 70  curs, then the p
1a120 72 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70 4c  rior value of pL
1a130 69 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 69  ist.** that is i
1a140 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75  nput to this rou
1a150 74 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74 69  tine is automati
1a160 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a  cally freed..**.
1a170 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20  ** If pDatabase 
1a180 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20  is not null, it 
1a190 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74  means that the t
1a1a0 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69  able has an opti
1a1b0 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65  onal.** database
1a1c0 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c   name prefix.  L
1a1d0 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61  ike this:  "data
1a1e0 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68  base.table".  Th
1a1f0 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70  e pDatabase.** p
1a200 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62  oints to the tab
1a210 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
1a220 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f  pTable points to
1a230 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
1a240 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69  me..** The SrcLi
1a250 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65  st.a[].zName fie
1a260 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ld is filled wit
1a270 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  h the table name
1a280 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20   which might.** 
1a290 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65  come from pTable
1a2a0 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69   (if pDatabase i
1a2b0 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20  s NULL) or from 
1a2c0 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20  pDatabase.  .** 
1a2d0 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74  SrcList.a[].zDat
1a2e0 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20  abase is filled 
1a2f0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
1a300 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62  e name from pTab
1a310 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e  le,.** or with N
1a320 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61  ULL if no databa
1a330 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e  se is specified.
1a340 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  .**.** In other 
1a350 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c  words, if call l
1a360 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1a370 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
1a380 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41  rcListAppend(D,A
1a390 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,0);.**.** The
1a3a0 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e  n B is a table n
1a3b0 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
1a3c0 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73  base name is uns
1a3d0 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61  pecified.  If ca
1a3e0 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69  lled.** like thi
1a3f0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
1a400 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1a410 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a  ppend(D,A,B,C);.
1a420 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20  **.** Then C is 
1a430 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  the table name a
1a440 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61  nd B is the data
1a450 62 61 73 65 20 6e 61 6d 65 2e 20 20 49 66 20 43  base name.  If C
1a460 20 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74   is defined.** t
1a470 68 65 6e 20 73 6f 20 69 73 20 42 2e 20 20 49 6e  hen so is B.  In
1a480 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 65   other words, we
1a490 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 63 61   never have a ca
1a4a0 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20  se where:.**.** 
1a4b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
1a4c0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41  rcListAppend(D,A
1a4d0 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74  ,0,C);.**.** Bot
1a4e0 68 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61  h pTable and pDa
1a4f0 74 61 62 61 73 65 20 61 72 65 20 61 73 73 75 6d  tabase are assum
1a500 65 64 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e  ed to be quoted.
1a510 20 20 54 68 65 79 20 61 72 65 20 64 65 71 75 6f    They are dequo
1a520 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65  ted.** before be
1a530 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68 65  ing added to the
1a540 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63   SrcList..*/.Src
1a550 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
1a560 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 73 71  ListAppend(.  sq
1a570 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1a580 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
1a590 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c  to notify of mal
1a5a0 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a  loc failures */.
1a5b0 20 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74    SrcList *pList
1a5c0 2c 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20  ,     /* Append 
1a5d0 74 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74 2e  to this SrcList.
1a5e0 20 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61 20   NULL creates a 
1a5f0 6e 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20  new SrcList */. 
1a600 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20   Token *pTable, 
1a610 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
1a620 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b   append */.  Tok
1a630 65 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20 20  en *pDatabase   
1a640 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66 20   /* Database of 
1a650 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  the table */.){.
1a660 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1a670 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1a680 61 73 73 65 72 74 28 20 70 44 61 74 61 62 61 73  assert( pDatabas
1a690 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d  e==0 || pTable!=
1a6a0 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20  0 );  /* Cannot 
1a6b0 68 61 76 65 20 43 20 77 69 74 68 6f 75 74 20 42  have C without B
1a6c0 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   */.  if( pList=
1a6d0 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
1a6e0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
1a6f0 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
1a700 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20  (SrcList) );.   
1a710 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1a720 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c  return 0;.    pL
1a730 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b  ist->nAlloc = 1;
1a740 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 73  .  }.  pList = s
1a750 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
1a760 61 72 67 65 28 64 62 2c 20 70 4c 69 73 74 2c 20  arge(db, pList, 
1a770 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b  1, pList->nSrc);
1a780 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1a790 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
1a7a0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
1a7b0 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
1a7c0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1a7d0 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69  }.  pItem = &pLi
1a7e0 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72  st->a[pList->nSr
1a7f0 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74  c-1];.  if( pDat
1a800 61 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61  abase && pDataba
1a810 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  se->z==0 ){.    
1a820 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  pDatabase = 0;. 
1a830 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61   }.  if( pDataba
1a840 73 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20  se ){.    Token 
1a850 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61  *pTemp = pDataba
1a860 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73  se;.    pDatabas
1a870 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20  e = pTable;.    
1a880 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a  pTable = pTemp;.
1a890 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61    }.  pItem->zNa
1a8a0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
1a8b0 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54  FromToken(db, pT
1a8c0 61 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e  able);.  pItem->
1a8d0 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69  zDatabase = sqli
1a8e0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1a8f0 28 64 62 2c 20 70 44 61 74 61 62 61 73 65 29 3b  (db, pDatabase);
1a900 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
1a910 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
1a920 20 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65   VdbeCursor inde
1a930 78 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c  x numbers to all
1a940 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63   tables in a Src
1a950 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  List.*/.void sql
1a960 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
1a970 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a  nCursors(Parse *
1a980 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
1a990 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
1a9a0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
1a9b0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1a9c0 20 20 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c    assert(pList |
1a9d0 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
1a9e0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1a9f0 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
1aa00 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
1aa10 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73  pList->a; i<pLis
1aa20 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
1aa30 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  tem++){.      if
1aa40 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ( pItem->iCursor
1aa50 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  >=0 ) break;.   
1aa60 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f     pItem->iCurso
1aa70 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
1aa80 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  ++;.      if( pI
1aa90 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  tem->pSelect ){.
1aaa0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
1aab0 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
1aac0 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65  ors(pParse, pIte
1aad0 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63  m->pSelect->pSrc
1aae0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1aaf0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
1ab00 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53  lete an entire S
1ab10 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67  rcList including
1ab20 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75   all its substru
1ab30 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cture..*/.void s
1ab40 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
1ab50 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
1ab60 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29   SrcList *pList)
1ab70 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
1ab80 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1ab90 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70   *pItem;.  if( p
1aba0 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1abb0 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
1abc0 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
1abd0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
1abe0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
1abf0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1ac00 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
1ac10 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
1ac20 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
1ac30 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
1ac40 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1ac50 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
1ac60 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1ac70 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 49 6e 64  (db, pItem->zInd
1ac80 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ex);.    sqlite3
1ac90 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
1aca0 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20  pItem->pTab);.  
1acb0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1acc0 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
1acd0 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73  >pSelect);.    s
1ace0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
1acf0 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29  (db, pItem->pOn)
1ad00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  ;.    sqlite3IdL
1ad10 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49  istDelete(db, pI
1ad20 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
1ad30 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
1ad40 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  e(db, pList);.}.
1ad50 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1ad60 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
1ad70 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 61   the parser to a
1ad80 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f  dd a new term to
1ad90 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61   the.** end of a
1ada0 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c   growing FROM cl
1adb0 61 75 73 65 2e 20 20 54 68 65 20 22 70 22 20 70  ause.  The "p" p
1adc0 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
1add0 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46  part of.** the F
1ade0 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20  ROM clause that 
1adf0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1ae00 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22   constructed.  "
1ae10 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66  p" is NULL.** if
1ae20 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
1ae30 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46  st term of the F
1ae40 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61  ROM clause.  pTa
1ae50 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73  ble and pDatabas
1ae60 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d  e.** are the nam
1ae70 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61  e of the table a
1ae80 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  nd database name
1ae90 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
1aea0 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44  ause term..** pD
1aeb0 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20  atabase is NULL 
1aec0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1aed0 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69  name qualifier i
1aee0 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a  s missing - the.
1aef0 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20  ** usual case.  
1af00 49 66 20 74 68 65 20 74 65 72 6d 20 68 61 73 20  If the term has 
1af10 61 20 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41  a alias, then pA
1af20 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74  lias points to t
1af30 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65  he.** alias toke
1af40 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20  n.  If the term 
1af50 69 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 74  is a subquery, t
1af60 68 65 6e 20 70 53 75 62 71 75 65 72 79 20 69 73  hen pSubquery is
1af70 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73   the.** SELECT s
1af80 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68  tatement that th
1af90 65 20 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64  e subquery encod
1afa0 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20  es.  The pTable 
1afb0 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65  and.** pDatabase
1afc0 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20   parameters are 
1afd0 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72  NULL for subquer
1afe0 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e  ies.  The pOn an
1aff0 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61  d pUsing.** para
1b000 6d 65 74 65 72 73 20 61 72 65 20 74 68 65 20 63  meters are the c
1b010 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e  ontent of the ON
1b020 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
1b030 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  es..**.** Return
1b040 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77   a new SrcList w
1b050 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20  hich encodes is 
1b060 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68  the FROM with th
1b070 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64  e new.** term ad
1b080 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  ded..*/.SrcList 
1b090 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41  *sqlite3SrcListA
1b0a0 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20  ppendFromTerm(. 
1b0b0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1b0c0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
1b0d0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1b0e0 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20   SrcList *p,    
1b0f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1b100 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74 68 65  left part of the
1b110 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72   FROM clause alr
1b120 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54  eady seen */.  T
1b130 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20  oken *pTable,   
1b140 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1b150 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61  f the table to a
1b160 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63  dd to the FROM c
1b170 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  lause */.  Token
1b180 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20 20 20   *pDatabase,    
1b190 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1b1a0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
1b1b0 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a  ining pTable */.
1b1c0 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c    Token *pAlias,
1b1d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b1e0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
1b1f0 20 6f 66 20 74 68 65 20 41 53 20 73 75 62 65 78   of the AS subex
1b200 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65  pression */.  Se
1b210 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c  lect *pSubquery,
1b220 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75        /* A subqu
1b230 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63  ery used in plac
1b240 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d  e of a table nam
1b250 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e  e */.  Expr *pOn
1b260 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1b270 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  * The ON clause 
1b280 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49  of a join */.  I
1b290 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20  dList *pUsing   
1b2a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53         /* The US
1b2b0 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ING clause of a 
1b2c0 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  join */.){.  str
1b2d0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1b2e0 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
1b2f0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1b300 3e 64 62 3b 0a 20 20 69 66 28 20 21 70 20 26 26  >db;.  if( !p &&
1b310 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29   (pOn || pUsing)
1b320 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1b330 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1b340 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69  "a JOIN clause i
1b350 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  s required befor
1b360 65 20 25 73 22 2c 20 0a 20 20 20 20 20 20 28 70  e %s", .      (p
1b370 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49  On ? "ON" : "USI
1b380 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  NG").    );.    
1b390 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d  goto append_from
1b3a0 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20  _error;.  }.  p 
1b3b0 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
1b3c0 41 70 70 65 6e 64 28 64 62 2c 20 70 2c 20 70 54  Append(db, p, pT
1b3d0 61 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29  able, pDatabase)
1b3e0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
1b3f0 4e 45 56 45 52 28 70 2d 3e 6e 53 72 63 3d 3d 30  NEVER(p->nSrc==0
1b400 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70  ) ){.    goto ap
1b410 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b  pend_from_error;
1b420 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
1b430 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b  p->a[p->nSrc-1];
1b440 0a 20 20 61 73 73 65 72 74 28 20 70 41 6c 69 61  .  assert( pAlia
1b450 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 41  s!=0 );.  if( pA
1b460 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70  lias->n ){.    p
1b470 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73  Item->zAlias = s
1b480 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1b490 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b  ken(db, pAlias);
1b4a0 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53  .  }.  pItem->pS
1b4b0 65 6c 65 63 74 20 3d 20 70 53 75 62 71 75 65 72  elect = pSubquer
1b4c0 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20  y;.  pItem->pOn 
1b4d0 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e  = pOn;.  pItem->
1b4e0 70 55 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b  pUsing = pUsing;
1b4f0 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61  .  return p;.. a
1b500 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
1b510 3a 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  :.  assert( p==0
1b520 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
1b530 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29  rDelete(db, pOn)
1b540 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73  ;.  sqlite3IdLis
1b550 74 44 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69  tDelete(db, pUsi
1b560 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ng);.  sqlite3Se
1b570 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
1b580 53 75 62 71 75 65 72 79 29 3b 0a 20 20 72 65 74  Subquery);.  ret
1b590 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1b5a0 41 64 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42  Add an INDEXED B
1b5b0 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44  Y or NOT INDEXED
1b5c0 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d   clause to the m
1b5d0 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
1b5e0 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f  ed .** element o
1b5f0 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73  f the source-lis
1b600 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
1b610 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
1b620 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1b630 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79  SrcListIndexedBy
1b640 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1b650 53 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65  SrcList *p, Toke
1b660 6e 20 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a  n *pIndexedBy){.
1b670 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
1b680 65 64 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28  edBy!=0 );.  if(
1b690 20 70 20 26 26 20 41 4c 57 41 59 53 28 70 2d 3e   p && ALWAYS(p->
1b6a0 6e 53 72 63 3e 30 29 20 29 7b 0a 20 20 20 20 73  nSrc>0) ){.    s
1b6b0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1b6c0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
1b6d0 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  a[p->nSrc-1];.  
1b6e0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
1b6f0 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 26  >notIndexed==0 &
1b700 26 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 3d  & pItem->zIndex=
1b710 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  =0 );.    if( pI
1b720 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26  ndexedBy->n==1 &
1b730 26 20 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a  & !pIndexedBy->z
1b740 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22   ){.      /* A "
1b750 4e 4f 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61  NOT INDEXED" cla
1b760 75 73 65 20 77 61 73 20 73 75 70 70 6c 69 65 64  use was supplied
1b770 2e 20 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20  . See parse.y . 
1b780 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63       ** construc
1b790 74 20 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20  t "indexed_opt" 
1b7a0 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a  for details. */.
1b7b0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 6e 6f 74        pItem->not
1b7c0 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20  Indexed = 1;.   
1b7d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
1b7e0 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71  tem->zIndex = sq
1b7f0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1b800 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
1b810 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20  IndexedBy);.    
1b820 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  }.  }.}../*.** W
1b830 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20  hen building up 
1b840 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e  a FROM clause in
1b850 20 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65   the parser, the
1b860 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a   join operator.*
1b870 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61  * is initially a
1b880 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c  ttached to the l
1b890 65 66 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75  eft operand.  Bu
1b8a0 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  t the code gener
1b8b0 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20  ator.** expects 
1b8c0 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
1b8d0 72 20 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72  r to be on the r
1b8e0 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54  ight operand.  T
1b8f0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53  his routine.** S
1b900 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f  hifts all join o
1b910 70 65 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65  perators from le
1b920 66 74 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20  ft to right for 
1b930 61 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a  an entire FROM.*
1b940 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  * clause..**.** 
1b950 45 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65  Example: Suppose
1b960 20 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b   the join is lik
1b970 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
1b980 20 20 20 20 20 20 20 20 41 20 6e 61 74 75 72 61          A natura
1b990 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a  l cross join B.*
1b9a0 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f  *.** The operato
1b9b0 72 20 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72  r is "natural cr
1b9c0 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20  oss join".  The 
1b9d0 41 20 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73  A and B operands
1b9e0 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69   are stored.** i
1b9f0 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d  n p->a[0] and p-
1ba00 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76  >a[1], respectiv
1ba10 65 6c 79 2e 20 20 54 68 65 20 70 61 72 73 65 72  ely.  The parser
1ba20 20 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65   initially store
1ba30 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f  s the.** operato
1ba40 72 20 77 69 74 68 20 41 2e 20 20 54 68 69 73 20  r with A.  This 
1ba50 72 6f 75 74 69 6e 65 20 73 68 69 66 74 73 20 74  routine shifts t
1ba60 68 61 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65  hat operator ove
1ba70 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20  r to B..*/.void 
1ba80 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68  sqlite3SrcListSh
1ba90 69 66 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c  iftJoinType(SrcL
1baa0 69 73 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ist *p){.  if( p
1bab0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
1bac0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 20     assert( p->a 
1bad0 7c 7c 20 70 2d 3e 6e 53 72 63 3d 3d 30 20 29 3b  || p->nSrc==0 );
1bae0 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53  .    for(i=p->nS
1baf0 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  rc-1; i>0; i--){
1bb00 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 6a  .      p->a[i].j
1bb10 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69  ointype = p->a[i
1bb20 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  -1].jointype;.  
1bb30 20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e    }.    p->a[0].
1bb40 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
1bb50 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  }.}../*.** Begin
1bb60 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
1bb70 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65  /.void sqlite3Be
1bb80 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  ginTransaction(P
1bb90 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1bba0 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74  t type){.  sqlit
1bbb0 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  e3 *db;.  Vdbe *
1bbc0 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  v;.  int i;..  a
1bbd0 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
1bbe0 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73   );.  db = pPars
1bbf0 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
1bc00 20 64 62 21 3d 30 20 29 3b 0a 2f 2a 20 20 69 66   db!=0 );./*  if
1bc10 28 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  ( db->aDb[0].pBt
1bc20 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 2a 2f  ==0 ) return; */
1bc30 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
1bc40 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1bc50 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
1bc60 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20  ON, "BEGIN", 0, 
1bc70 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1bc80 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69  ;.  }.  v = sqli
1bc90 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1bca0 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72  e);.  if( !v ) r
1bcb0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70  eturn;.  if( typ
1bcc0 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29  e!=TK_DEFERRED )
1bcd0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
1bce0 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
1bcf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1bd00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72  eAddOp2(v, OP_Tr
1bd10 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74  ansaction, i, (t
1bd20 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56  ype==TK_EXCLUSIV
1bd30 45 29 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  E)+1);.      sql
1bd40 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
1bd50 65 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  e(v, i);.    }. 
1bd60 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
1bd70 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74  AddOp2(v, OP_Aut
1bd80 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a  oCommit, 0, 0);.
1bd90 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
1bda0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
1bdb0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
1bdc0 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  mitTransaction(P
1bdd0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
1bde0 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73   Vdbe *v;..  ass
1bdf0 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29  ert( pParse!=0 )
1be00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
1be10 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69  se->db!=0 );.  i
1be20 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1be30 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1be40 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
1be50 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20  "COMMIT", 0, 0) 
1be60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
1be70 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33   }.  v = sqlite3
1be80 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1be90 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
1bea0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1beb0 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  2(v, OP_AutoComm
1bec0 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d  it, 1, 0);.  }.}
1bed0 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
1bee0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
1bef0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
1bf00 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f  llbackTransactio
1bf10 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
1bf20 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  {.  Vdbe *v;..  
1bf30 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d  assert( pParse!=
1bf40 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1bf50 50 61 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a  Parse->db!=0 );.
1bf60 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
1bf70 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1bf80 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
1bf90 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30  N, "ROLLBACK", 0
1bfa0 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , 0) ){.    retu
1bfb0 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71  rn;.  }.  v = sq
1bfc0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1bfd0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
1bfe0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1bff0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74  AddOp2(v, OP_Aut
1c000 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a  oCommit, 1, 1);.
1c010 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
1c020 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1c030 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
1c040 65 72 20 77 68 65 6e 20 69 74 20 70 61 72 73 65  er when it parse
1c050 73 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 63  s a command to c
1c060 72 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61 73  reate,.** releas
1c070 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  e or rollback an
1c080 20 53 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e 20   SQL savepoint. 
1c090 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1c0a0 53 61 76 65 70 6f 69 6e 74 28 50 61 72 73 65 20  Savepoint(Parse 
1c0b0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c  *pParse, int op,
1c0c0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
1c0d0 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
1c0e0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1c0f0 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
1c100 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a   pName);.  if( z
1c110 4e 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65  Name ){.    Vdbe
1c120 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
1c130 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 23 69  Vdbe(pParse);.#i
1c140 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c150 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
1c160 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1c170 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a   char * const az
1c180 5b 5d 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20  [] = { "BEGIN", 
1c190 22 52 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c  "RELEASE", "ROLL
1c1a0 42 41 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73  BACK" };.    ass
1c1b0 65 72 74 28 20 21 53 41 56 45 50 4f 49 4e 54 5f  ert( !SAVEPOINT_
1c1c0 42 45 47 49 4e 20 26 26 20 53 41 56 45 50 4f 49  BEGIN && SAVEPOI
1c1d0 4e 54 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26 26  NT_RELEASE==1 &&
1c1e0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
1c1f0 41 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66  ACK==2 );.#endif
1c200 0a 20 20 20 20 69 66 28 20 21 76 20 7c 7c 20 73  .    if( !v || s
1c210 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1c220 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
1c230 41 56 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d  AVEPOINT, az[op]
1c240 2c 20 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20  , zName, 0) ){. 
1c250 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
1c260 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  ee(pParse->db, z
1c270 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
1c280 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  urn;.    }.    s
1c290 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1c2a0 28 76 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74  (v, OP_Savepoint
1c2b0 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d  , op, 0, 0, zNam
1c2c0 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  e, P4_DYNAMIC);.
1c2d0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
1c2e0 65 20 73 75 72 65 20 74 68 65 20 54 45 4d 50 20  e sure the TEMP 
1c2f0 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
1c300 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66   and available f
1c310 6f 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a  or use.  Return.
1c320 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
1c330 20 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20   errors.  Leave 
1c340 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
1c350 65 73 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  es in the pParse
1c360 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69   structure..*/.i
1c370 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65  nt sqlite3OpenTe
1c380 6d 70 44 61 74 61 62 61 73 65 28 50 61 72 73 65  mpDatabase(Parse
1c390 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
1c3a0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1c3b0 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d  e->db;.  if( db-
1c3c0 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26  >aDb[1].pBt==0 &
1c3d0 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  & !pParse->expla
1c3e0 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  in ){.    int rc
1c3f0 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  ;.    Btree *pBt
1c400 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
1c410 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a  st int flags = .
1c420 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1c430 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
1c440 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
1c450 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
1c460 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
1c470 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
1c480 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c   |.          SQL
1c490 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
1c4a0 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20  NCLOSE |.       
1c4b0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
1c4c0 45 4d 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20  EMP_DB;..    rc 
1c4d0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  = sqlite3BtreeOp
1c4e0 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20  en(db->pVfs, 0, 
1c4f0 64 62 2c 20 26 70 42 74 2c 20 30 2c 20 66 6c 61  db, &pBt, 0, fla
1c500 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  gs);.    if( rc!
1c510 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c520 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1c530 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61  Msg(pParse, "una
1c540 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  ble to open a te
1c550 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
1c560 20 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65   ".        "file
1c570 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d   for storing tem
1c580 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b  porary tables");
1c590 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
1c5a0 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65  c = rc;.      re
1c5b0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1c5c0 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74    db->aDb[1].pBt
1c5d0 20 3d 20 70 42 74 3b 0a 20 20 20 20 61 73 73 65   = pBt;.    asse
1c5e0 72 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  rt( db->aDb[1].p
1c5f0 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66  Schema );.    if
1c600 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d  ( SQLITE_NOMEM==
1c610 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
1c620 61 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d  ageSize(pBt, db-
1c630 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 20 2d  >nextPagesize, -
1c640 31 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 64  1, 0) ){.      d
1c650 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1c660 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 1;.      retur
1c670 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
1c680 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1c690 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
1c6a0 45 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  E code that will
1c6b0 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65   verify the sche
1c6c0 6d 61 20 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74  ma cookie and st
1c6d0 61 72 74 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72  art.** a read-tr
1c6e0 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c  ansaction for al
1c6f0 6c 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  l named database
1c700 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74   files..**.** It
1c710 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   is important th
1c720 61 74 20 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f  at all schema co
1c730 6f 6b 69 65 73 20 62 65 20 76 65 72 69 66 69 65  okies be verifie
1c740 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61  d and all.** rea
1c750 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 62  d transactions b
1c760 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
1c770 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 68   anything else h
1c780 61 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65  appens in.** the
1c790 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20   VDBE program.  
1c7a0 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  But this routine
1c7b0 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 61   can be called a
1c7c0 66 74 65 72 20 6d 75 63 68 20 6f 74 68 65 72 0a  fter much other.
1c7d0 2a 2a 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e  ** code has been
1c7e0 20 67 65 6e 65 72 61 74 65 64 2e 20 20 53 6f 20   generated.  So 
1c7f0 68 65 72 65 20 69 73 20 77 68 61 74 20 77 65 20  here is what we 
1c800 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  do:.**.** The fi
1c810 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f  rst time this ro
1c820 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
1c830 20 77 65 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47   we code an OP_G
1c840 6f 74 6f 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c  oto that.** will
1c850 20 6a 75 6d 70 20 74 6f 20 61 20 73 75 62 72 6f   jump to a subro
1c860 75 74 69 6e 65 20 61 74 20 74 68 65 20 65 6e 64  utine at the end
1c870 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   of the program.
1c880 20 20 54 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63    Then we.** rec
1c890 6f 72 64 20 65 76 65 72 79 20 64 61 74 61 62 61  ord every databa
1c8a0 73 65 20 74 68 61 74 20 6e 65 65 64 73 20 69 74  se that needs it
1c8b0 73 20 73 63 68 65 6d 61 20 76 65 72 69 66 69 65  s schema verifie
1c8c0 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72  d in the.** pPar
1c8d0 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66  se->cookieMask f
1c8e0 69 65 6c 64 2e 20 20 4c 61 74 65 72 2c 20 61 66  ield.  Later, af
1c8f0 74 65 72 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f  ter all other co
1c900 64 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67  de has been.** g
1c910 65 6e 65 72 61 74 65 64 2c 20 74 68 65 20 73 75  enerated, the su
1c920 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 64 6f  broutine that do
1c930 65 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65  es the cookie ve
1c940 72 69 66 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a  rifications and.
1c950 2a 2a 20 73 74 61 72 74 73 20 74 68 65 20 74 72  ** starts the tr
1c960 61 6e 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20  ansactions will 
1c970 62 65 20 63 6f 64 65 64 20 61 6e 64 20 74 68 65  be coded and the
1c980 20 4f 50 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75   OP_Goto P2 valu
1c990 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64  e.** will be mad
1c9a0 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  e to point to th
1c9b0 61 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20  at subroutine.  
1c9c0 54 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f  The generation o
1c9d0 66 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20  f the.** cookie 
1c9e0 76 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75 62  verification sub
1c9f0 72 6f 75 74 69 6e 65 20 63 6f 64 65 20 68 61 70  routine code hap
1ca00 70 65 6e 73 20 69 6e 20 73 71 6c 69 74 65 33 46  pens in sqlite3F
1ca10 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a  inishCoding()..*
1ca20 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30 20 74 68  *.** If iDb<0 th
1ca30 65 6e 20 63 6f 64 65 20 74 68 65 20 4f 50 5f 47  en code the OP_G
1ca40 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74  oto only - don't
1ca50 20 73 65 74 20 66 6c 61 67 20 74 6f 20 76 65 72   set flag to ver
1ca60 69 66 79 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d  ify the.** schem
1ca70 61 20 6f 6e 20 61 6e 79 20 64 61 74 61 62 61 73  a on any databas
1ca80 65 73 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  es.  This can be
1ca90 20 75 73 65 64 20 74 6f 20 70 6f 73 69 74 69 6f   used to positio
1caa0 6e 20 74 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a  n the OP_Goto.**
1cab0 20 65 61 72 6c 79 20 69 6e 20 74 68 65 20 63 6f   early in the co
1cac0 64 65 2c 20 62 65 66 6f 72 65 20 77 65 20 6b 6e  de, before we kn
1cad0 6f 77 20 69 66 20 61 6e 79 20 64 61 74 61 62 61  ow if any databa
1cae0 73 65 20 74 61 62 6c 65 73 20 77 69 6c 6c 20 62  se tables will b
1caf0 65 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  e used..*/.void 
1cb00 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
1cb10 79 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70  ySchema(Parse *p
1cb20 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b  Parse, int iDb){
1cb30 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65  .  Parse *pTople
1cb40 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
1cb50 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
1cb60 65 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  e);..#ifndef SQL
1cb70 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
1cb80 0a 20 20 69 66 28 20 70 54 6f 70 6c 65 76 65 6c  .  if( pToplevel
1cb90 21 3d 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20  !=pParse ){.    
1cba0 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  /* This branch i
1cbb0 73 20 74 61 6b 65 6e 20 69 66 20 61 20 74 72 69  s taken if a tri
1cbc0 67 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  gger is currentl
1cbd0 79 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 49  y being coded. I
1cbe0 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 63 61  n this.    ** ca
1cbf0 73 65 2c 20 73 65 74 20 63 6f 6f 6b 69 65 47 6f  se, set cookieGo
1cc00 74 6f 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  to to a non-zero
1cc10 20 76 61 6c 75 65 20 74 6f 20 73 68 6f 77 20 74   value to show t
1cc20 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hat this functio
1cc30 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65  n.    ** has bee
1cc40 6e 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 20 69  n called. This i
1cc50 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 71  s used by the sq
1cc60 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e  lite3ExprCodeCon
1cc70 73 74 61 6e 74 73 28 29 0a 20 20 20 20 2a 2a 20  stants().    ** 
1cc80 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  function. */.   
1cc90 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
1cca0 6f 74 6f 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 65  oto = -1;.  }.#e
1ccb0 6e 64 69 66 0a 20 20 69 66 28 20 70 54 6f 70 6c  ndif.  if( pTopl
1ccc0 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  evel->cookieGoto
1ccd0 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ==0 ){.    Vdbe 
1cce0 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
1ccf0 64 62 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a  dbe(pToplevel);.
1cd00 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
1cd10 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20  eturn;  /* This 
1cd20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20  only happens if 
1cd30 74 68 65 72 65 20 77 61 73 20 61 20 70 72 69 6f  there was a prio
1cd40 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 70  r error */.    p
1cd50 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65  Toplevel->cookie
1cd60 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64  Goto = sqlite3Vd
1cd70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1cd80 6f 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20  oto, 0, 0)+1;.  
1cd90 7d 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29  }.  if( iDb>=0 )
1cda0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
1cdb0 62 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 64  b = pToplevel->d
1cdc0 62 3b 0a 20 20 20 20 79 44 62 4d 61 73 6b 20 6d  b;.    yDbMask m
1cdd0 61 73 6b 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  ask;..    assert
1cde0 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  ( iDb<db->nDb );
1cdf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
1ce00 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30  >aDb[iDb].pBt!=0
1ce10 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20   || iDb==1 );.  
1ce20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 53 51    assert( iDb<SQ
1ce30 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
1ce40 44 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  D+2 );.    asser
1ce50 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
1ce60 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
1ce70 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 6d 61 73  b, 0) );.    mas
1ce80 6b 20 3d 20 28 28 79 44 62 4d 61 73 6b 29 31 29  k = ((yDbMask)1)
1ce90 3c 3c 69 44 62 3b 0a 20 20 20 20 69 66 28 20 28  <<iDb;.    if( (
1cea0 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69  pToplevel->cooki
1ceb0 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30  eMask & mask)==0
1cec0 20 29 7b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65   ){.      pTople
1ced0 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  vel->cookieMask 
1cee0 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  |= mask;.      p
1cef0 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65  Toplevel->cookie
1cf00 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d  Value[iDb] = db-
1cf10 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
1cf20 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
1cf30 3b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  ;.      if( !OMI
1cf40 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
1cf50 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
1cf60 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74  lite3OpenTempDat
1cf70 61 62 61 73 65 28 70 54 6f 70 6c 65 76 65 6c 29  abase(pToplevel)
1cf80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1cf90 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
1cfa0 61 72 67 75 6d 65 6e 74 20 7a 44 62 20 69 73 20  argument zDb is 
1cfb0 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20  NULL, then call 
1cfc0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
1cfd0 79 53 63 68 65 6d 61 28 29 20 66 6f 72 20 65 61  ySchema() for ea
1cfe0 63 68 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20  ch .** attached 
1cff0 64 61 74 61 62 61 73 65 2e 20 4f 74 68 65 72 77  database. Otherw
1d000 69 73 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66  ise, invoke it f
1d010 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
1d020 6e 61 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a  named zDb only..
1d030 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
1d040 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63  odeVerifyNamedSc
1d050 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  hema(Parse *pPar
1d060 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
1d070 7a 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  zDb){.  sqlite3 
1d080 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1d090 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
1d0a0 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
1d0b0 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70   i++){.    Db *p
1d0c0 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
1d0d0 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
1d0e0 42 74 20 26 26 20 28 21 7a 44 62 20 7c 7c 20 30  Bt && (!zDb || 0
1d0f0 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
1d100 28 7a 44 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65  (zDb, pDb->zName
1d110 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  )) ){.      sqli
1d120 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
1d130 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a  ema(pParse, i);.
1d140 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1d150 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
1d160 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61   code that prepa
1d170 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e  res for doing an
1d180 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a   operation that.
1d190 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
1d1a0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
1d1b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1d1c0 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72   starts a new tr
1d1d0 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20  ansaction if we 
1d1e0 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  are not already 
1d1f0 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e  within.** a tran
1d200 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20  saction.  If we 
1d210 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68  are already with
1d220 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
1d230 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f  , then a checkpo
1d240 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66  int.** is set if
1d250 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e   the setStatemen
1d260 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
1d270 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69  rue.  A checkpoi
1d280 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nt should.** be 
1d290 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f  set for operatio
1d2a0 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61  ns that might fa
1d2b0 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e  il (due to a con
1d2c0 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66  straint) part of
1d2d0 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f  .** the way thro
1d2e0 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69  ugh and which wi
1d2f0 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20  ll need to undo 
1d300 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68  some writes with
1d310 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a  out having to.**
1d320 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68   rollback the wh
1d330 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ole transaction.
1d340 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73    For operations
1d350 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74   where all const
1d360 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65  raints.** can be
1d370 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20   checked before 
1d380 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20  any changes are 
1d390 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
1d3a0 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65  base, it is neve
1d3b0 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74  r.** necessary t
1d3c0 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61  o undo a write a
1d3d0 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  nd the checkpoin
1d3e0 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
1d3f0 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
1d400 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
1d410 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  eration(Parse *p
1d420 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74  Parse, int setSt
1d430 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62  atement, int iDb
1d440 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70  ){.  Parse *pTop
1d450 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
1d460 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
1d470 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  rse);.  sqlite3C
1d480 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
1d490 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
1d4a0 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65  pToplevel->write
1d4b0 4d 61 73 6b 20 7c 3d 20 28 28 79 44 62 4d 61 73  Mask |= ((yDbMas
1d4c0 6b 29 31 29 3c 3c 69 44 62 3b 0a 20 20 70 54 6f  k)1)<<iDb;.  pTo
1d4d0 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57  plevel->isMultiW
1d4e0 72 69 74 65 20 7c 3d 20 73 65 74 53 74 61 74 65  rite |= setState
1d4f0 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ment;.}../*.** I
1d500 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
1d510 20 73 74 61 74 65 6d 65 6e 74 20 63 75 72 72 65   statement curre
1d520 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
1d530 72 75 63 74 69 6f 6e 20 6d 69 67 68 74 20 77 72  ruction might wr
1d540 69 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e  ite.** more than
1d550 20 6f 6e 65 20 65 6e 74 72 79 20 28 65 78 61 6d   one entry (exam
1d560 70 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e  ple: deleting on
1d570 65 20 72 6f 77 20 74 68 65 6e 20 69 6e 73 65 72  e row then inser
1d580 74 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a  ting another,.**
1d590 20 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c 74 69   inserting multi
1d5a0 70 6c 65 20 72 6f 77 73 20 69 6e 20 61 20 74 61  ple rows in a ta
1d5b0 62 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e  ble, or insertin
1d5c0 67 20 61 20 72 6f 77 20 61 6e 64 20 69 6e 64 65  g a row and inde
1d5d0 78 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49  x entries.).** I
1d5e0 66 20 61 6e 20 61 62 6f 72 74 20 6f 63 63 75 72  f an abort occur
1d5f0 73 20 61 66 74 65 72 20 73 6f 6d 65 20 6f 66 20  s after some of 
1d600 74 68 65 73 65 20 77 72 69 74 65 73 20 68 61 76  these writes hav
1d610 65 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65  e completed, the
1d620 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  n it will.** be 
1d630 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64  necessary to und
1d640 6f 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 64 20  o the completed 
1d650 77 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  writes..*/.void 
1d660 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74  sqlite3MultiWrit
1d670 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
1d680 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c  {.  Parse *pTopl
1d690 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
1d6a0 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
1d6b0 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c  se);.  pToplevel
1d6c0 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 3d  ->isMultiWrite =
1d6d0 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68   1;.}../* .** Th
1d6e0 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
1d6f0 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
1d700 69 6e 65 20 69 66 20 69 73 20 64 69 73 63 6f 76  ine if is discov
1d710 65 72 73 20 74 68 61 74 20 69 74 20 69 73 0a 2a  ers that it is.*
1d720 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 62  * possible to ab
1d730 6f 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ort a statement 
1d740 70 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74  prior to complet
1d750 69 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72 20 74  ion.  In order t
1d760 6f 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68  o .** perform th
1d770 69 73 20 61 62 6f 72 74 20 77 69 74 68 6f 75 74  is abort without
1d780 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68 65 20   corrupting the 
1d790 64 61 74 61 62 61 73 65 2c 20 77 65 20 6e 65 65  database, we nee
1d7a0 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72  d to make.** sur
1d7b0 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65  e that the state
1d7c0 6d 65 6e 74 20 69 73 20 70 72 6f 74 65 63 74 65  ment is protecte
1d7d0 64 20 62 79 20 61 20 73 74 61 74 65 6d 65 6e 74  d by a statement
1d7e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1d7f0 0a 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c  .** Technically,
1d800 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f   we only need to
1d810 20 73 65 74 20 74 68 65 20 6d 61 79 41 62 6f 72   set the mayAbor
1d820 74 20 66 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a  t flag if the.**
1d830 20 69 73 4d 75 6c 74 69 57 72 69 74 65 20 66 6c   isMultiWrite fl
1d840 61 67 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ag was previousl
1d850 79 20 73 65 74 2e 20 20 54 68 65 72 65 20 69 73  y set.  There is
1d860 20 61 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e   a time dependen
1d870 63 79 0a 2a 2a 20 73 75 63 68 20 74 68 61 74 20  cy.** such that 
1d880 74 68 65 20 61 62 6f 72 74 20 6d 75 73 74 20 6f  the abort must o
1d890 63 63 75 72 20 61 66 74 65 72 20 74 68 65 20 6d  ccur after the m
1d8a0 75 6c 74 69 77 72 69 74 65 2e 20 20 54 68 69 73  ultiwrite.  This
1d8b0 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73   makes.** some s
1d8c0 74 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76  tatements involv
1d8d0 69 6e 67 20 74 68 65 20 52 45 50 4c 41 43 45 20  ing the REPLACE 
1d8e0 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  conflict resolut
1d8f0 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a  ion algorithm.**
1d900 20 67 6f 20 61 20 6c 69 74 74 6c 65 20 66 61 73   go a little fas
1d910 74 65 72 2e 20 20 42 75 74 20 74 61 6b 69 6e 67  ter.  But taking
1d920 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68   advantage of th
1d930 69 73 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e  is time dependen
1d940 63 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d  cy.** makes it m
1d950 6f 72 65 20 64 69 66 66 69 63 75 6c 74 20 74 6f  ore difficult to
1d960 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20   prove that the 
1d970 63 6f 64 65 20 69 73 20 63 6f 72 72 65 63 74 20  code is correct 
1d980 28 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c  (in .** particul
1d990 61 72 2c 20 69 74 20 70 72 65 76 65 6e 74 73 20  ar, it prevents 
1d9a0 75 73 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20  us from writing 
1d9b0 61 6e 20 65 66 66 65 63 74 69 76 65 0a 2a 2a 20  an effective.** 
1d9c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
1d9d0 66 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d  f sqlite3AssertM
1d9e0 61 79 41 62 6f 72 74 28 29 29 20 61 6e 64 20 73  ayAbort()) and s
1d9f0 6f 20 77 65 20 68 61 76 65 20 63 68 6f 73 65 6e  o we have chosen
1da00 0a 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68 65 20  .** to take the 
1da10 73 61 66 65 20 72 6f 75 74 65 20 61 6e 64 20 73  safe route and s
1da20 6b 69 70 20 74 68 65 20 6f 70 74 69 6d 69 7a 61  kip the optimiza
1da30 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
1da40 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 50 61  lite3MayAbort(Pa
1da50 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
1da60 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
1da70 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
1da80 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
1da90 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61  .  pToplevel->ma
1daa0 79 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f  yAbort = 1;.}../
1dab0 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
1dac0 48 61 6c 74 20 74 68 61 74 20 63 61 75 73 65 73  Halt that causes
1dad0 20 74 68 65 20 76 64 62 65 20 74 6f 20 72 65 74   the vdbe to ret
1dae0 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f  urn an SQLITE_CO
1daf0 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f  NSTRAINT.** erro
1db00 72 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72 20 70  r. The onError p
1db10 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69  arameter determi
1db20 6e 65 73 20 77 68 69 63 68 20 28 69 66 20 61 6e  nes which (if an
1db30 79 29 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  y) of the statem
1db40 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75  ent.** and/or cu
1db50 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
1db60 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1db70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1db80 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
1db90 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1dba0 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
1dbb0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
1dbc0 20 65 72 72 43 6f 64 65 2c 20 20 20 20 20 20 2f   errCode,      /
1dbd0 2a 20 65 78 74 65 6e 64 65 64 20 65 72 72 6f 72  * extended error
1dbe0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   code */.  int o
1dbf0 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20  nError,      /* 
1dc00 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20  Constraint type 
1dc10 2a 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c 20 20  */.  char *p4,  
1dc20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
1dc30 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 69 6e 74  message */.  int
1dc40 20 70 34 74 79 70 65 20 20 20 20 20 20 20 20 2f   p4type        /
1dc50 2a 20 50 34 5f 53 54 41 54 49 43 20 6f 72 20 50  * P4_STATIC or P
1dc60 34 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f 0a 29  4_TRANSIENT */.)
1dc70 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
1dc80 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1dc90 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
1dca0 28 65 72 72 43 6f 64 65 26 30 78 66 66 29 3d 3d  (errCode&0xff)==
1dcb0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
1dcc0 54 20 29 3b 0a 20 20 69 66 28 20 6f 6e 45 72 72  T );.  if( onErr
1dcd0 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  or==OE_Abort ){.
1dce0 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62      sqlite3MayAb
1dcf0 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  ort(pParse);.  }
1dd00 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1dd10 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c  dOp4(v, OP_Halt,
1dd20 20 65 72 72 43 6f 64 65 2c 20 6f 6e 45 72 72 6f   errCode, onErro
1dd30 72 2c 20 30 2c 20 70 34 2c 20 70 34 74 79 70 65  r, 0, p4, p4type
1dd40 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  );.}../*.** Chec
1dd50 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64  k to see if pInd
1dd60 65 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c  ex uses the coll
1dd70 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
1dd80 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  Coll.  Return.**
1dd90 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73   true if it does
1dda0 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74   and false if it
1ddb0 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69   does not..*/.#i
1ddc0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ddd0 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
1dde0 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61   int collationMa
1ddf0 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  tch(const char *
1de00 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49  zColl, Index *pI
1de10 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  ndex){.  int i;.
1de20 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21    assert( zColl!
1de30 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  =0 );.  for(i=0;
1de40 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75   i<pIndex->nColu
1de50 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  mn; i++){.    co
1de60 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49  nst char *z = pI
1de70 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b  ndex->azColl[i];
1de80 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d  .    assert( z!=
1de90 30 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  0 );.    if( 0==
1dea0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
1deb0 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  , zColl) ){.    
1dec0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1ded0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1dee0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1def0 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  * Recompute all 
1df00 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20  indices of pTab 
1df10 74 68 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c  that use the col
1df20 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1df30 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f  pColl..** If pCo
1df40 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d  ll==0 then recom
1df50 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
1df60 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66   of pTab..*/.#if
1df70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1df80 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20  _REINDEX.static 
1df90 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c  void reindexTabl
1dfa0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1dfb0 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68   Table *pTab, ch
1dfc0 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29  ar const *zColl)
1dfd0 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
1dfe0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
1dff0 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f  /* An index asso
1e000 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62  ciated with pTab
1e010 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65   */..  for(pInde
1e020 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
1e030 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70  pIndex; pIndex=p
1e040 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  Index->pNext){. 
1e050 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20     if( zColl==0 
1e060 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63  || collationMatc
1e070 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29  h(zColl, pIndex)
1e080 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44   ){.      int iD
1e090 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
1e0a0 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
1e0b0 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
1e0c0 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ma);.      sqlit
1e0d0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
1e0e0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
1e0f0 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
1e100 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
1e110 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
1e120 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  -1);.    }.  }.}
1e130 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
1e140 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
1e150 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c  ices of all tabl
1e160 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61  es in all databa
1e170 73 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a  ses where the.**
1e180 20 69 6e 64 69 63 65 73 20 75 73 65 20 74 68 65   indices use the
1e190 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1e1a0 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70  nce pColl.  If p
1e1b0 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63  Coll==0 then rec
1e1c0 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e  ompute.** all in
1e1d0 64 69 63 65 73 20 65 76 65 72 79 77 68 65 72 65  dices everywhere
1e1e0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
1e1f0 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
1e200 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69  .static void rei
1e210 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 50 61  ndexDatabases(Pa
1e220 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61  rse *pParse, cha
1e230 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b  r const *zColl){
1e240 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20  .  Db *pDb;     
1e250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e260 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62  * A single datab
1e270 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ase */.  int iDb
1e280 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e290 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
1e2a0 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65  base index numbe
1e2b0 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
1e2c0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1e2d0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
1e2e0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
1e2f0 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20  .  HashElem *k; 
1e300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e310 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
1e320 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62  er tables in pDb
1e330 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1e340 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1e350 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20    /* A table in 
1e360 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
1e370 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1e380 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d  e3BtreeHoldsAllM
1e390 75 74 65 78 65 73 28 64 62 29 20 29 3b 20 20 2f  utexes(db) );  /
1e3a0 2a 20 4e 65 65 64 65 64 20 66 6f 72 20 73 63 68  * Needed for sch
1e3b0 65 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a 20 20  ema access */.  
1e3c0 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64  for(iDb=0, pDb=d
1e3d0 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e  b->aDb; iDb<db->
1e3e0 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b  nDb; iDb++, pDb+
1e3f0 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
1e400 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f  pDb!=0 );.    fo
1e410 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(k=sqliteHashFi
1e420 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  rst(&pDb->pSchem
1e430 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b  a->tblHash);  k;
1e440 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   k=sqliteHashNex
1e450 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61  t(k)){.      pTa
1e460 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69  b = (Table*)sqli
1e470 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20  teHashData(k);. 
1e480 20 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c       reindexTabl
1e490 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
1e4a0 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  zColl);.    }.  
1e4b0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
1e4c0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1e4d0 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58 20  for the REINDEX 
1e4e0 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20  command..**.**  
1e4f0 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 20        REINDEX   
1e500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e510 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a           -- 1.**
1e520 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
1e530 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20   <collation>    
1e540 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a             -- 2.
1e550 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
1e560 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f  X  ?<database>.?
1e570 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20  <tablename>  -- 
1e580 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  3.**        REIN
1e590 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  DEX  ?<database>
1e5a0 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d  .?<indexname>  -
1e5b0 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31  - 4.**.** Form 1
1e5c0 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69   causes all indi
1e5d0 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63  ces in all attac
1e5e0 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f  hed databases to
1e5f0 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20   be rebuilt..** 
1e600 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20  Form 2 rebuilds 
1e610 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61  all indices in a
1e620 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74 68 61  ll databases tha
1e630 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a  t use the named.
1e640 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  ** collating fun
1e650 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20  ction.  Forms 3 
1e660 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74 68  and 4 rebuild th
1e670 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72  e named index or
1e680 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20   all.** indices 
1e690 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1e6a0 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e  the named table.
1e6b0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
1e6c0 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
1e6d0 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e  void sqlite3Rein
1e6e0 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
1e6f0 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  e, Token *pName1
1e700 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29  , Token *pName2)
1e710 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
1e720 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
1e730 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
1e740 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e  uence to be rein
1e750 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a  dexed, or NULL *
1e760 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  /.  char *z;    
1e770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e780 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62  /* Name of a tab
1e790 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20  le or index */. 
1e7a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1e7b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1e7c0 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
1e7d0 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  base */.  Table 
1e7e0 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
1e7f0 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
1e800 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1e810 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
1e820 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
1e830 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
1e840 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
1e850 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  ab */.  int iDb;
1e860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e870 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1e880 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
1e890 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1e8a0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
1e8b0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1e8c0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
1e8d0 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d    Token *pObjNam
1e8e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1e8f0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
1e900 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62  le or index to b
1e910 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a  e reindexed */..
1e920 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61    /* Read the da
1e930 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
1e940 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1e950 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
1e960 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61  r message.  ** a
1e970 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73  nd code in pPars
1e980 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  e and return NUL
1e990 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  L. */.  if( SQLI
1e9a0 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
1e9b0 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
1e9c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
1e9d0 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65    }..  if( pName
1e9e0 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e  1==0 ){.    rein
1e9f0 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61  dexDatabases(pPa
1ea00 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rse, 0);.    ret
1ea10 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  urn;.  }else if(
1ea20 20 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d 30   NEVER(pName2==0
1ea30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d  ) || pName2->z==
1ea40 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
1ea50 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72 74  Coll;.    assert
1ea60 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20  ( pName1->z );. 
1ea70 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     zColl = sqlit
1ea80 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1ea90 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d  pParse->db, pNam
1eaa0 65 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43  e1);.    if( !zC
1eab0 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  oll ) return;.  
1eac0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
1ead0 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
1eae0 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c   ENC(db), zColl,
1eaf0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f   0);.    if( pCo
1eb00 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 69 6e  ll ){.      rein
1eb10 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61  dexDatabases(pPa
1eb20 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  rse, zColl);.   
1eb30 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1eb40 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  (db, zColl);.   
1eb50 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
1eb60 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1eb70 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  ee(db, zColl);. 
1eb80 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
1eb90 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
1eba0 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
1ebb0 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29  ame2, &pObjName)
1ebc0 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20  ;.  if( iDb<0 ) 
1ebd0 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71  return;.  z = sq
1ebe0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1ebf0 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29  en(db, pObjName)
1ec00 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
1ec10 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64  eturn;.  zDb = d
1ec20 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
1ec30 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  e;.  pTab = sqli
1ec40 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
1ec50 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20   z, zDb);.  if( 
1ec60 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e  pTab ){.    rein
1ec70 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c  dexTable(pParse,
1ec80 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73   pTab, 0);.    s
1ec90 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1eca0 20 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   z);.    return;
1ecb0 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20  .  }.  pIndex = 
1ecc0 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
1ecd0 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20  (db, z, zDb);.  
1ece0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1ecf0 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  , z);.  if( pInd
1ed00 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ex ){.    sqlite
1ed10 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
1ed20 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
1ed30 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
1ed40 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
1ed50 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29  rse, pIndex, -1)
1ed60 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1ed70 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  }.  sqlite3Error
1ed80 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61  Msg(pParse, "una
1ed90 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20  ble to identify 
1eda0 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65  the object to be
1edb0 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a   reindexed");.}.
1edc0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
1edd0 74 75 72 6e 20 61 20 64 79 6e 61 6d 69 63 6c 79  turn a dynamicly
1ede0 20 61 6c 6c 6f 63 61 74 65 64 20 4b 65 79 49 6e   allocated KeyIn
1edf0 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
1ee00 74 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a  t can be used.**
1ee10 20 77 69 74 68 20 4f 50 5f 4f 70 65 6e 52 65 61   with OP_OpenRea
1ee20 64 20 6f 72 20 4f 50 5f 4f 70 65 6e 57 72 69 74  d or OP_OpenWrit
1ee30 65 20 74 6f 20 61 63 63 65 73 73 20 64 61 74 61  e to access data
1ee40 62 61 73 65 20 69 6e 64 65 78 20 70 49 64 78 2e  base index pIdx.
1ee50 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
1ee60 73 66 75 6c 2c 20 61 20 70 6f 69 6e 74 65 72 20  sful, a pointer 
1ee70 74 6f 20 74 68 65 20 6e 65 77 20 73 74 72 75 63  to the new struc
1ee80 74 75 72 65 20 69 73 20 72 65 74 75 72 6e 65 64  ture is returned
1ee90 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a  . In this case.*
1eea0 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  * the caller is 
1eeb0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
1eec0 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 44  calling sqlite3D
1eed0 62 46 72 65 65 28 64 62 2c 20 29 20 6f 6e 20 74  bFree(db, ) on t
1eee0 68 65 20 72 65 74 75 72 6e 65 64 20 0a 2a 2a 20  he returned .** 
1eef0 70 6f 69 6e 74 65 72 2e 20 49 66 20 61 6e 20 65  pointer. If an e
1ef00 72 72 6f 72 20 6f 63 63 75 72 73 20 28 6f 75 74  rror occurs (out
1ef10 20 6f 66 20 6d 65 6d 6f 72 79 20 6f 72 20 6d 69   of memory or mi
1ef20 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20  ssing collation 
1ef30 0a 2a 2a 20 73 65 71 75 65 6e 63 65 29 2c 20 4e  .** sequence), N
1ef40 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
1ef50 61 6e 64 20 74 68 65 20 73 74 61 74 65 20 6f 66  and the state of
1ef60 20 70 50 61 72 73 65 20 75 70 64 61 74 65 64 20   pParse updated 
1ef70 74 6f 20 72 65 66 6c 65 63 74 0a 2a 2a 20 74 68  to reflect.** th
1ef80 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 4b 65 79 49  e error..*/.KeyI
1ef90 6e 66 6f 20 2a 73 71 6c 69 74 65 33 49 6e 64 65  nfo *sqlite3Inde
1efa0 78 4b 65 79 69 6e 66 6f 28 50 61 72 73 65 20 2a  xKeyinfo(Parse *
1efb0 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
1efc0 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Idx){.  int i;. 
1efd0 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78   int nCol = pIdx
1efe0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 4b 65 79  ->nColumn;.  Key
1eff0 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 0a 20 20 70  Info *pKey;..  p
1f000 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  Key = sqlite3Key
1f010 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65  InfoAlloc(pParse
1f020 2d 3e 64 62 2c 20 6e 43 6f 6c 29 3b 0a 20 20 69  ->db, nCol);.  i
1f030 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 66  f( pKey ){.    f
1f040 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
1f050 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  i++){.      char
1f060 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e   *zColl = pIdx->
1f070 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  azColl[i];.     
1f080 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 20 29   assert( zColl )
1f090 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43  ;.      pKey->aC
1f0a0 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  oll[i] = sqlite3
1f0b0 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
1f0c0 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  arse, zColl);.  
1f0d0 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f      pKey->aSortO
1f0e0 72 64 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e  rder[i] = pIdx->
1f0f0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20  aSortOrder[i];. 
1f100 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1f110 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
1f120 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1f130 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4b  e(pParse->db, pK
1f140 65 79 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20  ey);.    pKey = 
1f150 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1f160 70 4b 65 79 3b 0a 7d 0a                          pKey;.}.