/ Hex Artifact Content
Login

Artifact 28c15c43eefc0066ff64040526ff649c32fe5523:


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 52  .#endif../*.** R
0d90: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
0da0: 65 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20  e given yDbMask 
0db0: 6f 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20  object is empty 
0dc0: 2d 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73  - if it contains
0dd0: 20 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20   no.** 1 bits.  
0de0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0df0: 75 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61  used by the DbMa
0e00: 73 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20  skAllZero() and 
0e10: 44 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a  DbMaskNotZero().
0e20: 2a 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53  ** macros when S
0e30: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
0e40: 45 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ED is greater th
0e50: 61 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51  an 30..*/.#if SQ
0e60: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0e70: 44 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33  D>30.int sqlite3
0e80: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44  DbMaskAllZero(yD
0e90: 62 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20  bMask m){.  int 
0ea0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
0eb0: 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b  sizeof(yDbMask);
0ec0: 20 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29   i++) if( m[i] )
0ed0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
0ee0: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
0ef0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
0f00: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
0f10: 74 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c  ter a single SQL
0f20: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62   statement has b
0f30: 65 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e  een.** parsed an
0f40: 64 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d  d a VDBE program
0f50: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74   to execute that
0f60: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62   statement has b
0f70: 65 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e  een.** prepared.
0f80: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70    This routine p
0f90: 75 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e  uts the finishin
0fa0: 67 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65  g touches on the
0fb0: 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d  .** VDBE program
0fc0: 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20   and resets the 
0fd0: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
0fe0: 20 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a   for the next.**
0ff0: 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   parse..**.** No
1000: 74 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72  te that if an er
1010: 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74  ror occurred, it
1020: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
1030: 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44  se that.** no VD
1040: 42 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65  BE code was gene
1050: 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rated..*/.void s
1060: 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69  qlite3FinishCodi
1070: 6e 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ng(Parse *pParse
1080: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1090: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
10a0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
10b0: 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a  pToplevel==0 );.
10c0: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
10d0: 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  b;.  if( pParse-
10e0: 3e 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e  >nested ) return
10f0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
1100: 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
1110: 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
1120: 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d  if( pParse->rc==
1130: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72  SQLITE_OK ) pPar
1140: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
1150: 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72  ERROR;.    retur
1160: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67  n;.  }..  /* Beg
1170: 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67  in by generating
1180: 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f   some terminatio
1190: 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e  n code at the en
11a0: 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64  d of the.  ** vd
11b0: 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a  be program.  */.
11c0: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
11d0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
11e0: 61 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d  assert( !pParse-
11f0: 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20  >isMultiWrite . 
1200: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
1210: 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f  VdbeAssertMayAbo
1220: 72 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61  rt(v, pParse->ma
1230: 79 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20  yAbort));.  if( 
1240: 76 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  v ){.    while( 
1250: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
1260: 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 76 2c 20  ePriorOpcode(v, 
1270: 4f 50 5f 43 6c 6f 73 65 29 20 29 7b 7d 0a 20 20  OP_Close) ){}.  
1280: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1290: 4f 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b  Op0(v, OP_Halt);
12a0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  ..#if SQLITE_USE
12b0: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
12c0: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
12d0: 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3e 30 20 26 26  >nTableLock>0 &&
12e0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
12f0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1300: 65 33 55 73 65 72 41 75 74 68 49 6e 69 74 28 64  e3UserAuthInit(d
1310: 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  b);.      if( db
1320: 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c  ->auth.authLevel
1330: 3c 55 41 55 54 48 5f 55 73 65 72 20 29 7b 0a 20  <UAUTH_User ){. 
1340: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72         pParse->r
1350: 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48 5f  c = SQLITE_AUTH_
1360: 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 73 71  USER;.        sq
1370: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1380: 61 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20  arse, "user not 
1390: 61 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b  authenticated");
13a0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
13b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
13c0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68  endif..    /* Th
13d0: 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b 20 63 6f  e cookie mask co
13e0: 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69 74 20 66  ntains one bit f
13f0: 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65  or each database
1400: 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20 20 20 20   file open..    
1410: 2a 2a 20 28 42 69 74 20 30 20 69 73 20 66 6f 72  ** (Bit 0 is for
1420: 20 6d 61 69 6e 2c 20 62 69 74 20 31 20 69 73 20   main, bit 1 is 
1430: 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64 20 73 6f  for temp, and so
1440: 20 66 6f 72 74 68 2e 29 20 20 42 69 74 73 20 61   forth.)  Bits a
1450: 72 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 66 6f  re.    ** set fo
1460: 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  r each database 
1470: 74 68 61 74 20 69 73 20 75 73 65 64 2e 20 20 47  that is used.  G
1480: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1490: 73 74 61 72 74 20 61 0a 20 20 20 20 2a 2a 20 74  start a.    ** t
14a0: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 65 61  ransaction on ea
14b0: 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65  ch used database
14c0: 20 61 6e 64 20 74 6f 20 76 65 72 69 66 79 20 74   and to verify t
14d0: 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
14e0: 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61 63 68 20  .    ** on each 
14f0: 75 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20  used database.. 
1500: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62     */.    if( db
1510: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
1520: 30 20 0a 20 20 20 20 20 26 26 20 28 44 62 4d 61  0 .     && (DbMa
1530: 73 6b 4e 6f 6e 5a 65 72 6f 28 70 50 61 72 73 65  skNonZero(pParse
1540: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 20 7c 7c  ->cookieMask) ||
1550: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1560: 78 70 72 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  xpr).    ){.    
1570: 20 20 69 6e 74 20 69 44 62 2c 20 69 3b 0a 20 20    int iDb, i;.  
1580: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
1590: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
15a0: 30 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  0)->opcode==OP_I
15b0: 6e 69 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  nit );.      sql
15c0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
15d0: 28 76 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f  (v, 0);.      fo
15e0: 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64 62 2d  r(iDb=0; iDb<db-
15f0: 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20 20  >nDb; iDb++){.  
1600: 20 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b        if( DbMask
1610: 54 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f  Test(pParse->coo
1620: 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30  kieMask, iDb)==0
1630: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1640: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1650: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
1660: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1670: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
1680: 76 2c 0a 20 20 20 20 20 20 20 20 20 20 4f 50 5f  v,.          OP_
1690: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20  Transaction,    
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  /* Opcode */.   
16c0: 20 20 20 20 20 20 20 69 44 62 2c 20 20 20 20 20         iDb,     
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20            /* P1 
16f0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 44 62 4d  */.          DbM
1700: 61 73 6b 54 65 73 74 28 70 50 61 72 73 65 2d 3e  askTest(pParse->
1710: 77 72 69 74 65 4d 61 73 6b 2c 69 44 62 29 2c 20  writeMask,iDb), 
1720: 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 20 20 20  /* P2 */.       
1730: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69     pParse->cooki
1740: 65 56 61 6c 75 65 5b 69 44 62 5d 2c 20 20 20 20  eValue[iDb],    
1750: 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20        /* P3 */. 
1760: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62           db->aDb
1770: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69  [iDb].pSchema->i
1780: 47 65 6e 65 72 61 74 69 6f 6e 20 20 2f 2a 20 50  Generation  /* P
1790: 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 3b 0a  4 */.        );.
17a0: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
17b0: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 20 73  init.busy==0 ) s
17c0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
17d0: 50 35 28 76 2c 20 31 29 3b 0a 20 20 20 20 20 20  P5(v, 1);.      
17e0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
17f0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1800: 4c 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  LE.      for(i=0
1810: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61  ; i<pParse->nVta
1820: 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  bLock; i++){.   
1830: 20 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20       char *vtab 
1840: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
1850: 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
1860: 50 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63  Parse->apVtabLoc
1870: 6b 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73  k[i]);.        s
1880: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1890: 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30  (v, OP_VBegin, 0
18a0: 2c 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34  , 0, 0, vtab, P4
18b0: 5f 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a  _VTAB);.      }.
18c0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
18d0: 74 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e  tabLock = 0;.#en
18e0: 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  dif..      /* On
18f0: 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69  ce all the cooki
1900: 65 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72  es have been ver
1910: 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61  ified and transa
1920: 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a  ctions opened, .
1930: 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20        ** obtain 
1940: 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62  the required tab
1950: 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69  le-locks. This i
1960: 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
1970: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73   the .      ** s
1980: 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74  hared-cache feat
1990: 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  ure is enabled..
19a0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
19b0: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50  odeTableLocks(pP
19c0: 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  arse);..      /*
19d0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20   Initialize any 
19e0: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61  AUTOINCREMENT da
19f0: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65  ta structures re
1a00: 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  quired..      */
1a10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75  .      sqlite3Au
1a20: 74 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e  toincrementBegin
1a30: 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20  (pParse);..     
1a40: 20 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e   /* Code constan
1a50: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  t expressions th
1a60: 61 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65  at where factore
1a70: 64 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c  d out of inner l
1a80: 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66  oops */.      if
1a90: 28 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74  ( pParse->pConst
1aa0: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
1ab0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20  ExprList *pEL = 
1ac0: 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
1ad0: 70 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  pr;.        pPar
1ae0: 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
1af0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  r = 0;.        f
1b00: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e  or(i=0; i<pEL->n
1b10: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1b20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b30: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
1b40: 4c 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70  L->a[i].pExpr, p
1b50: 45 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73  EL->a[i].u.iCons
1b60: 74 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20  tExprReg);.     
1b70: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
1b80: 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20      /* Finally, 
1b90: 6a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65  jump back to the
1ba0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
1bb0: 65 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64  e executable cod
1bc0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  e. */.      sqli
1bd0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1be0: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 31 29 3b   OP_Goto, 0, 1);
1bf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
1c00: 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20 70  * Get the VDBE p
1c10: 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72  rogram ready for
1c20: 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a   execution.  */.
1c30: 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72 73    if( v && pPars
1c40: 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21 64  e->nErr==0 && !d
1c50: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1c60: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1c70: 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
1c80: 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 44 69 73  el==0 );  /* Dis
1c90: 61 62 6c 65 73 20 61 6e 64 20 72 65 2d 65 6e 61  ables and re-ena
1ca0: 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f 0a 20 20  bles match */.  
1cb0: 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75 6d 20 6f    /* A minimum o
1cc0: 66 20 6f 6e 65 20 63 75 72 73 6f 72 20 69 73 20  f one cursor is 
1cd0: 72 65 71 75 69 72 65 64 20 69 66 20 61 75 74 6f  required if auto
1ce0: 69 6e 63 72 65 6d 65 6e 74 20 69 73 20 75 73 65  increment is use
1cf0: 64 0a 20 20 20 20 2a 20 20 53 65 65 20 74 69 63  d.    *  See tic
1d00: 6b 65 74 20 5b 61 36 39 36 33 37 39 63 31 66 30  ket [a696379c1f0
1d10: 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20 69 66 28  8866] */.    if(
1d20: 20 70 50 61 72 73 65 2d 3e 70 41 69 6e 63 21 3d   pParse->pAinc!=
1d30: 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 61  0 && pParse->nTa
1d40: 62 3d 3d 30 20 29 20 70 50 61 72 73 65 2d 3e 6e  b==0 ) pParse->n
1d50: 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c  Tab = 1;.    sql
1d60: 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64  ite3VdbeMakeRead
1d70: 79 28 76 2c 20 70 50 61 72 73 65 29 3b 0a 20 20  y(v, pParse);.  
1d80: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
1d90: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
1da0: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
1db0: 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Set = 0;.  }else
1dc0: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  {.    pParse->rc
1dd0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1de0: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
1df0: 54 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Tab = 0;.  pPars
1e00: 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70  e->nMem = 0;.  p
1e10: 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b  Parse->nSet = 0;
1e20: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20  .  pParse->nVar 
1e30: 3d 20 30 3b 0a 20 20 44 62 4d 61 73 6b 5a 65 72  = 0;.  DbMaskZer
1e40: 6f 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  o(pParse->cookie
1e50: 4d 61 73 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Mask);.}../*.** 
1e60: 52 75 6e 20 74 68 65 20 70 61 72 73 65 72 20 61  Run the parser a
1e70: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  nd code generato
1e80: 72 20 72 65 63 75 72 73 69 76 65 6c 79 20 69 6e  r recursively in
1e90: 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61   order to genera
1ea0: 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74  te.** code for t
1eb0: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
1ec0: 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20   given onto the 
1ed0: 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72 73  end of the pPars
1ee0: 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72  e context.** cur
1ef0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
1f00: 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e  struction.  When
1f10: 20 74 68 65 20 70 61 72 73 65 72 20 69 73 20 72   the parser is r
1f20: 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a  un recursively.*
1f30: 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68 65 20  * this way, the 
1f40: 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73  final OP_Halt is
1f50: 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61 6e   not appended an
1f60: 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c 69  d other initiali
1f70: 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69  zation.** and fi
1f80: 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73  nalization steps
1f90: 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65 63   are omitted bec
1fa0: 61 75 73 65 20 74 68 6f 73 65 20 61 72 65 20 68  ause those are h
1fb0: 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a  andling by the.*
1fc0: 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72 73  * outermost pars
1fd0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76  er..**.** Not ev
1fe0: 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73 74  erything is nest
1ff0: 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63 69  able.  This faci
2000: 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e 65 64  lity is designed
2010: 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e   to permit.** IN
2020: 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e  SERT, UPDATE, an
2030: 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69  d DELETE operati
2040: 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c 49  ons against SQLI
2050: 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65 0a  TE_MASTER.  Use.
2060: 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20 64  ** care if you d
2070: 65 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f 20  ecide to try to 
2080: 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  use this routine
2090: 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20   for some other 
20a0: 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69  purposes..*/.voi
20b0: 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50  d sqlite3NestedP
20c0: 61 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  arse(Parse *pPar
20d0: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
20e0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
20f0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63   va_list ap;.  c
2100: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61  har *zSql;.  cha
2110: 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
2120: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
2130: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 20 64 65  pParse->db;.# de
2140: 66 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28 73  fine SAVE_SZ  (s
2150: 69 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20 6f  izeof(Parse) - o
2160: 66 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e 56  ffsetof(Parse,nV
2170: 61 72 29 29 0a 20 20 63 68 61 72 20 73 61 76 65  ar)).  char save
2180: 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20  Buf[SAVE_SZ];.. 
2190: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
21a0: 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  r ) return;.  as
21b0: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65  sert( pParse->ne
21c0: 73 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e  sted<10 );  /* N
21d0: 65 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e  esting should on
21e0: 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64  ly be of limited
21f0: 20 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73   depth */.  va_s
2200: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
2210: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
2220: 74 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20  te3VMPrintf(db, 
2230: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
2240: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66  va_end(ap);.  if
2250: 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
2260: 20 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20   return;   /* A 
2270: 6d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  malloc must have
2280: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20   failed */.  }. 
2290: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b   pParse->nested+
22a0: 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65  +;.  memcpy(save
22b0: 42 75 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56  Buf, &pParse->nV
22c0: 61 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20  ar, SAVE_SZ);.  
22d0: 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d 3e  memset(&pParse->
22e0: 6e 56 61 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a  nVar, 0, SAVE_SZ
22f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 75 6e 50  );.  sqlite3RunP
2300: 61 72 73 65 72 28 70 50 61 72 73 65 2c 20 7a 53  arser(pParse, zS
2310: 71 6c 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  ql, &zErrMsg);. 
2320: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2330: 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73  b, zErrMsg);.  s
2340: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2350: 20 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79   zSql);.  memcpy
2360: 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20  (&pParse->nVar, 
2370: 73 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53 5a  saveBuf, SAVE_SZ
2380: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73  );.  pParse->nes
2390: 74 65 64 2d 2d 3b 0a 7d 0a 0a 23 69 66 20 53 51  ted--;.}..#if SQ
23a0: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
23b0: 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 52  TICATION./*.** R
23c0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 7a 54  eturn TRUE if zT
23d0: 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65  able is the name
23e0: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 74   of the system t
23f0: 61 62 6c 65 20 74 68 61 74 20 73 74 6f 72 65 73  able that stores
2400: 20 74 68 65 0a 2a 2a 20 6c 69 73 74 20 6f 66 20   the.** list of 
2410: 75 73 65 72 73 20 61 6e 64 20 74 68 65 69 72 20  users and their 
2420: 61 63 63 65 73 73 20 63 72 65 64 65 6e 74 69 61  access credentia
2430: 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ls..*/.int sqlit
2440: 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28  e3UserAuthTable(
2450: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
2460: 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  le){.  return sq
2470: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54  lite3_stricmp(zT
2480: 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 75 73  able, "sqlite_us
2490: 65 72 22 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69  er")==0;.}.#endi
24a0: 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  f../*.** Locate 
24b0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
24c0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
24d0: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
24e0: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
24f0: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
2500: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
2510: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
2520: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
2530: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
2540: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
2550: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
2560: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
2570: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
2580: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
2590: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
25a0: 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62  ched for the tab
25b0: 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69  le and the.** fi
25c0: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62  rst matching tab
25d0: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  le is returned. 
25e0: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f   (No checking fo
25f0: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
2600: 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f  e.** names is do
2610: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
2620: 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66   order is TEMP f
2630: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2640: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78   then any.** aux
2650: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
2660: 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65   added using the
2670: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
2680: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
2690: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
26a0: 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  le()..*/.Table *
26b0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
26c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
26d0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
26e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
26f0: 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  tabase){.  Table
2700: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
2710: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65  ;..  /* All mute
2720: 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  xes are required
2730: 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
2740: 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77  ss.  Make sure w
2750: 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a  e hold them. */.
2760: 20 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62    assert( zDatab
2770: 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase!=0 || sqlite
2780: 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
2790: 74 65 78 65 73 28 64 62 29 20 29 3b 0a 23 69 66  texes(db) );.#if
27a0: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
27b0: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 2f 2a  HENTICATION.  /*
27c0: 20 4f 6e 6c 79 20 74 68 65 20 61 64 6d 69 6e 20   Only the admin 
27d0: 75 73 65 72 20 69 73 20 61 6c 6c 6f 77 65 64 20  user is allowed 
27e0: 74 6f 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  to know that the
27f0: 20 73 71 6c 69 74 65 5f 75 73 65 72 20 74 61 62   sqlite_user tab
2800: 6c 65 0a 20 20 2a 2a 20 65 78 69 73 74 73 20 2a  le.  ** exists *
2810: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68  /.  if( db->auth
2820: 2e 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48  .authLevel<UAUTH
2830: 5f 41 64 6d 69 6e 20 26 26 20 73 71 6c 69 74 65  _Admin && sqlite
2840: 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 7a  3UserAuthTable(z
2850: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
2860: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
2870: 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 4f 4d 49  ndif.  for(i=OMI
2880: 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e  T_TEMPDB; i<db->
2890: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
28a0: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
28b0: 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61  ^1 : i;   /* Sea
28c0: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
28d0: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20  MAIN */.    if( 
28e0: 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26 26 20  zDatabase!=0 && 
28f0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
2900: 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44  Database, db->aD
2910: 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f  b[j].zName) ) co
2920: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
2930: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
2940: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a  aMutexHeld(db, j
2950: 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 20 3d 20  , 0) );.    p = 
2960: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
2970: 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68  &db->aDb[j].pSch
2980: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e  ema->tblHash, zN
2990: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20  ame);.    if( p 
29a0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
29b0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
29c0: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
29d0: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
29e0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
29f0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
2a00: 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67  abase.** table g
2a10: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
2a20: 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20   that table and 
2a30: 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65  (optionally) the
2a40: 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20   name of the.** 
2a50: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
2a60: 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20  ing the table.  
2a70: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
2a80: 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20  ot found.  Also 
2a90: 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f  leave an.** erro
2aa0: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
2ab0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
2ac0: 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
2ad0: 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
2ae0: 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69  routine and sqli
2af0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69  te3FindTable() i
2b00: 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72  s that this.** r
2b10: 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e  outine leaves an
2b20: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
2b30: 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
2b40: 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74  g where.** sqlit
2b50: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f  e3FindTable() do
2b60: 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65  es not..*/.Table
2b70: 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54   *sqlite3LocateT
2b80: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
2b90: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
2ba0: 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69  * context in whi
2bb0: 63 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72  ch to report err
2bc0: 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  ors */.  int isV
2bd0: 69 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20  iew,            
2be0: 2f 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69  /* True if looki
2bf0: 6e 67 20 66 6f 72 20 61 20 56 49 45 57 20 72 61  ng for a VIEW ra
2c00: 74 68 65 72 20 74 68 61 6e 20 61 20 54 41 42 4c  ther than a TABL
2c10: 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  E */.  const cha
2c20: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  r *zName,     /*
2c30: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
2c40: 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  le we are lookin
2c50: 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  g for */.  const
2c60: 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20   char *zDbase   
2c70: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2c80: 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68   database.  Migh
2c90: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
2ca0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f    Table *p;..  /
2cb0: 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
2cc0: 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
2cd0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2ce0: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
2cf0: 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
2d00: 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
2d10: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
2d20: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
2d30: 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
2d40: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
2d50: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2d60: 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   }..  p = sqlite
2d70: 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
2d80: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44  e->db, zName, zD
2d90: 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  base);.  if( p==
2da0: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
2db0: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69  har *zMsg = isVi
2dc0: 65 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69  ew ? "no such vi
2dd0: 65 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74  ew" : "no such t
2de0: 61 62 6c 65 22 3b 0a 20 20 20 20 69 66 28 20 7a  able";.    if( z
2df0: 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73  Dbase ){.      s
2e00: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2e10: 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25  Parse, "%s: %s.%
2e20: 73 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65  s", zMsg, zDbase
2e30: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  , zName);.    }e
2e40: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2e50: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2e60: 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73  e, "%s: %s", zMs
2e70: 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  g, zName);.    }
2e80: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65  .    pParse->che
2e90: 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
2ea0: 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  }.#if SQLITE_USE
2eb0: 52 5f 41 55 54 48 45 4e 49 43 41 54 49 4f 4e 0a  R_AUTHENICATION.
2ec0: 20 20 65 6c 73 65 20 69 66 28 20 70 50 61 72 73    else if( pPars
2ed0: 65 2d 3e 64 62 2d 3e 61 75 74 68 2e 61 75 74 68  e->db->auth.auth
2ee0: 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65 72  Level<UAUTH_User
2ef0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
2f00: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2f10: 22 75 73 65 72 20 6e 6f 74 20 61 75 74 68 65 6e  "user not authen
2f20: 74 69 63 61 74 65 64 22 29 3b 0a 20 20 20 20 70  ticated");.    p
2f30: 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
2f40: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
2f50: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
2f60: 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65   table identifie
2f70: 64 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54  d by *p..**.** T
2f80: 68 69 73 20 69 73 20 61 20 77 72 61 70 70 65 72  his is a wrapper
2f90: 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 4c   around sqlite3L
2fa0: 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 20 54 68  ocateTable(). Th
2fb0: 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
2fc0: 77 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 4c  ween.** sqlite3L
2fd0: 6f 63 61 74 65 54 61 62 6c 65 28 29 20 61 6e 64  ocateTable() and
2fe0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2ff0: 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63  s that this func
3000: 74 69 6f 6e 20 72 65 73 74 72 69 63 74 73 0a 2a  tion restricts.*
3010: 2a 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20  * the search to 
3020: 73 63 68 65 6d 61 20 28 70 2d 3e 70 53 63 68 65  schema (p->pSche
3030: 6d 61 29 20 69 66 20 69 74 20 69 73 20 6e 6f 74  ma) if it is not
3040: 20 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68 65 6d   NULL. p->pSchem
3050: 61 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f 6e 2d  a may be.** non-
3060: 4e 55 4c 4c 20 69 66 20 69 74 20 69 73 20 70 61  NULL if it is pa
3070: 72 74 20 6f 66 20 61 20 76 69 65 77 20 6f 72 20  rt of a view or 
3080: 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20  trigger program 
3090: 64 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65 65 0a  definition. See.
30a0: 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63  ** sqlite3FixSrc
30b0: 4c 69 73 74 28 29 20 66 6f 72 20 64 65 74 61 69  List() for detai
30c0: 6c 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  ls..*/.Table *sq
30d0: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
30e0: 49 74 65 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Item(.  Parse *p
30f0: 50 61 72 73 65 2c 20 0a 20 20 69 6e 74 20 69 73  Parse, .  int is
3100: 56 69 65 77 2c 20 0a 20 20 73 74 72 75 63 74 20  View, .  struct 
3110: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 0a  SrcList_item *p.
3120: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
3130: 2a 7a 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20  *zDb;.  assert( 
3140: 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20 7c 7c  p->pSchema==0 ||
3150: 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30   p->zDatabase==0
3160: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 63   );.  if( p->pSc
3170: 68 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e 74 20  hema ){.    int 
3180: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
3190: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
31a0: 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d  e->db, p->pSchem
31b0: 61 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 70 50  a);.    zDb = pP
31c0: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
31d0: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73  b].zName;.  }els
31e0: 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20 70 2d 3e  e{.    zDb = p->
31f0: 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a 20  zDatabase;.  }. 
3200: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4c   return sqlite3L
3210: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
3220: 65 2c 20 69 73 56 69 65 77 2c 20 70 2d 3e 7a 4e  e, isView, p->zN
3230: 61 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a 2f 2a  ame, zDb);.}../*
3240: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
3250: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
3260: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
3270: 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c  s .** a particul
3280: 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74  ar index given t
3290: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
32a0: 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65  index.** and the
32b0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
32c0: 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61  abase that conta
32d0: 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ins the index..*
32e0: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
32f0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
3300: 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69  * If zDatabase i
3310: 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73  s 0, all databas
3320: 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20  es are searched 
3330: 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  for the.** table
3340: 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d   and the first m
3350: 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73  atching index is
3360: 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20   returned.  (No 
3370: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20  checking.** for 
3380: 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20  duplicate index 
3390: 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20  names is done.) 
33a0: 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65   The search orde
33b0: 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72  r is.** TEMP fir
33c0: 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74  st, then MAIN, t
33d0: 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72  hen any auxiliar
33e0: 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65  y databases adde
33f0: 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41  d.** using the A
3400: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TTACH command..*
3410: 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33  /.Index *sqlite3
3420: 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65  FindIndex(sqlite
3430: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
3440: 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20  r *zName, const 
3450: 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e  char *zDb){.  In
3460: 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e  dex *p = 0;.  in
3470: 74 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75  t i;.  /* All mu
3480: 74 65 78 65 73 20 61 72 65 20 72 65 71 75 69 72  texes are requir
3490: 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63  ed for schema ac
34a0: 63 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65  cess.  Make sure
34b0: 20 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a   we hold them. *
34c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 44 62 21  /.  assert( zDb!
34d0: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72  =0 || sqlite3Btr
34e0: 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65  eeHoldsAllMutexe
34f0: 73 28 64 62 29 20 29 3b 0a 20 20 66 6f 72 28 69  s(db) );.  for(i
3500: 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c  =OMIT_TEMPDB; i<
3510: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
3520: 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29     int j = (i<2)
3530: 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20   ? i^1 : i;  /* 
3540: 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f  Search TEMP befo
3550: 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53  re MAIN */.    S
3560: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
3570: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68   db->aDb[j].pSch
3580: 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ema;.    assert(
3590: 20 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20   pSchema );.    
35a0: 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74  if( zDb && sqlit
35b0: 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64  e3StrICmp(zDb, d
35c0: 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29  b->aDb[j].zName)
35d0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
35e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
35f0: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
3600: 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20  db, j, 0) );.   
3610: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
3620: 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69  Find(&pSchema->i
3630: 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a  dxHash, zName);.
3640: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
3650: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
3660: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c  p;.}../*.** Recl
3670: 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75  aim the memory u
3680: 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a  sed by an index.
3690: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
36a0: 72 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  reeIndex(sqlite3
36b0: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b   *db, Index *p){
36c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
36d0: 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73  OMIT_ANALYZE.  s
36e0: 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65  qlite3DeleteInde
36f0: 78 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b  xSamples(db, p);
3700: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
3710: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
3720: 70 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  p->pPartIdxWhere
3730: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
3740: 65 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66  ee(db, p->zColAf
3750: 66 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 73 52  f);.  if( p->isR
3760: 65 73 69 7a 65 64 20 29 20 73 71 6c 69 74 65 33  esized ) sqlite3
3770: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a  DbFree(db, p->az
3780: 43 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20 53 51  Coll);.#ifdef SQ
3790: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
37a0: 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73 71 6c  3_OR_STAT4.  sql
37b0: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69 52  ite3_free(p->aiR
37c0: 6f 77 45 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20  owEst);.#endif. 
37d0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
37e0: 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
37f0: 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63 61  For the index ca
3800: 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68  lled zIdxName wh
3810: 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20  ich is found in 
3820: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 44 62  the database iDb
3830: 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74  ,.** unlike that
3840: 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20   index from its 
3850: 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76  Table then remov
3860: 65 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d  e the index from
3870: 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61  .** the index ha
3880: 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65  sh table and fre
3890: 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72  e all memory str
38a0: 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74  uctures associat
38b0: 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69  ed.** with the i
38c0: 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ndex..*/.void sq
38d0: 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65  lite3UnlinkAndDe
38e0: 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65  leteIndex(sqlite
38f0: 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20  3 *db, int iDb, 
3900: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78  const char *zIdx
3910: 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a  Name){.  Index *
3920: 70 49 6e 64 65 78 3b 0a 20 20 48 61 73 68 20 2a  pIndex;.  Hash *
3930: 70 48 61 73 68 3b 0a 0a 20 20 61 73 73 65 72 74  pHash;..  assert
3940: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
3950: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
3960: 2c 20 30 29 20 29 3b 0a 20 20 70 48 61 73 68 20  , 0) );.  pHash 
3970: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  = &db->aDb[iDb].
3980: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
3990: 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  ;.  pIndex = sql
39a0: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70  ite3HashInsert(p
39b0: 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20  Hash, zIdxName, 
39c0: 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  0);.  if( ALWAYS
39d0: 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20  (pIndex) ){.    
39e0: 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  if( pIndex->pTab
39f0: 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64  le->pIndex==pInd
3a00: 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64  ex ){.      pInd
3a10: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
3a20: 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  ex = pIndex->pNe
3a30: 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
3a40: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20       Index *p;. 
3a50: 20 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69 63       /* Justific
3a60: 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28  ation of ALWAYS(
3a70: 29 3b 20 20 54 68 65 20 69 6e 64 65 78 20 6d 75  );  The index mu
3a80: 73 74 20 62 65 20 6f 6e 20 74 68 65 20 6c 69 73  st be on the lis
3a90: 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e  t of.      ** in
3aa0: 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  dices. */.      
3ab0: 70 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  p = pIndex->pTab
3ac0: 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  le->pIndex;.    
3ad0: 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
3ae0: 70 29 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d  p) && p->pNext!=
3af0: 70 49 6e 64 65 78 20 29 7b 20 70 20 3d 20 70 2d  pIndex ){ p = p-
3b00: 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20 20  >pNext; }.      
3b10: 69 66 28 20 41 4c 57 41 59 53 28 70 20 26 26 20  if( ALWAYS(p && 
3b20: 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78  p->pNext==pIndex
3b30: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ) ){.        p->
3b40: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
3b50: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
3b60: 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64     }.    freeInd
3b70: 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
3b80: 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20    }.  db->flags 
3b90: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
3ba0: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
3bb0: 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20 74  * Look through t
3bc0: 68 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e 20  he list of open 
3bd0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 69  database files i
3be0: 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64 20  n db->aDb[] and 
3bf0: 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20 62  if.** any have b
3c00: 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d 6f  een closed, remo
3c10: 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65  ve them from the
3c20: 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63 61   list.  Realloca
3c30: 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61 44  te the.** db->aD
3c40: 62 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74 6f  b[] structure to
3c50: 20 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65 2c   a smaller size,
3c60: 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a   if possible..**
3c70: 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68 65  .** Entry 0 (the
3c80: 20 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73 65   "main" database
3c90: 29 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28 74  ) and entry 1 (t
3ca0: 68 65 20 22 74 65 6d 70 22 20 64 61 74 61 62 61  he "temp" databa
3cb0: 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65 72  se).** are never
3cc0: 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20   candidates for 
3cd0: 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64 2e  being collapsed.
3ce0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3cf0: 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65  CollapseDatabase
3d00: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64  Array(sqlite3 *d
3d10: 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  b){.  int i, j;.
3d20: 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64    for(i=j=2; i<d
3d30: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
3d40: 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62    struct Db *pDb
3d50: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
3d60: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
3d70: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
3d80: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3d90: 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db->zName);.    
3da0: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30    pDb->zName = 0
3db0: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
3dc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3dd0: 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  j<i ){.      db-
3de0: 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44  >aDb[j] = db->aD
3df0: 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b[i];.    }.    
3e00: 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  j++;.  }.  memse
3e10: 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30  t(&db->aDb[j], 0
3e20: 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69  , (db->nDb-j)*si
3e30: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29  zeof(db->aDb[j])
3e40: 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a  );.  db->nDb = j
3e50: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c  ;.  if( db->nDb<
3e60: 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64  =2 && db->aDb!=d
3e70: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a  b->aDbStatic ){.
3e80: 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61      memcpy(db->a
3e90: 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44  DbStatic, db->aD
3ea0: 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b, 2*sizeof(db->
3eb0: 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71  aDb[0]));.    sq
3ec0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3ed0: 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62  db->aDb);.    db
3ee0: 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53  ->aDb = db->aDbS
3ef0: 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  tatic;.  }.}../*
3f00: 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 73 63  .** Reset the sc
3f10: 68 65 6d 61 20 66 6f 72 20 74 68 65 20 64 61 74  hema for the dat
3f20: 61 62 61 73 65 20 61 74 20 69 6e 64 65 78 20 69  abase at index i
3f30: 44 62 2e 20 20 41 6c 73 6f 20 72 65 73 65 74 20  Db.  Also reset 
3f40: 74 68 65 0a 2a 2a 20 54 45 4d 50 20 73 63 68 65  the.** TEMP sche
3f50: 6d 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ma..*/.void sqli
3f60: 74 65 33 52 65 73 65 74 4f 6e 65 53 63 68 65 6d  te3ResetOneSchem
3f70: 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  a(sqlite3 *db, i
3f80: 6e 74 20 69 44 62 29 7b 0a 20 20 44 62 20 2a 70  nt iDb){.  Db *p
3f90: 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  Db;.  assert( iD
3fa0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20  b<db->nDb );..  
3fb0: 2f 2a 20 43 61 73 65 20 31 3a 20 20 52 65 73 65  /* Case 1:  Rese
3fc0: 74 20 74 68 65 20 73 69 6e 67 6c 65 20 73 63 68  t the single sch
3fd0: 65 6d 61 20 69 64 65 6e 74 69 66 69 65 64 20 62  ema identified b
3fe0: 79 20 69 44 62 20 2a 2f 0a 20 20 70 44 62 20 3d  y iDb */.  pDb =
3ff0: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
4000: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
4010: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
4020: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
4030: 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70    assert( pDb->p
4040: 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20 73  Schema!=0 );.  s
4050: 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61  qlite3SchemaClea
4060: 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b  r(pDb->pSchema);
4070: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 64 61  ..  /* If any da
4080: 74 61 62 61 73 65 20 6f 74 68 65 72 20 74 68 61  tabase other tha
4090: 6e 20 54 45 4d 50 20 69 73 20 72 65 73 65 74 2c  n TEMP is reset,
40a0: 20 74 68 65 6e 20 61 6c 73 6f 20 72 65 73 65 74   then also reset
40b0: 20 54 45 4d 50 0a 20 20 2a 2a 20 73 69 6e 63 65   TEMP.  ** since
40c0: 20 54 45 4d 50 20 6d 69 67 68 74 20 62 65 20 68   TEMP might be h
40d0: 6f 6c 64 69 6e 67 20 74 72 69 67 67 65 72 73 20  olding triggers 
40e0: 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74  that reference t
40f0: 61 62 6c 65 73 20 69 6e 20 74 68 65 0a 20 20 2a  ables in the.  *
4100: 2a 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  * other database
4110: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44 62  ..  */.  if( iDb
4120: 21 3d 31 20 29 7b 0a 20 20 20 20 70 44 62 20 3d  !=1 ){.    pDb =
4130: 20 26 64 62 2d 3e 61 44 62 5b 31 5d 3b 0a 20 20   &db->aDb[1];.  
4140: 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70    assert( pDb->p
4150: 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20 20  Schema!=0 );.   
4160: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c   sqlite3SchemaCl
4170: 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61  ear(pDb->pSchema
4180: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b  );.  }.  return;
4190: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
41a0: 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  all schema infor
41b0: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 6c 6c 20  mation from all 
41c0: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
41d0: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a  es (including.**
41e0: 20 22 6d 61 69 6e 22 20 61 6e 64 20 22 74 65 6d   "main" and "tem
41f0: 70 22 29 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  p") for a single
4200: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
4210: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
4220: 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
4230: 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
4240: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
4250: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
4260: 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
4270: 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  b);.  for(i=0; i
4280: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
4290: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
42a0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
42b0: 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20  f( pDb->pSchema 
42c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
42d0: 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d  SchemaClear(pDb-
42e0: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  >pSchema);.    }
42f0: 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73  .  }.  db->flags
4300: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65   &= ~SQLITE_Inte
4310: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71 6c  rnChanges;.  sql
4320: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69  ite3VtabUnlockLi
4330: 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  st(db);.  sqlite
4340: 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
4350: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c  b);.  sqlite3Col
4360: 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72 72  lapseDatabaseArr
4370: 61 79 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ay(db);.}../*.**
4380: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4390: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63   called when a c
43a0: 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f  ommit occurs..*/
43b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
43c0: 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
43d0: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
43e0: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
43f0: 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  ~SQLITE_InternCh
4400: 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  anges;.}../*.** 
4410: 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79 20 61 6c  Delete memory al
4420: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
4430: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 20  column names of 
4440: 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  a table or view 
4450: 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65 2e 61 43  (the.** Table.aC
4460: 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a 2a 2f 0a  ol[] array)..*/.
4470: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
4480: 74 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61  teDeleteColumnNa
4490: 6d 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  mes(sqlite3 *db,
44a0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
44b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75  .  int i;.  Colu
44c0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65  mn *pCol;.  asse
44d0: 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29 3b  rt( pTable!=0 );
44e0: 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20 70  .  if( (pCol = p
44f0: 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20  Table->aCol)!=0 
4500: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
4510: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
4520: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
4530: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4540: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  e(db, pCol->zNam
4550: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
4560: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
4570: 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20  pCol->pDflt);.  
4580: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4590: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66 6c  e(db, pCol->zDfl
45a0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
45b0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
45c0: 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20  ->zType);.      
45d0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
45e0: 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a  , pCol->zColl);.
45f0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
4600: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
4610: 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 7d  le->aCol);.  }.}
4620: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
4630: 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73  he memory data s
4640: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
4650: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
4660: 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e  ven.** Table.  N
4670: 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
4680: 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68  de to disk by th
4690: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
46a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a  * This routine j
46b0: 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65 20  ust deletes the 
46c0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 20  data structure. 
46d0: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c   It does not unl
46e0: 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ink.** the table
46f0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
4700: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
4710: 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65  ble.  But it doe
4720: 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d  s destroy.** mem
4730: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f  ory structures o
4740: 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e  f the indices an
4750: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  d foreign keys a
4760: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
4770: 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  ** the table..**
4780: 0a 2a 2a 20 54 68 65 20 64 62 20 70 61 72 61 6d  .** The db param
4790: 65 74 65 72 20 69 73 20 6f 70 74 69 6f 6e 61 6c  eter is optional
47a0: 2e 20 20 49 74 20 69 73 20 6e 65 65 64 65 64 20  .  It is needed 
47b0: 69 66 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  if the Table obj
47c0: 65 63 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  ect .** contains
47d0: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
47e0: 79 2e 20 20 28 54 61 62 6c 65 20 6f 62 6a 65 63  y.  (Table objec
47f0: 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  ts in the schema
4800: 20 64 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 6c   do not use.** l
4810: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2c  ookaside memory,
4820: 20 62 75 74 20 73 6f 6d 65 20 65 70 68 65 6d 65   but some epheme
4830: 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  ral Table object
4840: 73 20 64 6f 2e 29 20 20 4f 72 20 74 68 65 0a 2a  s do.)  Or the.*
4850: 2a 20 64 62 20 70 61 72 61 6d 65 74 65 72 20 63  * db parameter c
4860: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
4870: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
4880: 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65 20   to measure the 
4890: 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73 65 64 20 62  memory.** used b
48a0: 79 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  y the Table obje
48b0: 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ct..*/.void sqli
48c0: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 73  te3DeleteTable(s
48d0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c  qlite3 *db, Tabl
48e0: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e  e *pTable){.  In
48f0: 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e  dex *pIndex, *pN
4900: 65 78 74 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  ext;.  TESTONLY(
4910: 20 69 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64 65 3b   int nLookaside;
4920: 20 29 20 2f 2a 20 55 73 65 64 20 74 6f 20 76 65   ) /* Used to ve
4930: 72 69 66 79 20 6c 6f 6f 6b 61 73 69 64 65 20 6e  rify lookaside n
4940: 6f 74 20 75 73 65 64 20 66 6f 72 20 73 63 68 65  ot used for sche
4950: 6d 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ma */..  assert(
4960: 20 21 70 54 61 62 6c 65 20 7c 7c 20 70 54 61 62   !pTable || pTab
4970: 6c 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20  le->nRef>0 );.. 
4980: 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74   /* Do not delet
4990: 65 20 74 68 65 20 74 61 62 6c 65 20 75 6e 74 69  e the table unti
49a0: 6c 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  l the reference 
49b0: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
49c0: 72 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 21 70 54  ro. */.  if( !pT
49d0: 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  able ) return;. 
49e0: 20 69 66 28 20 28 28 21 64 62 20 7c 7c 20 64 62   if( ((!db || db
49f0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
4a00: 30 29 20 26 26 20 28 2d 2d 70 54 61 62 6c 65 2d  0) && (--pTable-
4a10: 3e 6e 52 65 66 29 3e 30 29 20 29 20 72 65 74 75  >nRef)>0) ) retu
4a20: 72 6e 3b 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64  rn;..  /* Record
4a30: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
4a40: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 6f 6b 61  utstanding looka
4a50: 73 69 64 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  side allocations
4a60: 20 69 6e 20 73 63 68 65 6d 61 20 54 61 62 6c 65   in schema Table
4a70: 73 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20  s.  ** prior to 
4a80: 64 6f 69 6e 67 20 61 6e 79 20 66 72 65 65 28 29  doing any free()
4a90: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 53 69   operations.  Si
4aa0: 6e 63 65 20 73 63 68 65 6d 61 20 54 61 62 6c 65  nce schema Table
4ab0: 73 20 64 6f 20 6e 6f 74 20 75 73 65 0a 20 20 2a  s do not use.  *
4ac0: 2a 20 6c 6f 6f 6b 61 73 69 64 65 2c 20 74 68 69  * lookaside, thi
4ad0: 73 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c 64 20  s number should 
4ae0: 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f 0a 20  not change. */. 
4af0: 20 54 45 53 54 4f 4e 4c 59 28 20 6e 4c 6f 6f 6b   TESTONLY( nLook
4b00: 61 73 69 64 65 20 3d 20 28 64 62 20 26 26 20 28  aside = (db && (
4b10: 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73  pTable->tabFlags
4b20: 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
4b30: 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20  ==0) ?.         
4b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b50: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f  db->lookaside.nO
4b60: 75 74 20 3a 20 30 20 29 3b 0a 0a 20 20 2f 2a 20  ut : 0 );..  /* 
4b70: 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63  Delete all indic
4b80: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
4b90: 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  th this table. *
4ba0: 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d  /.  for(pIndex =
4bb0: 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b   pTable->pIndex;
4bc0: 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d   pIndex; pIndex=
4bd0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
4be0: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
4bf0: 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
4c00: 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d  Index->pSchema==
4c10: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20  pTable->pSchema 
4c20: 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 20 7c  );.    if( !db |
4c30: 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  | db->pnBytesFre
4c40: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  ed==0 ){.      c
4c50: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e  har *zName = pIn
4c60: 64 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20  dex->zName; .   
4c70: 20 20 20 54 45 53 54 4f 4e 4c 59 20 28 20 49 6e     TESTONLY ( In
4c80: 64 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20 73 71  dex *pOld = ) sq
4c90: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
4ca0: 0a 20 20 20 20 20 20 20 20 20 26 70 49 6e 64 65  .         &pInde
4cb0: 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  x->pSchema->idxH
4cc0: 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a 20 20  ash, zName, 0.  
4cd0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
4ce0: 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71  ert( db==0 || sq
4cf0: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
4d00: 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64  Held(db, 0, pInd
4d10: 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a  ex->pSchema) );.
4d20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
4d30: 6c 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20 70 4f  ld==pIndex || pO
4d40: 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  ld==0 );.    }. 
4d50: 20 20 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c     freeIndex(db,
4d60: 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20   pIndex);.  }.. 
4d70: 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 66   /* Delete any f
4d80: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74 74 61  oreign keys atta
4d90: 63 68 65 64 20 74 6f 20 74 68 69 73 20 74 61 62  ched to this tab
4da0: 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  le. */.  sqlite3
4db0: 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61  FkDelete(db, pTa
4dc0: 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  ble);..  /* Dele
4dd0: 74 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  te the Table str
4de0: 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20  ucture itself.. 
4df0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 44 65 6c 65   */.  sqliteDele
4e00: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62  teColumnNames(db
4e10: 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c  , pTable);.  sql
4e20: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4e30: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Table->zName);. 
4e40: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4e50: 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41  b, pTable->zColA
4e60: 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ff);.  sqlite3Se
4e70: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
4e80: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b  Table->pSelect);
4e90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4ea0: 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 73 71 6c  OMIT_CHECK.  sql
4eb0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
4ec0: 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70  te(db, pTable->p
4ed0: 43 68 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 23  Check);.#endif.#
4ee0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4ef0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
4f00: 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65    sqlite3VtabCle
4f10: 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  ar(db, pTable);.
4f20: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
4f30: 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c  DbFree(db, pTabl
4f40: 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79  e);..  /* Verify
4f50: 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73 69   that no lookasi
4f60: 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20 75 73  de memory was us
4f70: 65 64 20 62 79 20 73 63 68 65 6d 61 20 74 61 62  ed by schema tab
4f80: 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  les */.  assert(
4f90: 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30 20 7c   nLookaside==0 |
4fa0: 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 64 62  | nLookaside==db
4fb0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74  ->lookaside.nOut
4fc0: 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c   );.}../*.** Unl
4fd0: 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61  ink the given ta
4fe0: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73  ble from the has
4ff0: 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65  h tables and the
5000: 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74   delete the.** t
5010: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 77  able structure w
5020: 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69  ith all its indi
5030: 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20  ces and foreign 
5040: 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  keys..*/.void sq
5050: 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65  lite3UnlinkAndDe
5060: 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65  leteTable(sqlite
5070: 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20  3 *db, int iDb, 
5080: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
5090: 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Name){.  Table *
50a0: 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20  p;.  Db *pDb;.. 
50b0: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
50c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
50d0: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
50e0: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  b );.  assert( z
50f0: 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20 61 73 73  TabName );.  ass
5100: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
5110: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
5120: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 74 65 73  iDb, 0) );.  tes
5130: 74 63 61 73 65 28 20 7a 54 61 62 4e 61 6d 65 5b  tcase( zTabName[
5140: 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a 65 72  0]==0 );  /* Zer
5150: 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c 65 20 6e  o-length table n
5160: 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64  ames are allowed
5170: 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62 2d   */.  pDb = &db-
5180: 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d  >aDb[iDb];.  p =
5190: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
51a0: 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61  rt(&pDb->pSchema
51b0: 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e  ->tblHash, zTabN
51c0: 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ame, 0);.  sqlit
51d0: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
51e0: 2c 20 70 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  , p);.  db->flag
51f0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
5200: 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a  rnChanges;.}../*
5210: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65  .** Given a toke
5220: 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72 69  n, return a stri
5230: 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73  ng that consists
5240: 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66 20   of the text of 
5250: 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 2e 20 20  that.** token.  
5260: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
5270: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
5280: 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64  g.** is obtained
5290: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
52a0: 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65  oc() and must be
52b0: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
52c0: 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
52d0: 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 71 75 6f  n..**.** Any quo
52e0: 74 61 74 69 6f 6e 20 6d 61 72 6b 73 20 28 65 78  tation marks (ex
52f0: 3a 20 20 22 6e 61 6d 65 22 2c 20 27 6e 61 6d 65  :  "name", 'name
5300: 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72 20 60 6e  ', [name], or `n
5310: 61 6d 65 60 29 20 74 68 61 74 0a 2a 2a 20 73 75  ame`) that.** su
5320: 72 72 6f 75 6e 64 20 74 68 65 20 62 6f 64 79 20  rround the body 
5330: 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 61 72 65  of the token are
5340: 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20   removed..**.** 
5350: 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74 65 6e  Tokens are often
5360: 20 6a 75 73 74 20 70 6f 69 6e 74 65 72 73 20 69   just pointers i
5370: 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nto the original
5380: 20 53 51 4c 20 74 65 78 74 20 61 6e 64 20 73 6f   SQL text and so
5390: 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30 30  .** are not \000
53a0: 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20   terminated and 
53b0: 61 72 65 20 6e 6f 74 20 70 65 72 73 69 73 74 65  are not persiste
53c0: 6e 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65  nt.  The returne
53d0: 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c  d string.** is \
53e0: 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61  000 terminated a
53f0: 6e 64 20 69 73 20 70 65 72 73 69 73 74 65 6e 74  nd is persistent
5400: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
5410: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
5420: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b  sqlite3 *db, Tok
5430: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68  en *pName){.  ch
5440: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28  ar *zName;.  if(
5450: 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e   pName ){.    zN
5460: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
5470: 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72  trNDup(db, (char
5480: 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  *)pName->z, pNam
5490: 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  e->n);.    sqlit
54a0: 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
54b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
54c0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Name = 0;.  }.  
54d0: 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a  return zName;.}.
54e0: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  ./*.** Open the 
54f0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
5500: 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64 61  ble stored in da
5510: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69 44  tabase number iD
5520: 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67  b for.** writing
5530: 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6f  . The table is o
5540: 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72 73  pened using curs
5550: 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  or 0..*/.void sq
5560: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
5570: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 2c 20 69  able(Parse *p, i
5580: 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20  nt iDb){.  Vdbe 
5590: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
55a0: 64 62 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  dbe(p);.  sqlite
55b0: 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 44  3TableLock(p, iD
55c0: 62 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  b, MASTER_ROOT, 
55d0: 31 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  1, SCHEMA_TABLE(
55e0: 69 44 62 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  iDb));.  sqlite3
55f0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
5600: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30   OP_OpenWrite, 0
5610: 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 69  , MASTER_ROOT, i
5620: 44 62 2c 20 35 29 3b 0a 20 20 69 66 28 20 70 2d  Db, 5);.  if( p-
5630: 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20  >nTab==0 ){.    
5640: 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 7d  p->nTab = 1;.  }
5650: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
5660: 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73  ter zName points
5670: 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e   to a nul-termin
5680: 61 74 65 64 20 62 75 66 66 65 72 20 63 6f 6e 74  ated buffer cont
5690: 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 0a  aining the name.
56a0: 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  ** of a database
56b0: 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22   ("main", "temp"
56c0: 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   or the name of 
56d0: 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e  an attached db).
56e0: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
56f0: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 69 6e  n returns the in
5700: 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  dex of the named
5710: 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d   database in db-
5720: 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d 31  >aDb[], or.** -1
5730: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62   if the named db
5740: 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
5750: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5760: 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69 74  FindDbName(sqlit
5770: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
5780: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
5790: 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  t i = -1;       
57a0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
57b0: 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a 4e  mber */.  if( zN
57c0: 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20 2a 70  ame ){.    Db *p
57d0: 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20  Db;.    int n = 
57e0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
57f0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28  zName);.    for(
5800: 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70  i=(db->nDb-1), p
5810: 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20  Db=&db->aDb[i]; 
5820: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d  i>=0; i--, pDb--
5830: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 21 4f  ){.      if( (!O
5840: 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69 21  MIT_TEMPDB || i!
5850: 3d 31 20 29 20 26 26 20 6e 3d 3d 73 71 6c 69 74  =1 ) && n==sqlit
5860: 65 33 53 74 72 6c 65 6e 33 30 28 70 44 62 2d 3e  e3Strlen30(pDb->
5870: 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20 20 20 20  zName) && .     
5880: 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53       0==sqlite3S
5890: 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d  trICmp(pDb->zNam
58a0: 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
58b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
58c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
58d0: 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a  return i;.}../*.
58e0: 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e  ** The token *pN
58f0: 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ame contains the
5900: 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62   name of a datab
5910: 61 73 65 20 28 65 69 74 68 65 72 20 22 6d 61 69  ase (either "mai
5920: 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20  n" or.** "temp" 
5930: 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  or the name of a
5940: 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20  n attached db). 
5950: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
5960: 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65  urns the.** inde
5970: 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64  x of the named d
5980: 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61  atabase in db->a
5990: 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74  Db[], or -1 if t
59a0: 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20  he named db .** 
59b0: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a  does not exist..
59c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69  */.int sqlite3Fi
59d0: 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a 64 62  ndDb(sqlite3 *db
59e0: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
59f0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a10: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
5a20: 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ase number */.  
5a30: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
5a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a50: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20       /* Name we 
5a60: 61 72 65 20 73 65 61 72 63 68 69 6e 67 20 66 6f  are searching fo
5a70: 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  r */.  zName = s
5a80: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
5a90: 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ken(db, pName);.
5aa0: 20 20 69 20 3d 20 73 71 6c 69 74 65 33 46 69 6e    i = sqlite3Fin
5ab0: 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 4e 61 6d  dDbName(db, zNam
5ac0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
5ad0: 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
5ae0: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f    return i;.}../
5af0: 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76  * The table or v
5b00: 69 65 77 20 6f 72 20 74 72 69 67 67 65 72 20 6e  iew or trigger n
5b10: 61 6d 65 20 69 73 20 70 61 73 73 65 64 20 74 6f  ame is passed to
5b20: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69   this routine vi
5b30: 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d  a tokens.** pNam
5b40: 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49  e1 and pName2. I
5b50: 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  f the table name
5b60: 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69   was fully quali
5b70: 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  fied, for exampl
5b80: 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20  e:.**.** CREATE 
5b90: 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e  TABLE xxx.yyy (.
5ba0: 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e  ..);.** .** Then
5bb0: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
5bc0: 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d  o "xxx" and pNam
5bd0: 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65  e2 "yyy". On the
5be0: 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 2a   other hand if.*
5bf0: 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  * the table name
5c00: 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75   is not fully qu
5c10: 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a  alified, i.e.:.*
5c20: 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c  *.** CREATE TABL
5c30: 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a  E yyy(...);.**.*
5c40: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
5c50: 20 73 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e   set to "yyy" an
5c60: 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a  d pName2 is ""..
5c70: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
5c80: 6e 65 20 73 65 74 73 20 74 68 65 20 2a 70 70 55  ne sets the *ppU
5c90: 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f  nqual pointer to
5ca0: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f   point at the to
5cb0: 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a  ken (pName1 or.*
5cc0: 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73  * pName2) that s
5cd0: 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c  tores the unqual
5ce0: 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65  ified table name
5cf0: 2e 20 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20  .  The index of 
5d00: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
5d10: 22 78 78 78 22 20 69 73 20 72 65 74 75 72 6e 65  "xxx" is returne
5d20: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5d30: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20  3TwoPartName(.  
5d40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5d50: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
5d60: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
5d70: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
5d80: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
5d90: 20 20 20 20 2f 2a 20 54 68 65 20 22 78 78 78 22      /* The "xxx"
5da0: 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78   in the name "xx
5db0: 78 2e 79 79 79 22 20 6f 72 20 22 78 78 78 22 20  x.yyy" or "xxx" 
5dc0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
5dd0: 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e2,      /* The 
5de0: 22 79 79 79 22 20 69 6e 20 74 68 65 20 6e 61 6d  "yyy" in the nam
5df0: 65 20 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20  e "xxx.yyy" */. 
5e00: 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c   Token **pUnqual
5e10: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
5e20: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6f 62  e unqualified ob
5e30: 6a 65 63 74 20 6e 61 6d 65 20 68 65 72 65 20 2a  ject name here *
5e40: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  /.){.  int iDb; 
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e60: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
5e70: 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a 65 63  olding the objec
5e80: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
5e90: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
5ea0: 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ..  if( ALWAYS(p
5eb0: 4e 61 6d 65 32 21 3d 30 29 20 26 26 20 70 4e 61  Name2!=0) && pNa
5ec0: 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  me2->n>0 ){.    
5ed0: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
5ee0: 79 20 29 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  y ) {.      sqli
5ef0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5f00: 73 65 2c 20 22 63 6f 72 72 75 70 74 20 64 61 74  se, "corrupt dat
5f10: 61 62 61 73 65 22 29 3b 0a 20 20 20 20 20 20 72  abase");.      r
5f20: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
5f30: 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70      *pUnqual = p
5f40: 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d  Name2;.    iDb =
5f50: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64   sqlite3FindDb(d
5f60: 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  b, pName1);.    
5f70: 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20  if( iDb<0 ){.   
5f80: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
5f90: 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
5fa0: 6f 77 6e 20 64 61 74 61 62 61 73 65 20 25 54 22  own database %T"
5fb0: 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20  , pName1);.     
5fc0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
5fd0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  }.  }else{.    a
5fe0: 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e  ssert( db->init.
5ff0: 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e  iDb==0 || db->in
6000: 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 69  it.busy );.    i
6010: 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44  Db = db->init.iD
6020: 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20  b;.    *pUnqual 
6030: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20  = pName1;.  }.  
6040: 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f  return iDb;.}../
6050: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6060: 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65  e is used to che
6070: 63 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38 20  ck if the UTF-8 
6080: 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20  string zName is 
6090: 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61  a legal.** unqua
60a0: 6c 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20  lified name for 
60b0: 61 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a  a new schema obj
60c0: 65 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65  ect (table, inde
60d0: 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72  x, view or.** tr
60e0: 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65  igger). All name
60f0: 73 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65  s are legal exce
6100: 70 74 20 74 68 6f 73 65 20 74 68 61 74 20 62 65  pt those that be
6110: 67 69 6e 20 77 69 74 68 20 74 68 65 20 73 74 72  gin with the str
6120: 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22  ing.** "sqlite_"
6130: 20 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65   (in upper, lowe
6140: 72 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29  r or mixed case)
6150: 2e 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f  . This portion o
6160: 66 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a  f the namespace.
6170: 2a 2a 20 69 73 20 72 65 73 65 72 76 65 64 20 66  ** is reserved f
6180: 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e  or internal use.
6190: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
61a0: 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50  heckObjectName(P
61b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
61c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
61d0: 7b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  {.  if( !pParse-
61e0: 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  >db->init.busy &
61f0: 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  & pParse->nested
6200: 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26  ==0 .          &
6210: 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  & (pParse->db->f
6220: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72  lags & SQLITE_Wr
6230: 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20  iteSchema)==0.  
6240: 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
6250: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e  lite3StrNICmp(zN
6260: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
6270: 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  7) ){.    sqlite
6280: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
6290: 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72  , "object name r
62a0: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
62b0: 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a  rnal use: %s", z
62c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
62d0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
62e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
62f0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6300: 20 52 65 74 75 72 6e 20 74 68 65 20 50 52 49 4d   Return the PRIM
6310: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 6f 66  ARY KEY index of
6320: 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65   a table.*/.Inde
6330: 78 20 2a 73 71 6c 69 74 65 33 50 72 69 6d 61 72  x *sqlite3Primar
6340: 79 4b 65 79 49 6e 64 65 78 28 54 61 62 6c 65 20  yKeyIndex(Table 
6350: 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20  *pTab){.  Index 
6360: 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 54 61 62  *p;.  for(p=pTab
6370: 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 21  ->pIndex; p && !
6380: 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
6390: 78 28 70 29 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  x(p); p=p->pNext
63a0: 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  ){}.  return p;.
63b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
63c0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e  the column of in
63d0: 64 65 78 20 70 49 64 78 20 74 68 61 74 20 63 6f  dex pIdx that co
63e0: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 61 62  rresponds to tab
63f0: 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f  le.** column iCo
6400: 6c 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  l.  Return -1 if
6410: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69   not found..*/.i
6420: 31 36 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  16 sqlite3Column
6430: 4f 66 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70  OfIndex(Index *p
6440: 49 64 78 2c 20 69 31 36 20 69 43 6f 6c 29 7b 0a  Idx, i16 iCol){.
6450: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
6460: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; i<pIdx->nCol
6470: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  umn; i++){.    i
6480: 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61  f( iCol==pIdx->a
6490: 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20 72 65 74  iColumn[i] ) ret
64a0: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
64b0: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
64c0: 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74   Begin construct
64d0: 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20  ing a new table 
64e0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
64f0: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
6500: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
6510: 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f  of several actio
6520: 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20  n routines that 
6530: 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65  get called in re
6540: 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43  sponse.** to a C
6550: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
6560: 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69  ement.  In parti
6570: 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74  cular, this rout
6580: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  ine is called.**
6590: 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f   after seeing to
65a0: 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e  kens "CREATE" an
65b0: 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68  d "TABLE" and th
65c0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68  e table name. Th
65d0: 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67  e isTemp.** flag
65e0: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
65f0: 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20  table should be 
6600: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75  stored in the au
6610: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
6620: 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64  .** file instead
6630: 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   of in the main 
6640: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
6650: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
6660: 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65   the case.** whe
6670: 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20  n the "TEMP" or 
6680: 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77  "TEMPORARY" keyw
6690: 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65  ord occurs in be
66a0: 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20  tween.** CREATE 
66b0: 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a  and TABLE..**.**
66c0: 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   The new table r
66d0: 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c  ecord is initial
66e0: 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20  ized and put in 
66f0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
6700: 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66  e..** As more of
6710: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
6720: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  E statement is p
6730: 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61  arsed, additiona
6740: 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74  l action.** rout
6750: 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c  ines will be cal
6760: 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20  led to add more 
6770: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
6780: 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41  his record..** A
6790: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
67a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
67b0: 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c  atement, the sql
67c0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72  ite3EndTable() r
67d0: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
67e0: 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  led to complete 
67f0: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  the construction
6800: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
6810: 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69  e record..*/.voi
6820: 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61  d sqlite3StartTa
6830: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
6840: 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65  arse,   /* Parse
6850: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
6860: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
6870: 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
6880: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
6890: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
68a0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
68b0: 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70  2,   /* Second p
68c0: 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20  art of the name 
68d0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
68e0: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
68f0: 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72  Temp,      /* Tr
6900: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
6910: 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20  TEMP table */.  
6920: 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20 20  int isView,     
6930: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
6940: 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20   is a VIEW */.  
6950: 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20  int isVirtual,  
6960: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
6970: 20 69 73 20 61 20 56 49 52 54 55 41 4c 20 74 61   is a VIRTUAL ta
6980: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45  ble */.  int noE
6990: 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  rr        /* Do 
69a0: 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65  nothing if table
69b0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
69c0: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
69d0: 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Table;.  char *z
69e0: 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65  Name = 0; /* The
69f0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77   name of the new
6a00: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
6a10: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
6a20: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ->db;.  Vdbe *v;
6a30: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
6a40: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
6a50: 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65  number to create
6a60: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f   the table in */
6a70: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b  .  Token *pName;
6a80: 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
6a90: 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  ed name of the t
6aa0: 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a  able to create *
6ab0: 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  /..  /* The tabl
6ac0: 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 74  e or view name t
6ad0: 6f 20 63 72 65 61 74 65 20 69 73 20 70 61 73 73  o create is pass
6ae0: 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ed to this routi
6af0: 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20  ne via tokens.  
6b00: 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e  ** pName1 and pN
6b10: 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62  ame2. If the tab
6b20: 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c  le name was full
6b30: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72  y qualified, for
6b40: 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   example:.  **. 
6b50: 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
6b60: 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a   xxx.yyy (...);.
6b70: 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20    ** .  ** Then 
6b80: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
6b90: 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65   "xxx" and pName
6ba0: 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20  2 "yyy". On the 
6bb0: 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 20 20  other hand if.  
6bc0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  ** the table nam
6bd0: 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71  e is not fully q
6be0: 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a  ualified, i.e.:.
6bf0: 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45    **.  ** CREATE
6c00: 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b   TABLE yyy(...);
6c10: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
6c20: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
6c30: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
6c40: 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20  2 is ""..  **.  
6c50: 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f  ** The call belo
6c60: 77 20 73 65 74 73 20 74 68 65 20 70 4e 61 6d 65  w sets the pName
6c70: 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e   pointer to poin
6c80: 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28  t at the token (
6c90: 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70  pName1 or.  ** p
6ca0: 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72  Name2) that stor
6cb0: 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  es the unqualifi
6cc0: 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54  ed table name. T
6cd0: 68 65 20 76 61 72 69 61 62 6c 65 20 69 44 62 20  he variable iDb 
6ce0: 69 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20 74  is.  ** set to t
6cf0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
6d00: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 74 68  database that th
6d10: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
6d20: 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72  is to be.  ** cr
6d30: 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20  eated in..  */. 
6d40: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
6d50: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
6d60: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
6d70: 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  , &pName);.  if(
6d80: 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b   iDb<0 ) return;
6d90: 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d  .  if( !OMIT_TEM
6da0: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 26 26  PDB && isTemp &&
6db0: 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20   pName2->n>0 && 
6dc0: 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  iDb!=1 ){.    /*
6dd0: 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 74   If creating a t
6de0: 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e  emp table, the n
6df0: 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71  ame may not be q
6e00: 75 61 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73 73  ualified. Unless
6e10: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74   .    ** the dat
6e20: 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 22 74  abase name is "t
6e30: 65 6d 70 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f  emp" anyway.  */
6e40: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
6e50: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 65  rMsg(pParse, "te
6e60: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e 61  mporary table na
6e70: 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61  me must be unqua
6e80: 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 72 65  lified");.    re
6e90: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
6ea0: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
6eb0: 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31  isTemp ) iDb = 1
6ec0: 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61  ;..  pParse->sNa
6ed0: 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65  meToken = *pName
6ee0: 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ;.  zName = sqli
6ef0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
6f00: 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  (db, pName);.  i
6f10: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  f( zName==0 ) re
6f20: 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49  turn;.  if( SQLI
6f30: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
6f40: 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
6f50: 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
6f60: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
6f70: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  able_error;.  }.
6f80: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69    if( db->init.i
6f90: 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d  Db==1 ) isTemp =
6fa0: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
6fb0: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
6fc0: 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20  ATION.  assert( 
6fd0: 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69 73  (isTemp & 1)==is
6fe0: 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20  Temp );.  {.    
6ff0: 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 68  int code;.    ch
7000: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
7010: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
7020: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
7030: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
7040: 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
7050: 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d  HEMA_TABLE(isTem
7060: 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  p), 0, zDb) ){. 
7070: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
7080: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
7090: 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65   }.    if( isVie
70a0: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  w ){.      if( !
70b0: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
70c0: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  sTemp ){.       
70d0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
70e0: 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b  REATE_TEMP_VIEW;
70f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7100: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
7110: 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 3b  ITE_CREATE_VIEW;
7120: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
7130: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  se{.      if( !O
7140: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73  MIT_TEMPDB && is
7150: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
7160: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
7170: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b  EATE_TEMP_TABLE;
7180: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7190: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
71a0: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
71b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
71c0: 20 20 20 20 69 66 28 20 21 69 73 56 69 72 74 75      if( !isVirtu
71d0: 61 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75 74  al && sqlite3Aut
71e0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
71f0: 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a  ode, zName, 0, z
7200: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
7210: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
7220: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ror;.    }.  }.#
7230: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65  endif..  /* Make
7240: 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61   sure the new ta
7250: 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f  ble name does no
7260: 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61  t collide with a
7270: 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
7280: 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e  index or table n
7290: 61 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ame in the same 
72a0: 64 61 74 61 62 61 73 65 2e 20 20 49 73 73 75 65  database.  Issue
72b0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
72c0: 65 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65  e if.  ** it doe
72d0: 73 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  s. The exception
72e0: 20 69 73 20 69 66 20 74 68 65 20 73 74 61 74 65   is if the state
72f0: 6d 65 6e 74 20 62 65 69 6e 67 20 70 61 72 73 65  ment being parse
7300: 64 20 77 61 73 20 70 61 73 73 65 64 0a 20 20 2a  d was passed.  *
7310: 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  * to an sqlite3_
7320: 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20 63  declare_vtab() c
7330: 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63 61 73  all. In that cas
7340: 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d  e only the colum
7350: 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64  n names.  ** and
7360: 20 74 79 70 65 73 20 77 69 6c 6c 20 62 65 20 75   types will be u
7370: 73 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73  sed, so there is
7380: 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74   no need to test
7390: 20 66 6f 72 20 6e 61 6d 65 73 70 61 63 65 0a 20   for namespace. 
73a0: 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a   ** collisions..
73b0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44    */.  if( !IN_D
73c0: 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20  ECLARE_VTAB ){. 
73d0: 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64     char *zDb = d
73e0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
73f0: 65 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  e;.    if( SQLIT
7400: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
7410: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
7420: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
7430: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
7440: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 6c  .    }.    pTabl
7450: 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  e = sqlite3FindT
7460: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
7470: 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54  zDb);.    if( pT
7480: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66  able ){.      if
7490: 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20  ( !noErr ){.    
74a0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
74b0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
74c0: 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20 65 78  le %T already ex
74d0: 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  ists", pName);. 
74e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
74f0: 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
7500: 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 43 4f  >init.busy || CO
7510: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
7520: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
7530: 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
7540: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
7550: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  }.      goto beg
7560: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
7570: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
7580: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
7590: 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d  b, zName, zDb)!=
75a0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
75b0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
75c0: 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
75d0: 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61  eady an index na
75e0: 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  med %s", zName);
75f0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
7600: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
7610: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62     }.  }..  pTab
7620: 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  le = sqlite3DbMa
7630: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
7640: 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 69  eof(Table));.  i
7650: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a  f( pTable==0 ){.
7660: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
7670: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 70 50  iled = 1;.    pP
7680: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
7690: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61  E_NOMEM;.    pPa
76a0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
76b0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
76c0: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  e_error;.  }.  p
76d0: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Table->zName = z
76e0: 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Name;.  pTable->
76f0: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54  iPKey = -1;.  pT
7700: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20  able->pSchema = 
7710: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
7720: 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  hema;.  pTable->
7730: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62  nRef = 1;.  pTab
7740: 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  le->nRowLogEst =
7750: 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30   200; assert( 20
7760: 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
7770: 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 61  (1048576) );.  a
7780: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
7790: 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  NewTable==0 );. 
77a0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
77b0: 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20  le = pTable;..  
77c0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
77d0: 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73  e magic sqlite_s
77e0: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73  equence table us
77f0: 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d  ed by autoincrem
7800: 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72  ent,.  ** then r
7810: 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20  ecord a pointer 
7820: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e  to this table in
7830: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
7840: 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
7850: 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54  * so that INSERT
7860: 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61   can find the ta
7870: 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f  ble easily..  */
7880: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7890: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
78a0: 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  NT.  if( !pParse
78b0: 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72 63  ->nested && strc
78c0: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
78d0: 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20  e_sequence")==0 
78e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
78f0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
7900: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
7910: 29 20 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  ) );.    pTable-
7920: 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61  >pSchema->pSeqTa
7930: 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a  b = pTable;.  }.
7940: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67  #endif..  /* Beg
7950: 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  in generating th
7960: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
7970: 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c   insert the tabl
7980: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20  e record into.  
7990: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  ** the SQLITE_MA
79a0: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74  STER table.  Not
79b0: 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20  e in particular 
79c0: 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20  that we must go 
79d0: 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61  ahead.  ** and a
79e0: 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f  llocate the reco
79f0: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
7a00: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f  e table entry no
7a10: 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20  w.  Before any. 
7a20: 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
7a30: 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72  or UNIQUE keywor
7a40: 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20  ds are parsed.  
7a50: 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77  Those keywords w
7a60: 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69  ill cause.  ** i
7a70: 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65  ndices to be cre
7a80: 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62  ated and the tab
7a90: 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63  le record must c
7aa0: 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a  ome before the .
7ab0: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48    ** indices.  H
7ac0: 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64  ence, the record
7ad0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
7ae0: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c  table must be al
7af0: 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77  located.  ** now
7b00: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
7b10: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28  ->init.busy && (
7b20: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
7b30: 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29  be(pParse))!=0 )
7b40: 7b 0a 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20  {.    int j1;.  
7b50: 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74    int fileFormat
7b60: 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20  ;.    int reg1, 
7b70: 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20  reg2, reg3;.    
7b80: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
7b90: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
7ba0: 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66  e, 1, iDb);..#if
7bb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7bc0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
7bd0: 20 20 69 66 28 20 69 73 56 69 72 74 75 61 6c 20    if( isVirtual 
7be0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7bf0: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
7c00: 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a  _VBegin);.    }.
7c10: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
7c20: 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  f the file forma
7c30: 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69  t and encoding i
7c40: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
7c50: 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74  ave not been set
7c60: 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  , .    ** set th
7c70: 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20  em now..    */. 
7c80: 20 20 20 72 65 67 31 20 3d 20 70 50 61 72 73 65     reg1 = pParse
7c90: 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70  ->regRowid = ++p
7ca0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
7cb0: 20 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e   reg2 = pParse->
7cc0: 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72  regRoot = ++pPar
7cd0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
7ce0: 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  g3 = ++pParse->n
7cf0: 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
7d00: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7d10: 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62  _ReadCookie, iDb
7d20: 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46 49  , reg3, BTREE_FI
7d30: 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20  LE_FORMAT);.    
7d40: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
7d50: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  tree(v, iDb);.  
7d60: 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
7d70: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
7d80: 66 2c 20 72 65 67 33 29 3b 20 56 64 62 65 43 6f  f, reg3); VdbeCo
7d90: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 66  verage(v);.    f
7da0: 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d  ileFormat = (db-
7db0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
7dc0: 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d  LegacyFileFmt)!=
7dd0: 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  0 ?.            
7de0: 20 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45        1 : SQLITE
7df0: 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  _MAX_FILE_FORMAT
7e00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7e10: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
7e20: 74 65 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61  teger, fileForma
7e30: 74 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71  t, reg3);.    sq
7e40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
7e50: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
7e60: 20 69 44 62 2c 20 42 54 52 45 45 5f 46 49 4c 45   iDb, BTREE_FILE
7e70: 5f 46 4f 52 4d 41 54 2c 20 72 65 67 33 29 3b 0a  _FORMAT, reg3);.
7e80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7e90: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
7ea0: 67 65 72 2c 20 45 4e 43 28 64 62 29 2c 20 72 65  ger, ENC(db), re
7eb0: 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g3);.    sqlite3
7ec0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7ed0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
7ee0: 20 42 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f   BTREE_TEXT_ENCO
7ef0: 44 49 4e 47 2c 20 72 65 67 33 29 3b 0a 20 20 20  DING, reg3);.   
7f00: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
7f10: 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20  Here(v, j1);..  
7f20: 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63    /* This just c
7f30: 72 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68  reates a place-h
7f40: 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20  older record in 
7f50: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
7f60: 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20  r table..    ** 
7f70: 54 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 74  The record creat
7f80: 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  ed does not cont
7f90: 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74  ain anything yet
7fa0: 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65  .  It will be re
7fb0: 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79  placed.    ** by
7fc0: 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20   the real entry 
7fd0: 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  in code generate
7fe0: 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54  d at sqlite3EndT
7ff0: 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  able()..    **. 
8000: 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20     ** The rowid 
8010: 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72  for the new entr
8020: 79 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  y is left in reg
8030: 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65  ister pParse->re
8040: 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54  gRowid..    ** T
8050: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
8060: 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ber of the new t
8070: 61 62 6c 65 20 69 73 20 6c 65 66 74 20 69 6e 20  able is left in 
8080: 72 65 67 20 70 50 61 72 73 65 2d 3e 72 65 67 52  reg pParse->regR
8090: 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  oot..    ** The 
80a0: 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74 20 70  rowid and root p
80b0: 61 67 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 65  age number value
80c0: 73 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  s are needed by 
80d0: 74 68 65 20 63 6f 64 65 20 74 68 61 74 0a 20 20  the code that.  
80e0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64 54    ** sqlite3EndT
80f0: 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72 61  able will genera
8100: 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21  te..    */.#if !
8110: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
8120: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
8130: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8140: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
8150: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 7c      if( isView |
8160: 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20  | isVirtual ){. 
8170: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8180: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
8190: 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a  eger, 0, reg2);.
81a0: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
81b0: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 70 50 61  .    {.      pPa
81c0: 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20 3d  rse->addrCrTab =
81d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
81e0: 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54  p2(v, OP_CreateT
81f0: 61 62 6c 65 2c 20 69 44 62 2c 20 72 65 67 32 29  able, iDb, reg2)
8200: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
8210: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
8220: 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  le(pParse, iDb);
8230: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8240: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
8250: 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b  Rowid, 0, reg1);
8260: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8270: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
8280: 6c 2c 20 30 2c 20 72 65 67 33 29 3b 0a 20 20 20  l, 0, reg3);.   
8290: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
82a0: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
82b0: 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b   0, reg3, reg1);
82c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
82d0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
82e0: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
82f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8300: 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a  0(v, OP_Close);.
8310: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
8320: 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74   (non-error) ret
8330: 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  urn. */.  return
8340: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
8350: 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a  ror occurs, we j
8360: 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69  ump here */.begi
8370: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20  n_table_error:. 
8380: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8390: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  b, zName);.  ret
83a0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  urn;.}../*.** Th
83b0: 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64  is macro is used
83c0: 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 20   to compare two 
83d0: 73 74 72 69 6e 67 73 20 69 6e 20 61 20 63 61 73  strings in a cas
83e0: 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 6d 61  e-insensitive ma
83f0: 6e 6e 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73  nner..** It is s
8400: 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 20 74  lightly faster t
8410: 68 61 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69  han calling sqli
8420: 74 65 33 53 74 72 49 43 6d 70 28 29 20 64 69 72  te3StrICmp() dir
8430: 65 63 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72  ectly, but.** pr
8440: 6f 64 75 63 65 73 20 6c 61 72 67 65 72 20 63 6f  oduces larger co
8450: 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e  de..**.** WARNIN
8460: 47 3a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73  G: This macro is
8470: 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 20   not compatible 
8480: 77 69 74 68 20 74 68 65 20 73 74 72 63 6d 70 28  with the strcmp(
8490: 29 20 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20  ) family. It.** 
84a0: 72 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20  returns true if 
84b0: 74 68 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20  the two strings 
84c0: 61 72 65 20 65 71 75 61 6c 2c 20 6f 74 68 65 72  are equal, other
84d0: 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23  wise false..*/.#
84e0: 64 65 66 69 6e 65 20 53 54 52 49 43 4d 50 28 78  define STRICMP(x
84f0: 2c 20 79 29 20 28 5c 0a 73 71 6c 69 74 65 33 55  , y) (\.sqlite3U
8500: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e  pperToLower[*(un
8510: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 78  signed char *)(x
8520: 29 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33  )]==   \.sqlite3
8530: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75  UpperToLower[*(u
8540: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28  nsigned char *)(
8550: 79 29 5d 20 20 20 20 20 5c 0a 26 26 20 73 71 6c  y)]     \.&& sql
8560: 69 74 65 33 53 74 72 49 43 6d 70 28 28 78 29 2b  ite3StrICmp((x)+
8570: 31 2c 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f  1,(y)+1)==0 )../
8580: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63  *.** Add a new c
8590: 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62  olumn to the tab
85a0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  le currently bei
85b0: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a  ng constructed..
85c0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  **.** The parser
85d0: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
85e0: 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ine once for eac
85f0: 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61  h column declara
8600: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45  tion.** in a CRE
8610: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
8620: 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61  ent.  sqlite3Sta
8630: 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63  rtTable() gets c
8640: 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74  alled.** first t
8650: 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69  o get things goi
8660: 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72  ng.  Then this r
8670: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8680: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c   for each.** col
8690: 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  umn..*/.void sql
86a0: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61  ite3AddColumn(Pa
86b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
86c0: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61  en *pName){.  Ta
86d0: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
86e0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f  .  char *z;.  Co
86f0: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71  lumn *pCol;.  sq
8700: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
8710: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70  se->db;.  if( (p
8720: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
8730: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
8740: 6e 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  n;.#if SQLITE_MA
8750: 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70  X_COLUMN.  if( p
8760: 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69  ->nCol+1>db->aLi
8770: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
8780: 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20  _COLUMN] ){.    
8790: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
87a0: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
87b0: 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22  y columns on %s"
87c0: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  , p->zName);.   
87d0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
87e0: 64 69 66 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  dif.  z = sqlite
87f0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
8800: 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
8810: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
8820: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
8830: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
8840: 69 66 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70  if( STRICMP(z, p
8850: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
8860: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8870: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8880: 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c  , "duplicate col
8890: 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  umn name: %s", z
88a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
88b0: 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
88c0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
88d0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d   }.  }.  if( (p-
88e0: 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20  >nCol & 0x7)==0 
88f0: 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61  ){.    Column *a
8900: 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20  New;.    aNew = 
8910: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
8920: 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e  (db,p->aCol,(p->
8930: 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70  nCol+8)*sizeof(p
8940: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  ->aCol[0]));.   
8950: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
8960: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
8970: 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
8980: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
8990: 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e      p->aCol = aN
89a0: 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d  ew;.  }.  pCol =
89b0: 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f   &p->aCol[p->nCo
89c0: 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f  l];.  memset(pCo
89d0: 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  l, 0, sizeof(p->
89e0: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f  aCol[0]));.  pCo
89f0: 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a  l->zName = z;. .
8a00: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
8a10: 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66 69   no type specifi
8a20: 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65  ed, columns have
8a30: 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 66 66   the default aff
8a40: 69 6e 69 74 79 0a 20 20 2a 2a 20 27 42 4c 4f 42  inity.  ** 'BLOB
8a50: 27 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  '. If there is a
8a60: 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c   type specified,
8a70: 20 74 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64   then sqlite3Add
8a80: 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c  ColumnType() wil
8a90: 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64  l.  ** be called
8aa0: 20 6e 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f   next to set pCo
8ab0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72  l->affinity corr
8ac0: 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43  ectly..  */.  pC
8ad0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  ol->affinity = S
8ae0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
8af0: 20 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20    pCol->szEst = 
8b00: 31 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a  1;.  p->nCol++;.
8b10: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
8b20: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
8b30: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
8b40: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
8b50: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
8b60: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
8b70: 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f  tatement.  A "NO
8b80: 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69  T NULL" constrai
8b90: 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73  nt has.** been s
8ba0: 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e  een on a column.
8bb0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
8bc0: 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20  ets the notNull 
8bd0: 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  flag on.** the c
8be0: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
8bf0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
8c00: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
8c10: 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61  te3AddNotNull(Pa
8c20: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
8c30: 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62   onError){.  Tab
8c40: 6c 65 20 2a 70 3b 0a 20 20 70 20 3d 20 70 50 61  le *p;.  p = pPa
8c50: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
8c60: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45    if( p==0 || NE
8c70: 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29  VER(p->nCol<1) )
8c80: 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 61 43   return;.  p->aC
8c90: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e 6e 6f  ol[p->nCol-1].no
8ca0: 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72  tNull = (u8)onEr
8cb0: 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63  ror;.}../*.** Sc
8cc0: 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  an the column ty
8cd0: 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c  pe name zType (l
8ce0: 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64  ength nType) and
8cf0: 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61   return the.** a
8d00: 73 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69  ssociated affini
8d10: 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54  ty type..**.** T
8d20: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
8d30: 20 61 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64   a case-independ
8d40: 65 6e 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54  ent search of zT
8d50: 79 70 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  ype for the .** 
8d60: 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68  substrings in th
8d70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
8d80: 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65  e. If one of the
8d90: 20 73 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a   substrings is.*
8da0: 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72  * found, the cor
8db0: 72 65 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e  responding affin
8dc0: 69 74 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ity is returned.
8dd0: 20 49 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69   If zType contai
8de0: 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20  ns.** more than 
8df0: 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74  one of the subst
8e00: 72 69 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74  rings, entries t
8e10: 6f 77 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66  oward the top of
8e20: 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74   .** the table t
8e30: 61 6b 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f  ake priority. Fo
8e40: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54  r example, if zT
8e50: 79 70 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27  ype is 'BLOBINT'
8e60: 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  , .** SQLITE_AFF
8e70: 5f 49 4e 54 45 47 45 52 20 69 73 20 72 65 74 75  _INTEGER is retu
8e80: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73  rned..**.** Subs
8e90: 74 72 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69  tring     | Affi
8ea0: 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  nity.** --------
8eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ec0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54  --------.** 'INT
8ed0: 27 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  '         | SQLI
8ee0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a  TE_AFF_INTEGER.*
8ef0: 2a 20 27 43 48 41 52 27 20 20 20 20 20 20 20 20  * 'CHAR'        
8f00: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  | SQLITE_AFF_TEX
8f10: 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20  T.** 'CLOB'     
8f20: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
8f30: 54 45 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20  TEXT.** 'TEXT'  
8f40: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
8f50: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42  FF_TEXT.** 'BLOB
8f60: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
8f70: 45 5f 41 46 46 5f 42 4c 4f 42 0a 2a 2a 20 27 52  E_AFF_BLOB.** 'R
8f80: 45 41 4c 27 20 20 20 20 20 20 20 20 7c 20 53 51  EAL'        | SQ
8f90: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a  LITE_AFF_REAL.**
8fa0: 20 27 46 4c 4f 41 27 20 20 20 20 20 20 20 20 7c   'FLOA'        |
8fb0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
8fc0: 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20 20 20 20  .** 'DOUB'      
8fd0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52    | SQLITE_AFF_R
8fe0: 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e  EAL.**.** If non
8ff0: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
9000: 6e 67 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65  ngs in the above
9010: 20 74 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64   table are found
9020: 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  ,.** SQLITE_AFF_
9030: 4e 55 4d 45 52 49 43 20 69 73 20 72 65 74 75 72  NUMERIC is retur
9040: 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c  ned..*/.char sql
9050: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
9060: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e  (const char *zIn
9070: 2c 20 75 38 20 2a 70 73 7a 45 73 74 29 7b 0a 20  , u8 *pszEst){. 
9080: 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68   u32 h = 0;.  ch
9090: 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f  ar aff = SQLITE_
90a0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63  AFF_NUMERIC;.  c
90b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 61 72  onst char *zChar
90c0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 7a 49 6e   = 0;..  if( zIn
90d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 66 66  ==0 ) return aff
90e0: 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 5b 30  ;.  while( zIn[0
90f0: 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c  ] ){.    h = (h<
9100: 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55 70 70  <8) + sqlite3Upp
9110: 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e 29  erToLower[(*zIn)
9120: 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49 6e 2b  &0xff];.    zIn+
9130: 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28  +;.    if( h==((
9140: 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31  'c'<<24)+('h'<<1
9150: 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29  6)+('a'<<8)+'r')
9160: 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
9170: 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20  /* CHAR */.     
9180: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9190: 46 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7a 43  F_TEXT;.      zC
91a0: 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20 20 20 7d  har = zIn;.    }
91b0: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63  else if( h==(('c
91c0: 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29  '<<24)+('l'<<16)
91d0: 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29  +('o'<<8)+'b') )
91e0: 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20  {       /* CLOB 
91f0: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
9200: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
9210: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
9220: 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27  =(('t'<<24)+('e'
9230: 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27  <<16)+('x'<<8)+'
9240: 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20  t') ){       /* 
9250: 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66  TEXT */.      af
9260: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
9270: 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EXT;.    }else i
9280: 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29  f( h==(('b'<<24)
9290: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
92a0: 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20  <8)+'b')        
92b0: 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20    /* BLOB */.   
92c0: 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51       && (aff==SQ
92d0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
92e0: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
92f0: 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20  AFF_REAL) ){.   
9300: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
9310: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20  AFF_BLOB;.      
9320: 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27 28 27 20  if( zIn[0]=='(' 
9330: 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 23  ) zChar = zIn;.#
9340: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9350: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
9360: 54 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  T.    }else if( 
9370: 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27  h==(('r'<<24)+('
9380: 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29  e'<<16)+('a'<<8)
9390: 2b 27 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'l')          /
93a0: 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20  * REAL */.      
93b0: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
93c0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
93d0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
93e0: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20  TE_AFF_REAL;.   
93f0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
9400: 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'f'<<24)+('l'<<1
9410: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29  6)+('o'<<8)+'a')
9420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f            /* FLO
9430: 41 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  A */.        && 
9440: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
9450: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
9460: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9470: 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73  F_REAL;.    }els
9480: 65 20 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c  e if( h==(('d'<<
9490: 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27  24)+('o'<<16)+('
94a0: 75 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  u'<<8)+'b')     
94b0: 20 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a       /* DOUB */.
94c0: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
94d0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
94e0: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
94f0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
9500: 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  L;.#endif.    }e
9510: 6c 73 65 20 69 66 28 20 28 68 26 30 78 30 30 46  lse if( (h&0x00F
9520: 46 46 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31  FFFFF)==(('i'<<1
9530: 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29  6)+('n'<<8)+'t')
9540: 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f   ){    /* INT */
9550: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
9560: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
9570: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9580: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
9590: 20 70 73 7a 45 73 74 20 69 73 20 6e 6f 74 20 4e   pszEst is not N
95a0: 55 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65 73  ULL, store an es
95b0: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 66 69  timate of the fi
95c0: 65 6c 64 20 73 69 7a 65 2e 20 20 54 68 65 0a 20  eld size.  The. 
95d0: 20 2a 2a 20 65 73 74 69 6d 61 74 65 20 69 73 20   ** estimate is 
95e0: 73 63 61 6c 65 64 20 73 6f 20 74 68 61 74 20 74  scaled so that t
95f0: 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 69 6e  he size of an in
9600: 74 65 67 65 72 20 69 73 20 31 2e 20 20 2a 2f 0a  teger is 1.  */.
9610: 20 20 69 66 28 20 70 73 7a 45 73 74 20 29 7b 0a    if( pszEst ){.
9620: 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 31 3b      *pszEst = 1;
9630: 20 20 20 2f 2a 20 64 65 66 61 75 6c 74 20 73 69     /* default si
9640: 7a 65 20 69 73 20 61 70 70 72 6f 78 20 34 20 62  ze is approx 4 b
9650: 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ytes */.    if( 
9660: 61 66 66 3c 53 51 4c 49 54 45 5f 41 46 46 5f 4e  aff<SQLITE_AFF_N
9670: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
9680: 69 66 28 20 7a 43 68 61 72 20 29 7b 0a 20 20 20  if( zChar ){.   
9690: 20 20 20 20 20 77 68 69 6c 65 28 20 7a 43 68 61       while( zCha
96a0: 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[0] ){.        
96b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 64    if( sqlite3Isd
96c0: 69 67 69 74 28 7a 43 68 61 72 5b 30 5d 29 20 29  igit(zChar[0]) )
96d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
96e0: 74 20 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t v = 0;.       
96f0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 74 49       sqlite3GetI
9700: 6e 74 33 32 28 7a 43 68 61 72 2c 20 26 76 29 3b  nt32(zChar, &v);
9710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 20 3d  .            v =
9720: 20 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20 20 20   v/4 + 1;.      
9730: 20 20 20 20 20 20 69 66 28 20 76 3e 32 35 35 20        if( v>255 
9740: 29 20 76 20 3d 20 32 35 35 3b 0a 20 20 20 20 20  ) v = 255;.     
9750: 20 20 20 20 20 20 20 2a 70 73 7a 45 73 74 20 3d         *pszEst =
9760: 20 76 3b 20 2f 2a 20 42 4c 4f 42 28 6b 29 2c 20   v; /* BLOB(k), 
9770: 56 41 52 43 48 41 52 28 6b 29 2c 20 43 48 41 52  VARCHAR(k), CHAR
9780: 28 6b 29 20 2d 3e 20 72 3d 28 6b 2f 34 2b 31 29  (k) -> r=(k/4+1)
9790: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
97a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
97b0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 43 68   }.          zCh
97c0: 61 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ar++;.        }.
97d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
97e0: 20 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 35       *pszEst = 5
97f0: 3b 20 20 20 2f 2a 20 42 4c 4f 42 2c 20 54 45 58  ;   /* BLOB, TEX
9800: 54 2c 20 43 4c 4f 42 20 2d 3e 20 72 3d 35 20 20  T, CLOB -> r=5  
9810: 28 61 70 70 72 6f 78 20 32 30 20 62 79 74 65 73  (approx 20 bytes
9820: 29 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )*/.      }.    
9830: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  }.  }.  return a
9840: 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ff;.}../*.** Thi
9850: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
9860: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
9870: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
9880: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
9890: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
98a0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  LE statement.  T
98b0: 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20  he pFirst token 
98c0: 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  is the first.** 
98d0: 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71  token in the seq
98e0: 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20  uence of tokens 
98f0: 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68  that describe th
9900: 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a  e type of the.**
9910: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
9920: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
9930: 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73  tion.   pLast is
9940: 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a   the last token.
9950: 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e  ** in the sequen
9960: 63 65 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e  ce.  Use this in
9970: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e  formation to con
9980: 73 74 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a  struct a string.
9990: 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ** that contains
99a0: 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66   the typename of
99b0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20   the column and 
99c0: 73 74 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e  store that strin
99d0: 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a  g.** in zType..*
99e0: 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  / .void sqlite3A
99f0: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72  ddColumnType(Par
9a00: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
9a10: 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62  n *pType){.  Tab
9a20: 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20  le *p;.  Column 
9a30: 2a 70 43 6f 6c 3b 0a 0a 20 20 70 20 3d 20 70 50  *pCol;..  p = pP
9a40: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
9a50: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e  .  if( p==0 || N
9a60: 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20  EVER(p->nCol<1) 
9a70: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c  ) return;.  pCol
9a80: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e   = &p->aCol[p->n
9a90: 43 6f 6c 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74  Col-1];.  assert
9aa0: 28 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30  ( pCol->zType==0
9ab0: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
9ac0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
9ad0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 43  e(pParse->db, pC
9ae0: 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 70 43  ol->zType);.  pC
9af0: 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69  ol->zType = sqli
9b00: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
9b10: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 79  (pParse->db, pTy
9b20: 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66 66  pe);.  pCol->aff
9b30: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41  inity = sqlite3A
9b40: 66 66 69 6e 69 74 79 54 79 70 65 28 70 43 6f 6c  ffinityType(pCol
9b50: 2d 3e 7a 54 79 70 65 2c 20 26 70 43 6f 6c 2d 3e  ->zType, &pCol->
9b60: 73 7a 45 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  szEst);.}../*.**
9b70: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
9b80: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76  is the default v
9b90: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73  alue for the mos
9ba0: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
9bb0: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68   column.** of th
9bc0: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
9bd0: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
9be0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61  tion..**.** Defa
9bf0: 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65 73  ult value expres
9c00: 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f  sions must be co
9c10: 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61  nstant.  Raise a
9c20: 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74  n exception if t
9c30: 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68  his.** is not th
9c40: 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e case..**.** Th
9c50: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
9c60: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
9c70: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
9c80: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
9c90: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
9ca0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
9cb0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
9cc0: 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61  dDefaultValue(Pa
9cd0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
9ce0: 72 53 70 61 6e 20 2a 70 53 70 61 6e 29 7b 0a 20  rSpan *pSpan){. 
9cf0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c   Table *p;.  Col
9d00: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c  umn *pCol;.  sql
9d10: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9d20: 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 70 50 61  e->db;.  p = pPa
9d30: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
9d40: 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20    if( p!=0 ){.  
9d50: 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43    pCol = &(p->aC
9d60: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a  ol[p->nCol-1]);.
9d70: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
9d80: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
9d90: 46 75 6e 63 74 69 6f 6e 28 70 53 70 61 6e 2d 3e  Function(pSpan->
9da0: 70 45 78 70 72 2c 20 64 62 2d 3e 69 6e 69 74 2e  pExpr, db->init.
9db0: 62 75 73 79 29 20 29 7b 0a 20 20 20 20 20 20 73  busy) ){.      s
9dc0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
9dd0: 50 61 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20  Parse, "default 
9de0: 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20  value of column 
9df0: 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73  [%s] is not cons
9e00: 74 61 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20  tant",.         
9e10: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
9e20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9e30: 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 45 78  /* A copy of pEx
9e40: 70 72 20 69 73 20 75 73 65 64 20 69 6e 73 74 65  pr is used inste
9e50: 61 64 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ad of the origin
9e60: 61 6c 2c 20 61 73 20 70 45 78 70 72 20 63 6f 6e  al, as pExpr con
9e70: 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74  tains.      ** t
9e80: 6f 6b 65 6e 73 20 74 68 61 74 20 70 6f 69 6e 74  okens that point
9e90: 20 74 6f 20 76 6f 6c 61 74 69 6c 65 20 6d 65 6d   to volatile mem
9ea0: 6f 72 79 2e 20 54 68 65 20 27 73 70 61 6e 27 20  ory. The 'span' 
9eb0: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
9ec0: 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65  n.      ** is re
9ed0: 71 75 69 72 65 64 20 62 79 20 70 72 61 67 6d 61  quired by pragma
9ee0: 20 74 61 62 6c 65 5f 69 6e 66 6f 2e 0a 20 20 20   table_info..   
9ef0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
9f00: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
9f10: 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a  , pCol->pDflt);.
9f20: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c        pCol->pDfl
9f30: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
9f40: 75 70 28 64 62 2c 20 70 53 70 61 6e 2d 3e 70 45  up(db, pSpan->pE
9f50: 78 70 72 2c 20 45 58 50 52 44 55 50 5f 52 45 44  xpr, EXPRDUP_RED
9f60: 55 43 45 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  UCE);.      sqli
9f70: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43  te3DbFree(db, pC
9f80: 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20 20 20  ol->zDflt);.    
9f90: 20 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 20 3d 20    pCol->zDflt = 
9fa0: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
9fb0: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61  (db, (char*)pSpa
9fc0: 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20  n->zStart,.     
9fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ff0: 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e  (int)(pSpan->zEn
a000: 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72  d - pSpan->zStar
a010: 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t));.    }.  }. 
a020: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
a030: 74 65 28 64 62 2c 20 70 53 70 61 6e 2d 3e 70 45  te(db, pSpan->pE
a040: 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  xpr);.}../*.** D
a050: 65 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49  esignate the PRI
a060: 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65  MARY KEY for the
a070: 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69   table.  pList i
a080: 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65  s a list of name
a090: 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73  s .** of columns
a0a0: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70   that form the p
a0b0: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
a0c0: 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74  pList is NULL, t
a0d0: 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20  hen the.** most 
a0e0: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63  recently added c
a0f0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62  olumn of the tab
a100: 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72  le is the primar
a110: 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  y key..**.** A t
a120: 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74  able can have at
a130: 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72   most one primar
a140: 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74  y key.  If the t
a150: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73  able already has
a160: 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65  .** a primary ke
a170: 79 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74  y (and this is t
a180: 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72  he second primar
a190: 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61  y key) then crea
a1a0: 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a  te an.** error..
a1b0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49  **.** If the PRI
a1c0: 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61  MARY KEY is on a
a1d0: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77   single column w
a1e0: 68 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73  hose datatype is
a1f0: 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65   INTEGER,.** the
a200: 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f  n we will try to
a210: 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e   use that column
a220: 20 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20   as the rowid.  
a230: 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50  Set the Table.iP
a240: 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20  Key.** field of 
a250: 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20  the table under 
a260: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20  construction to 
a270: 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  be the index of 
a280: 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50  the.** INTEGER P
a290: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
a2a0: 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20  n.  Table.iPKey 
a2b0: 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20  is set to -1 if 
a2c0: 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49  there is.** no I
a2d0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
a2e0: 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  EY..**.** If the
a2f0: 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49   key is not an I
a300: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
a310: 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  EY, then create 
a320: 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65  a unique.** inde
a330: 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20  x for the key.  
a340: 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61  No index is crea
a350: 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20  ted for INTEGER 
a360: 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f  PRIMARY KEYs..*/
a370: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
a380: 50 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61  PrimaryKey(.  Pa
a390: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
a3a0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
a3b0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
a3c0: 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73   *pList,  /* Lis
a3d0: 74 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73  t of field names
a3e0: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
a3f0: 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
a400: 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
a410: 20 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75   do with a uniqu
a420: 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a  eness conflict *
a430: 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c  /.  int autoInc,
a440: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
a450: 20 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45   the AUTOINCREME
a460: 4e 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  NT keyword is pr
a470: 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73  esent */.  int s
a480: 6f 72 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20  ortOrder     /* 
a490: 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72  SQLITE_SO_ASC or
a4a0: 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20   SQLITE_SO_DESC 
a4b0: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
a4c0: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
a4d0: 65 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20  ewTable;.  char 
a4e0: 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e  *zType = 0;.  in
a4f0: 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a  t iCol = -1, i;.
a500: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 69    int nTerm;.  i
a510: 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 49 4e  f( pTab==0 || IN
a520: 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20  _DECLARE_VTAB ) 
a530: 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79  goto primary_key
a540: 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61  _exit;.  if( pTa
a550: 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
a560: 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 20 29  _HasPrimaryKey )
a570: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
a580: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
a590: 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73       "table \"%s
a5a0: 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e  \" has more than
a5b0: 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79   one primary key
a5c0: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
a5d0: 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72  .    goto primar
a5e0: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a  y_key_exit;.  }.
a5f0: 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
a600: 20 7c 3d 20 54 46 5f 48 61 73 50 72 69 6d 61 72   |= TF_HasPrimar
a610: 79 4b 65 79 3b 0a 20 20 69 66 28 20 70 4c 69 73  yKey;.  if( pLis
a620: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c  t==0 ){.    iCol
a630: 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20   = pTab->nCol - 
a640: 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f  1;.    pTab->aCo
a650: 6c 5b 69 43 6f 6c 5d 2e 63 6f 6c 46 6c 61 67 73  l[iCol].colFlags
a660: 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d   |= COLFLAG_PRIM
a670: 4b 45 59 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d  KEY;.    zType =
a680: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
a690: 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 6e 54 65  ].zType;.    nTe
a6a0: 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  rm = 1;.  }else{
a6b0: 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 70 4c 69  .    nTerm = pLi
a6c0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66  st->nExpr;.    f
a6d0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b  or(i=0; i<nTerm;
a6e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72   i++){.      for
a6f0: 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54  (iCol=0; iCol<pT
a700: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  ab->nCol; iCol++
a710: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
a720: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c  qlite3StrICmp(pL
a730: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
a740: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
a750: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
a760: 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61           pTab->a
a770: 43 6f 6c 5b 69 43 6f 6c 5d 2e 63 6f 6c 46 6c 61  Col[iCol].colFla
a780: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52  gs |= COLFLAG_PR
a790: 49 4d 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 20  IMKEY;.         
a7a0: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
a7b0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
a7c0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
a7d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a7e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
a7f0: 69 66 28 20 6e 54 65 72 6d 3d 3d 31 0a 20 20 20  if( nTerm==1.   
a800: 26 26 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69  && zType && sqli
a810: 74 65 33 53 74 72 49 43 6d 70 28 7a 54 79 70 65  te3StrICmp(zType
a820: 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a  , "INTEGER")==0.
a830: 20 20 20 26 26 20 73 6f 72 74 4f 72 64 65 72 3d     && sortOrder=
a840: 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 0a 20  =SQLITE_SO_ASC. 
a850: 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50   ){.    pTab->iP
a860: 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  Key = iCol;.    
a870: 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20  pTab->keyConf = 
a880: 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20  (u8)onError;.   
a890: 20 61 73 73 65 72 74 28 20 61 75 74 6f 49 6e 63   assert( autoInc
a8a0: 3d 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d  ==0 || autoInc==
a8b0: 31 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74  1 );.    pTab->t
a8c0: 61 62 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49  abFlags |= autoI
a8d0: 6e 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d  nc*TF_Autoincrem
a8e0: 65 6e 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ent;.    if( pLi
a8f0: 73 74 20 29 20 70 50 61 72 73 65 2d 3e 69 50 6b  st ) pParse->iPk
a900: 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73  SortOrder = pLis
a910: 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  t->a[0].sortOrde
a920: 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61  r;.  }else if( a
a930: 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65  utoInc ){.#ifnde
a940: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
a950: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
a960: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
a970: 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43  pParse, "AUTOINC
a980: 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61  REMENT is only a
a990: 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20  llowed on an ". 
a9a0: 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 20 50        "INTEGER P
a9b0: 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65  RIMARY KEY");.#e
a9c0: 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
a9d0: 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
a9e0: 70 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  p = sqlite3Creat
a9f0: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30  eIndex(pParse, 0
aa00: 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f  , 0, 0, pList, o
aa10: 6e 45 72 72 6f 72 2c 20 30 2c 0a 20 20 20 20 20  nError, 0,.     
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa30: 20 20 20 20 20 20 30 2c 20 73 6f 72 74 4f 72 64        0, sortOrd
aa40: 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  er, 0);.    if( 
aa50: 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 64  p ){.      p->id
aa60: 78 54 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49  xType = SQLITE_I
aa70: 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45  DXTYPE_PRIMARYKE
aa80: 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  Y;.    }.    pLi
aa90: 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69  st = 0;.  }..pri
aaa0: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20  mary_key_exit:. 
aab0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
aac0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
aad0: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
aae0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  urn;.}../*.** Ad
aaf0: 64 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f  d a new CHECK co
ab00: 6e 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20  nstraint to the 
ab10: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
ab20: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
ab30: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
ab40: 74 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74  te3AddCheckConst
ab50: 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  raint(.  Parse *
ab60: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
ab70: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
ab80: 0a 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45  .  Expr *pCheckE
ab90: 78 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63  xpr  /* The chec
aba0: 6b 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  k expression */.
abb0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
abc0: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54  E_OMIT_CHECK.  T
abd0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
abe0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
abf0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
ac00: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
ac10: 28 20 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45  ( pTab && !IN_DE
ac20: 43 4c 41 52 45 5f 56 54 41 42 0a 20 20 20 26 26  CLARE_VTAB.   &&
ac30: 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 49 73   !sqlite3BtreeIs
ac40: 52 65 61 64 6f 6e 6c 79 28 64 62 2d 3e 61 44 62  Readonly(db->aDb
ac50: 5b 64 62 2d 3e 69 6e 69 74 2e 69 44 62 5d 2e 70  [db->init.iDb].p
ac60: 42 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 54 61  Bt).  ){.    pTa
ac70: 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69  b->pCheck = sqli
ac80: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
ac90: 64 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  d(pParse, pTab->
aca0: 70 43 68 65 63 6b 2c 20 70 43 68 65 63 6b 45 78  pCheck, pCheckEx
acb0: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  pr);.    if( pPa
acc0: 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e  rse->constraintN
acd0: 61 6d 65 2e 6e 20 29 7b 0a 20 20 20 20 20 20 73  ame.n ){.      s
ace0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
acf0: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 54  tName(pParse, pT
ad00: 61 62 2d 3e 70 43 68 65 63 6b 2c 20 26 70 50 61  ab->pCheck, &pPa
ad10: 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e  rse->constraintN
ad20: 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ame, 1);.    }. 
ad30: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
ad40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
ad50: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
ad60: 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b  db, pCheckExpr);
ad70: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
ad80: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  t the collation 
ad90: 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  function of the 
ada0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61  most recently pa
adb0: 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d  rsed table colum
adc0: 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c  n.** to the Coll
add0: 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f  Seq given..*/.vo
ade0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
adf0: 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a  lateType(Parse *
ae00: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
ae10: 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20  Token){.  Table 
ae20: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
ae30: 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20  har *zColl;     
ae40: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71 75           /* Dequ
ae50: 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c  oted name of col
ae60: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
ae70: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
ae80: 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  ;..  if( (p = pP
ae90: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
aea0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
aeb0: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
aec0: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
aed0: 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69  ;.  zColl = sqli
aee0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
aef0: 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  (db, pToken);.  
af00: 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74  if( !zColl ) ret
af10: 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  urn;..  if( sqli
af20: 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
af30: 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20  (pParse, zColl) 
af40: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
af50: 64 78 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  dx;.    sqlite3D
af60: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
af70: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20  l[i].zColl);.   
af80: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c   p->aCol[i].zCol
af90: 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20  l = zColl;.  .  
afa0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
afb0: 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20 61  mn is declared a
afc0: 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52  s "<name> PRIMAR
afd0: 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74  Y KEY COLLATE <t
afe0: 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68  ype>",.    ** th
aff0: 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20  en an index may 
b000: 68 61 76 65 20 62 65 65 6e 20 63 72 65 61 74 65  have been create
b010: 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e  d on this column
b020: 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20   before the.    
b030: 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70  ** collation typ
b040: 65 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72  e was added. Cor
b050: 72 65 63 74 20 74 68 69 73 20 69 66 20 69 74 20  rect this if it 
b060: 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20  is the case..   
b070: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49 64 78   */.    for(pIdx
b080: 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  =p->pIndex; pIdx
b090: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
b0a0: 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
b0b0: 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  t( pIdx->nKeyCol
b0c0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==1 );.      if(
b0d0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
b0e0: 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 20  0]==i ){.       
b0f0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d   pIdx->azColl[0]
b100: 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43   = p->aCol[i].zC
b110: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
b120: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
b130: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
b140: 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a  , zColl);.  }.}.
b150: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
b160: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
b170: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
b180: 6e 63 65 20 66 6f 72 20 64 61 74 61 62 61 73 65  nce for database
b190: 20 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20   native text.** 
b1a0: 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66  encoding identif
b1b0: 69 65 64 20 62 79 20 74 68 65 20 73 74 72 69 6e  ied by the strin
b1c0: 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  g zName, length 
b1d0: 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nName..**.** If 
b1e0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
b1f0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
b200: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
b210: 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61  e, or not availa
b220: 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61  ble.** in the da
b230: 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e  tabase native en
b240: 63 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c  coding, the coll
b250: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73  ation factory is
b260: 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72   invoked to.** r
b270: 65 71 75 65 73 74 20 69 74 2e 20 49 66 20 74 68  equest it. If th
b280: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
b290: 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ory does not sup
b2a0: 70 6c 79 20 73 75 63 68 20 61 20 73 65 71 75 65  ply such a seque
b2b0: 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  nce,.** and the 
b2c0: 73 65 71 75 65 6e 63 65 20 69 73 20 61 76 61 69  sequence is avai
b2d0: 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72  lable in another
b2e0: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20   text encoding, 
b2f0: 74 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20  then that is.** 
b300: 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
b310: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65  ..**.** If no ve
b320: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65  rsions of the re
b330: 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
b340: 6e 73 20 73 65 71 75 65 6e 63 65 20 61 72 65 20  ns sequence are 
b350: 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a  available, or.**
b360: 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f   another error o
b370: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
b380: 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65  eturned and an e
b390: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69  rror message wri
b3a0: 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61  tten into.** pPa
b3b0: 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  rse..**.** This 
b3c0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 77 72 61  routine is a wra
b3d0: 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69  pper around sqli
b3e0: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29  te3FindCollSeq()
b3f0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
b400: 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63  ** invokes the c
b410: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
b420: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 63 6f   if the named co
b430: 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  llation cannot b
b440: 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67  e found.** and g
b450: 65 6e 65 72 61 74 65 73 20 61 6e 20 65 72 72 6f  enerates an erro
b460: 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a  r message..**.**
b470: 20 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74   See also: sqlit
b480: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2c  e3FindCollSeq(),
b490: 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53   sqlite3GetCollS
b4a0: 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  eq().*/.CollSeq 
b4b0: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f  *sqlite3LocateCo
b4c0: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
b4d0: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
b4e0: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74  *zName){.  sqlit
b4f0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
b500: 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20  >db;.  u8 enc = 
b510: 45 4e 43 28 64 62 29 3b 0a 20 20 75 38 20 69 6e  ENC(db);.  u8 in
b520: 69 74 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69  itbusy = db->ini
b530: 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65  t.busy;.  CollSe
b540: 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f  q *pColl;..  pCo
b550: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
b560: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c  CollSeq(db, enc,
b570: 20 7a 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79   zName, initbusy
b580: 29 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75  );.  if( !initbu
b590: 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c  sy && (!pColl ||
b5a0: 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29   !pColl->xCmp) )
b5b0: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
b5c0: 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28  lite3GetCollSeq(
b5d0: 70 50 61 72 73 65 2c 20 65 6e 63 2c 20 70 43 6f  pParse, enc, pCo
b5e0: 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  ll, zName);.  }.
b5f0: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
b600: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
b610: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
b620: 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  ll increment the
b630: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a   schema cookie..
b640: 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61  **.** The schema
b650: 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20   cookie is used 
b660: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
b670: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72  n the schema for
b680: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
b690: 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72   changes.  After
b6a0: 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61   each schema cha
b6b0: 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20  nge, the cookie 
b6c0: 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73  value.** changes
b6d0: 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73  .  When a proces
b6e0: 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68  s first reads th
b6f0: 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f  e schema it reco
b700: 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69  rds the.** cooki
b710: 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20  e.  Thereafter, 
b720: 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73  whenever it goes
b730: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
b740: 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63  atabase,.** it c
b750: 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65  hecks the cookie
b760: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
b770: 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74  e schema has not
b780: 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63   changed.** sinc
b790: 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65  e it was last re
b7a0: 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70  ad..**.** This p
b7b0: 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c  lan is not compl
b7c0: 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f  etely bullet-pro
b7d0: 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69  of.  It is possi
b7e0: 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ble for.** the s
b7f0: 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20  chema to change 
b800: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61  multiple times a
b810: 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69  nd for the cooki
b820: 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62  e to be.** set b
b830: 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c  ack to prior val
b840: 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20  ue.  But schema 
b850: 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72  changes are infr
b860: 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68  equent.** and th
b870: 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  e probability of
b880: 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d   hitting the sam
b890: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69  e cookie value i
b8a0: 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e  s only.** 1 chan
b8b0: 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20  ce in 2^32.  So 
b8c0: 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67  we're safe enoug
b8d0: 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  h..*/.void sqlit
b8e0: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50  e3ChangeCookie(P
b8f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
b900: 74 20 69 44 62 29 7b 0a 20 20 69 6e 74 20 72 31  t iDb){.  int r1
b910: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
b920: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
b930: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
b940: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
b950: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
b960: 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  dbe;.  assert( s
b970: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
b980: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
b990: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ) );.  sqlite3Vd
b9a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
b9b0: 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b  nteger, db->aDb[
b9c0: 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63  iDb].pSchema->sc
b9d0: 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 72  hema_cookie+1, r
b9e0: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
b9f0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
ba00: 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54  tCookie, iDb, BT
ba10: 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53 49  REE_SCHEMA_VERSI
ba20: 4f 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74  ON, r1);.  sqlit
ba30: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
ba40: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a  (pParse, r1);.}.
ba50: 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74  ./*.** Measure t
ba60: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
ba70: 72 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74  racters needed t
ba80: 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76  o output the giv
ba90: 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72  en.** identifier
baa0: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65  .  The number re
bab0: 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20  turned includes 
bac0: 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a  any quotes used.
bad0: 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  ** but does not 
bae0: 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c  include the null
baf0: 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a   terminator..**.
bb00: 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 20  ** The estimate 
bb10: 69 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e  is conservative.
bb20: 20 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61    It might be la
bb30: 72 67 65 72 20 74 68 61 74 20 77 68 61 74 20 69  rger that what i
bb40: 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64  s.** really need
bb50: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
bb60: 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f  t identLength(co
bb70: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
bb80: 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30  int n;.  for(n=0
bb90: 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b  ; *z; n++, z++){
bba0: 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27  .    if( *z=='"'
bbb0: 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20   ){ n++; }.  }. 
bbc0: 20 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d   return n + 2;.}
bbd0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
bbe0: 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  t parameter is a
bbf0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
bc00: 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68  utput buffer. Th
bc10: 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72  e second .** par
bc20: 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
bc30: 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  ter to an intege
bc40: 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  r that contains 
bc50: 74 68 65 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a  the offset at.**
bc60: 20 77 68 69 63 68 20 74 6f 20 77 72 69 74 65 20   which to write 
bc70: 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  into the output 
bc80: 62 75 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e  buffer. This fun
bc90: 63 74 69 6f 6e 20 63 6f 70 69 65 73 20 74 68 65  ction copies the
bca0: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
bcb0: 65 64 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65  ed string pointe
bcc0: 64 20 74 6f 20 62 79 20 74 68 65 20 74 68 69 72  d to by the thir
bcd0: 64 20 70 61 72 61 6d 65 74 65 72 2c 20 7a 53 69  d parameter, zSi
bce0: 67 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f  gnedIdent,.** to
bcf0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f   the specified o
bd00: 66 66 73 65 74 20 69 6e 20 74 68 65 20 62 75 66  ffset in the buf
bd10: 66 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 20  fer and updates 
bd20: 2a 70 49 64 78 20 74 6f 20 72 65 66 65 72 0a 2a  *pIdx to refer.*
bd30: 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  * to the first b
bd40: 79 74 65 20 61 66 74 65 72 20 74 68 65 20 6c 61  yte after the la
bd50: 73 74 20 62 79 74 65 20 77 72 69 74 74 65 6e 20  st byte written 
bd60: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
bd70: 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
bd80: 73 74 72 69 6e 67 20 7a 53 69 67 6e 65 64 49 64  string zSignedId
bd90: 65 6e 74 20 63 6f 6e 73 69 73 74 73 20 65 6e 74  ent consists ent
bda0: 69 72 65 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e  irely of alpha-n
bdb0: 75 6d 65 72 69 63 0a 2a 2a 20 63 68 61 72 61 63  umeric.** charac
bdc0: 74 65 72 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62  ters, does not b
bdd0: 65 67 69 6e 20 77 69 74 68 20 61 20 64 69 67 69  egin with a digi
bde0: 74 20 61 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20  t and is not an 
bdf0: 53 51 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20  SQL keyword,.** 
be00: 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65  then it is copie
be10: 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  d to the output 
be20: 62 75 66 66 65 72 20 65 78 61 63 74 6c 79 20 61  buffer exactly a
be30: 73 20 69 74 20 69 73 2e 20 4f 74 68 65 72 77 69  s it is. Otherwi
be40: 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f  se,.** it is quo
be50: 74 65 64 20 75 73 69 6e 67 20 64 6f 75 62 6c 65  ted using double
be60: 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  -quotes..*/.stat
be70: 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74  ic void identPut
be80: 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70  (char *z, int *p
be90: 49 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e  Idx, char *zSign
bea0: 65 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69  edIdent){.  unsi
beb0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e  gned char *zIden
bec0: 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  t = (unsigned ch
bed0: 61 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74  ar*)zSignedIdent
bee0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65  ;.  int i, j, ne
bef0: 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a  edQuote;.  i = *
bf00: 70 49 64 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30  pIdx;..  for(j=0
bf10: 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b  ; zIdent[j]; j++
bf20: 29 7b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  ){.    if( !sqli
bf30: 74 65 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e  te3Isalnum(zIden
bf40: 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b  t[j]) && zIdent[
bf50: 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b  j]!='_' ) break;
bf60: 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65  .  }.  needQuote
bf70: 20 3d 20 73 71 6c 69 74 65 33 49 73 64 69 67 69   = sqlite3Isdigi
bf80: 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20  t(zIdent[0]).   
bf90: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
bfa0: 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a  te3KeywordCode(z
bfb0: 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44  Ident, j)!=TK_ID
bfc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
bfd0: 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20  zIdent[j]!=0.   
bfe0: 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3d 3d 30           || j==0
bff0: 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f  ;..  if( needQuo
c000: 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22  te ) z[i++] = '"
c010: 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49  ';.  for(j=0; zI
c020: 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  dent[j]; j++){. 
c030: 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65     z[i++] = zIde
c040: 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a  nt[j];.    if( z
c050: 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20  Ident[j]=='"' ) 
c060: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
c070: 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  }.  if( needQuot
c080: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
c090: 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20  ;.  z[i] = 0;.  
c0a0: 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a  *pIdx = i;.}../*
c0b0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43  .** Generate a C
c0c0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
c0d0: 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74  ement appropriat
c0e0: 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
c0f0: 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72  ** table.  Memor
c100: 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65  y to hold the te
c110: 78 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  xt of the statem
c120: 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ent is obtained.
c130: 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ** from sqliteMa
c140: 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
c150: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
c160: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
c170: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
c180: 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d   *createTableStm
c190: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  t(sqlite3 *db, T
c1a0: 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  able *p){.  int 
c1b0: 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20  i, k, n;.  char 
c1c0: 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a  *zStmt;.  char *
c1d0: 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a  zSep, *zSep2, *z
c1e0: 45 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  End;.  Column *p
c1f0: 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  Col;.  n = 0;.  
c200: 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43  for(pCol = p->aC
c210: 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  ol, i=0; i<p->nC
c220: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
c230: 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74  {.    n += ident
c240: 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61  Length(pCol->zNa
c250: 6d 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e  me) + 5;.  }.  n
c260: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
c270: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  p->zName);.  if(
c280: 20 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a 53   n<50 ){ .    zS
c290: 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65  ep = "";.    zSe
c2a0: 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45  p2 = ",";.    zE
c2b0: 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73  nd = ")";.  }els
c2c0: 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c  e{.    zSep = "\
c2d0: 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  n  ";.    zSep2 
c2e0: 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a  = ",\n  ";.    z
c2f0: 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d  End = "\n)";.  }
c300: 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70  .  n += 35 + 6*p
c310: 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20  ->nCol;.  zStmt 
c320: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
c330: 63 52 61 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66  cRaw(0, n);.  if
c340: 28 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  ( zStmt==0 ){.  
c350: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
c360: 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ed = 1;.    retu
c370: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rn 0;.  }.  sqli
c380: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20  te3_snprintf(n, 
c390: 7a 53 74 6d 74 2c 20 22 43 52 45 41 54 45 20 54  zStmt, "CREATE T
c3a0: 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73  ABLE ");.  k = s
c3b0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
c3c0: 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75  Stmt);.  identPu
c3d0: 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e  t(zStmt, &k, p->
c3e0: 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b  zName);.  zStmt[
c3f0: 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f  k++] = '(';.  fo
c400: 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20  r(pCol=p->aCol, 
c410: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
c420: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
c430: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
c440: 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79  har * const azTy
c450: 70 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  pe[] = {.       
c460: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 42   /* SQLITE_AFF_B
c470: 4c 4f 42 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20  LOB    */ "",.  
c480: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
c490: 41 46 46 5f 54 45 58 54 20 20 20 20 2a 2f 20 22  AFF_TEXT    */ "
c4a0: 20 54 45 58 54 22 2c 0a 20 20 20 20 20 20 20 20   TEXT",.        
c4b0: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  /* SQLITE_AFF_NU
c4c0: 4d 45 52 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c  MERIC */ " NUM",
c4d0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  .        /* SQLI
c4e0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 2a  TE_AFF_INTEGER *
c4f0: 2f 20 22 20 49 4e 54 22 2c 0a 20 20 20 20 20 20  / " INT",.      
c500: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f    /* SQLITE_AFF_
c510: 52 45 41 4c 20 20 20 20 2a 2f 20 22 20 52 45 41  REAL    */ " REA
c520: 4c 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  L".    };.    in
c530: 74 20 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74  t len;.    const
c540: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20   char *zType;.. 
c550: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
c560: 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b  ntf(n-k, &zStmt[
c570: 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b  k], zSep);.    k
c580: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
c590: 6e 33 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a  n30(&zStmt[k]);.
c5a0: 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32      zSep = zSep2
c5b0: 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a  ;.    identPut(z
c5c0: 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e  Stmt, &k, pCol->
c5d0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 61 73 73 65  zName);.    asse
c5e0: 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  rt( pCol->affini
c5f0: 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  ty-SQLITE_AFF_BL
c600: 4f 42 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61  OB >= 0 );.    a
c610: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66  ssert( pCol->aff
c620: 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46  inity-SQLITE_AFF
c630: 5f 42 4c 4f 42 20 3c 20 41 72 72 61 79 53 69 7a  _BLOB < ArraySiz
c640: 65 28 61 7a 54 79 70 65 29 20 29 3b 0a 20 20 20  e(azType) );.   
c650: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
c660: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
c670: 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20  E_AFF_BLOB );.  
c680: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
c690: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
c6a0: 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20  TE_AFF_TEXT );. 
c6b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f     testcase( pCo
c6c0: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
c6d0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
c6e0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c6f0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
c700: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45  =SQLITE_AFF_INTE
c710: 47 45 52 20 29 3b 0a 20 20 20 20 74 65 73 74 63  GER );.    testc
c720: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
c730: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
c740: 52 45 41 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20  REAL );.    .   
c750: 20 7a 54 79 70 65 20 3d 20 61 7a 54 79 70 65 5b   zType = azType[
c760: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d  pCol->affinity -
c770: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
c780: 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c  ];.    len = sql
c790: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79  ite3Strlen30(zTy
c7a0: 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pe);.    assert(
c7b0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
c7c0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  =SQLITE_AFF_BLOB
c7d0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c   .            ||
c7e0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
c7f0: 3d 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79  =sqlite3Affinity
c800: 54 79 70 65 28 7a 54 79 70 65 2c 20 30 29 20 29  Type(zType, 0) )
c810: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 53  ;.    memcpy(&zS
c820: 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c  tmt[k], zType, l
c830: 65 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c 65  en);.    k += le
c840: 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6b  n;.    assert( k
c850: 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  <=n );.  }.  sql
c860: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d  ite3_snprintf(n-
c870: 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25  k, &zStmt[k], "%
c880: 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74  s", zEnd);.  ret
c890: 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a  urn zStmt;.}../*
c8a0: 0a 2a 2a 20 52 65 73 69 7a 65 20 61 6e 20 49 6e  .** Resize an In
c8b0: 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 68 6f  dex object to ho
c8c0: 6c 64 20 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f 74  ld N columns tot
c8d0: 61 6c 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  al.  Return SQLI
c8e0: 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
c8f0: 65 73 73 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e  ess and SQLITE_N
c900: 4f 4d 45 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65  OMEM on an OOM e
c910: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
c920: 69 6e 74 20 72 65 73 69 7a 65 49 6e 64 65 78 4f  int resizeIndexO
c930: 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64  bject(sqlite3 *d
c940: 62 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  b, Index *pIdx, 
c950: 69 6e 74 20 4e 29 7b 0a 20 20 63 68 61 72 20 2a  int N){.  char *
c960: 7a 45 78 74 72 61 3b 0a 20 20 69 6e 74 20 6e 42  zExtra;.  int nB
c970: 79 74 65 3b 0a 20 20 69 66 28 20 70 49 64 78 2d  yte;.  if( pIdx-
c980: 3e 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65  >nColumn>=N ) re
c990: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c9a0: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
c9b0: 69 73 52 65 73 69 7a 65 64 3d 3d 30 20 29 3b 0a  isResized==0 );.
c9c0: 20 20 6e 42 79 74 65 20 3d 20 28 73 69 7a 65 6f    nByte = (sizeo
c9d0: 66 28 63 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f  f(char*) + sizeo
c9e0: 66 28 69 31 36 29 20 2b 20 31 29 2a 4e 3b 0a 20  f(i16) + 1)*N;. 
c9f0: 20 7a 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65   zExtra = sqlite
ca00: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
ca10: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  , nByte);.  if( 
ca20: 7a 45 78 74 72 61 3d 3d 30 20 29 20 72 65 74 75  zExtra==0 ) retu
ca30: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
ca40: 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61  .  memcpy(zExtra
ca50: 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 2c 20  , pIdx->azColl, 
ca60: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70 49  sizeof(char*)*pI
ca70: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  dx->nColumn);.  
ca80: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28  pIdx->azColl = (
ca90: 63 68 61 72 2a 2a 29 7a 45 78 74 72 61 3b 0a 20  char**)zExtra;. 
caa0: 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f   zExtra += sizeo
cab0: 66 28 63 68 61 72 2a 29 2a 4e 3b 0a 20 20 6d 65  f(char*)*N;.  me
cac0: 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64  mcpy(zExtra, pId
cad0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 73 69 7a  x->aiColumn, siz
cae0: 65 6f 66 28 69 31 36 29 2a 70 49 64 78 2d 3e 6e  eof(i16)*pIdx->n
caf0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d  Column);.  pIdx-
cb00: 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36  >aiColumn = (i16
cb10: 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74  *)zExtra;.  zExt
cb20: 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36  ra += sizeof(i16
cb30: 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45  )*N;.  memcpy(zE
cb40: 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 53 6f 72  xtra, pIdx->aSor
cb50: 74 4f 72 64 65 72 2c 20 70 49 64 78 2d 3e 6e 43  tOrder, pIdx->nC
cb60: 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e  olumn);.  pIdx->
cb70: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
cb80: 2a 29 7a 45 78 74 72 61 3b 0a 20 20 70 49 64 78  *)zExtra;.  pIdx
cb90: 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a 20  ->nColumn = N;. 
cba0: 20 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64   pIdx->isResized
cbb0: 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
cbc0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
cbd0: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
cbe0: 74 6f 74 61 6c 20 72 6f 77 20 77 69 64 74 68 20  total row width 
cbf0: 66 6f 72 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a  for a table..*/.
cc00: 73 74 61 74 69 63 20 76 6f 69 64 20 65 73 74 69  static void esti
cc10: 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68 28 54  mateTableWidth(T
cc20: 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 75  able *pTab){.  u
cc30: 6e 73 69 67 6e 65 64 20 77 54 61 62 6c 65 20 3d  nsigned wTable =
cc40: 20 30 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75   0;.  const Colu
cc50: 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 69  mn *pTabCol;.  i
cc60: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 54  nt i;.  for(i=pT
cc70: 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 43 6f  ab->nCol, pTabCo
cc80: 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3e  l=pTab->aCol; i>
cc90: 30 3b 20 69 2d 2d 2c 20 70 54 61 62 43 6f 6c 2b  0; i--, pTabCol+
cca0: 2b 29 7b 0a 20 20 20 20 77 54 61 62 6c 65 20 2b  +){.    wTable +
ccb0: 3d 20 70 54 61 62 43 6f 6c 2d 3e 73 7a 45 73 74  = pTabCol->szEst
ccc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62  ;.  }.  if( pTab
ccd0: 2d 3e 69 50 4b 65 79 3c 30 20 29 20 77 54 61 62  ->iPKey<0 ) wTab
cce0: 6c 65 2b 2b 3b 0a 20 20 70 54 61 62 2d 3e 73 7a  le++;.  pTab->sz
ccf0: 54 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  TabRow = sqlite3
cd00: 4c 6f 67 45 73 74 28 77 54 61 62 6c 65 2a 34 29  LogEst(wTable*4)
cd10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  ;.}../*.** Estim
cd20: 61 74 65 20 74 68 65 20 61 76 65 72 61 67 65 20  ate the average 
cd30: 73 69 7a 65 20 6f 66 20 61 20 72 6f 77 20 66 6f  size of a row fo
cd40: 72 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  r an index..*/.s
cd50: 74 61 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d  tatic void estim
cd60: 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 49 6e  ateIndexWidth(In
cd70: 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e  dex *pIdx){.  un
cd80: 73 69 67 6e 65 64 20 77 49 6e 64 65 78 20 3d 20  signed wIndex = 
cd90: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  0;.  int i;.  co
cda0: 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  nst Column *aCol
cdb0: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
cdc0: 3e 61 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30  >aCol;.  for(i=0
cdd0: 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; i<pIdx->nColum
cde0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 31 36  n; i++){.    i16
cdf0: 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   x = pIdx->aiCol
ce00: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65  umn[i];.    asse
ce10: 72 74 28 20 78 3c 70 49 64 78 2d 3e 70 54 61 62  rt( x<pIdx->pTab
ce20: 6c 65 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  le->nCol );.    
ce30: 77 49 6e 64 65 78 20 2b 3d 20 78 3c 30 20 3f 20  wIndex += x<0 ? 
ce40: 31 20 3a 20 61 43 6f 6c 5b 70 49 64 78 2d 3e 61  1 : aCol[pIdx->a
ce50: 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73  iColumn[i]].szEs
ce60: 74 3b 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e 73  t;.  }.  pIdx->s
ce70: 7a 49 64 78 52 6f 77 20 3d 20 73 71 6c 69 74 65  zIdxRow = sqlite
ce80: 33 4c 6f 67 45 73 74 28 77 49 6e 64 65 78 2a 34  3LogEst(wIndex*4
ce90: 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  );.}../* Return 
cea0: 74 72 75 65 20 69 66 20 76 61 6c 75 65 20 78 20  true if value x 
ceb0: 69 73 20 66 6f 75 6e 64 20 61 6e 79 20 6f 66 20  is found any of 
cec0: 74 68 65 20 66 69 72 73 74 20 6e 43 6f 6c 20 65  the first nCol e
ced0: 6e 74 72 69 65 73 20 6f 66 20 61 69 43 6f 6c 5b  ntries of aiCol[
cee0: 5d 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ].*/.static int 
cef0: 68 61 73 43 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20  hasColumn(const 
cf00: 69 31 36 20 2a 61 69 43 6f 6c 2c 20 69 6e 74 20  i16 *aiCol, int 
cf10: 6e 43 6f 6c 2c 20 69 6e 74 20 78 29 7b 0a 20 20  nCol, int x){.  
cf20: 77 68 69 6c 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20  while( nCol-- > 
cf30: 30 20 29 20 69 66 28 20 78 3d 3d 2a 28 61 69 43  0 ) if( x==*(aiC
cf40: 6f 6c 2b 2b 29 20 29 20 72 65 74 75 72 6e 20 31  ol++) ) return 1
cf50: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
cf60: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
cf70: 69 6e 65 20 72 75 6e 73 20 61 74 20 74 68 65 20  ine runs at the 
cf80: 65 6e 64 20 6f 66 20 70 61 72 73 69 6e 67 20 61  end of parsing a
cf90: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
cfa0: 61 74 65 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20  atement that.** 
cfb0: 68 61 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f  has a WITHOUT RO
cfc0: 57 49 44 20 63 6c 61 75 73 65 2e 20 20 54 68 65  WID clause.  The
cfd0: 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75   job of this rou
cfe0: 74 69 6e 65 20 69 73 20 74 6f 20 63 6f 6e 76 65  tine is to conve
cff0: 72 74 20 62 6f 74 68 0a 2a 2a 20 69 6e 74 65 72  rt both.** inter
d000: 6e 61 6c 20 73 63 68 65 6d 61 20 64 61 74 61 20  nal schema data 
d010: 73 74 72 75 63 74 75 72 65 73 20 61 6e 64 20 74  structures and t
d020: 68 65 20 67 65 6e 65 72 61 74 65 64 20 56 44 42  he generated VDB
d030: 45 20 63 6f 64 65 20 73 6f 20 74 68 61 74 20 74  E code so that t
d040: 68 65 79 0a 2a 2a 20 61 72 65 20 61 70 70 72 6f  hey.** are appro
d050: 70 72 69 61 74 65 20 66 6f 72 20 61 20 57 49 54  priate for a WIT
d060: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
d070: 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 72 6f   instead of a ro
d080: 77 69 64 20 74 61 62 6c 65 2e 0a 2a 2a 20 43 68  wid table..** Ch
d090: 61 6e 67 65 73 20 69 6e 63 6c 75 64 65 3a 0a 2a  anges include:.*
d0a0: 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 43 6f  *.**     (1)  Co
d0b0: 6e 76 65 72 74 20 74 68 65 20 4f 50 5f 43 72 65  nvert the OP_Cre
d0c0: 61 74 65 54 61 62 6c 65 20 69 6e 74 6f 20 61 6e  ateTable into an
d0d0: 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2e   OP_CreateIndex.
d0e0: 20 20 54 68 65 72 65 20 69 73 0a 2a 2a 20 20 20    There is.**   
d0f0: 20 20 20 20 20 20 20 6e 6f 20 72 6f 77 69 64 20         no rowid 
d100: 62 74 72 65 65 20 66 6f 72 20 61 20 57 49 54 48  btree for a WITH
d110: 4f 55 54 20 52 4f 57 49 44 2e 20 20 49 6e 73 74  OUT ROWID.  Inst
d120: 65 61 64 2c 20 74 68 65 20 63 61 6e 6f 6e 69 63  ead, the canonic
d130: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 64  al.**          d
d140: 61 74 61 20 73 74 6f 72 61 67 65 20 69 73 20 61  ata storage is a
d150: 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
d160: 62 74 72 65 65 2e 0a 2a 2a 20 20 20 20 20 28 32  btree..**     (2
d170: 29 20 20 42 79 70 61 73 73 20 74 68 65 20 63 72  )  Bypass the cr
d180: 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71  eation of the sq
d190: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
d1a0: 65 20 65 6e 74 72 79 0a 2a 2a 20 20 20 20 20 20  e entry.**      
d1b0: 20 20 20 20 66 6f 72 20 74 68 65 20 50 52 49 4d      for the PRIM
d1c0: 41 52 59 20 4b 45 59 20 61 73 20 74 68 65 20 70  ARY KEY as the p
d1d0: 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78  rimary key index
d1e0: 20 69 73 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20   is now.**      
d1f0: 20 20 20 20 69 64 65 6e 74 69 66 69 65 64 20 62      identified b
d200: 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  y the sqlite_mas
d210: 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72 79 20  ter table entry 
d220: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 74 73  of the table its
d230: 65 6c 66 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20  elf..**     (3) 
d240: 20 53 65 74 20 74 68 65 20 49 6e 64 65 78 2e 74   Set the Index.t
d250: 6e 75 6d 20 6f 66 20 74 68 65 20 50 52 49 4d 41  num of the PRIMA
d260: 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a  RY KEY Index obj
d270: 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20  ect in the.**   
d280: 20 20 20 20 20 20 20 73 63 68 65 6d 61 20 74 6f         schema to
d290: 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 72   the rootpage fr
d2a0: 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  om the main tabl
d2b0: 65 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 53  e..**     (4)  S
d2c0: 65 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  et all columns o
d2d0: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
d2e0: 59 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20  Y schema object 
d2f0: 74 6f 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a  to be NOT NULL..
d300: 2a 2a 20 20 20 20 20 28 35 29 20 20 41 64 64 20  **     (5)  Add 
d310: 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  all table column
d320: 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59  s to the PRIMARY
d330: 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63   KEY Index objec
d340: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f  t.**          so
d350: 20 74 68 61 74 20 74 68 65 20 50 52 49 4d 41 52   that the PRIMAR
d360: 59 20 4b 45 59 20 69 73 20 61 20 63 6f 76 65 72  Y KEY is a cover
d370: 69 6e 67 20 69 6e 64 65 78 2e 20 20 54 68 65 20  ing index.  The 
d380: 73 75 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20 20  surplus.**      
d390: 20 20 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20      columns are 
d3a0: 70 61 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f 2e  part of KeyInfo.
d3b0: 6e 58 46 69 65 6c 64 20 61 6e 64 20 61 72 65 20  nXField and are 
d3c0: 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  not used for.** 
d3d0: 20 20 20 20 20 20 20 20 20 73 6f 72 74 69 6e 67           sorting
d3e0: 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72 20 75 6e   or lookup or un
d3f0: 69 71 75 65 6e 65 73 73 20 63 68 65 63 6b 73 2e  iqueness checks.
d400: 0a 2a 2a 20 20 20 20 20 28 36 29 20 20 52 65 70  .**     (6)  Rep
d410: 6c 61 63 65 20 74 68 65 20 72 6f 77 69 64 20 74  lace the rowid t
d420: 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75 74 6f 6d  ail on all autom
d430: 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74  atically generat
d440: 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20 20 20 20  ed UNIQUE.**    
d450: 20 20 20 20 20 20 69 6e 64 69 63 65 73 20 77 69        indices wi
d460: 74 68 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  th the PRIMARY K
d470: 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73  EY columns..*/.s
d480: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 76 65  tatic void conve
d490: 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64  rtToWithoutRowid
d4a0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
d4b0: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
d4c0: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  ){.  Index *pIdx
d4d0: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b 0a  ;.  Index *pPk;.
d4e0: 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20 69 6e 74    int nPk;.  int
d4f0: 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33   i, j;.  sqlite3
d500: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d510: 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  b;.  Vdbe *v = p
d520: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20  Parse->pVdbe;.. 
d530: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
d540: 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 6f  OP_CreateTable o
d550: 70 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64  pcode that would
d560: 20 6e 6f 72 6d 61 6c 6c 79 20 63 72 65 61 74 65   normally create
d570: 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6f 74 2d 70   the.  ** root-p
d580: 61 67 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c  age for the tabl
d590: 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 43 72 65  e into an OP_Cre
d5a0: 61 74 65 49 6e 64 65 78 20 6f 70 63 6f 64 65 2e  ateIndex opcode.
d5b0: 20 20 54 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a    The index.  **
d5c0: 20 63 72 65 61 74 65 64 20 77 69 6c 6c 20 62 65   created will be
d5d0: 63 6f 6d 65 20 74 68 65 20 50 52 49 4d 41 52 59  come the PRIMARY
d5e0: 20 4b 45 59 20 69 6e 64 65 78 2e 0a 20 20 2a 2f   KEY index..  */
d5f0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61  .  if( pParse->a
d600: 64 64 72 43 72 54 61 62 20 29 7b 0a 20 20 20 20  ddrCrTab ){.    
d610: 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 20  assert( v );.   
d620: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
d630: 70 28 76 2c 20 70 50 61 72 73 65 2d 3e 61 64 64  p(v, pParse->add
d640: 72 43 72 54 61 62 29 2d 3e 6f 70 63 6f 64 65 20  rCrTab)->opcode 
d650: 3d 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78  = OP_CreateIndex
d660: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
d670: 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  te the PRIMARY K
d680: 45 59 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20 69  EY index.  Or, i
d690: 66 20 74 68 69 73 20 74 61 62 6c 65 20 77 61 73  f this table was
d6a0: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
d6b0: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
d6c0: 41 52 59 20 4b 45 59 20 74 61 62 6c 65 2c 20 63  ARY KEY table, c
d6d0: 72 65 61 74 65 20 61 20 6e 65 77 20 50 52 49 4d  reate a new PRIM
d6e0: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 0a  ARY KEY index. .
d6f0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d    */.  if( pTab-
d700: 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20  >iPKey>=0 ){.   
d710: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
d720: 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  ;.    pList = sq
d730: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
d740: 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30  end(pParse, 0, 0
d750: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
d760: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
d770: 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e    pList->a[0].zN
d780: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
d790: 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  trDup(pParse->db
d7a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7c0: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
d7d0: 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79  aCol[pTab->iPKey
d7e0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c  ].zName);.    pL
d7f0: 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72  ist->a[0].sortOr
d800: 64 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 69 50  der = pParse->iP
d810: 6b 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  kSortOrder;.    
d820: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
d830: 70 4e 65 77 54 61 62 6c 65 3d 3d 70 54 61 62 20  pNewTable==pTab 
d840: 29 3b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c  );.    pPk = sql
d850: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
d860: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c  pParse, 0, 0, 0,
d870: 20 70 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b 65   pList, pTab->ke
d880: 79 43 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c 20  yConf, 0, 0, 0, 
d890: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 50 6b 3d  0);.    if( pPk=
d8a0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
d8b0: 20 70 50 6b 2d 3e 69 64 78 54 79 70 65 20 3d 20   pPk->idxType = 
d8c0: 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50  SQLITE_IDXTYPE_P
d8d0: 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20 20 20 70  RIMARYKEY;.    p
d8e0: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
d8f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
d900: 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
d910: 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
d920: 3b 0a 0a 20 20 20 20 2f 2a 20 42 79 70 61 73 73  ;..    /* Bypass
d930: 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66   the creation of
d940: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
d950: 20 62 74 72 65 65 20 61 6e 64 20 74 68 65 20 73   btree and the s
d960: 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 20  qlite_master.   
d970: 20 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e   ** table entry.
d980: 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 72 65   This is only re
d990: 71 75 69 72 65 64 20 69 66 20 63 75 72 72 65 6e  quired if curren
d9a0: 74 6c 79 20 67 65 6e 65 72 61 74 69 6e 67 20 56  tly generating V
d9b0: 44 42 45 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20  DBE.    ** code 
d9c0: 66 6f 72 20 61 20 43 52 45 41 54 45 20 54 41 42  for a CREATE TAB
d9d0: 4c 45 20 28 6e 6f 74 20 77 68 65 6e 20 70 61 72  LE (not when par
d9e0: 73 69 6e 67 20 6f 6e 65 20 61 73 20 70 61 72 74  sing one as part
d9f0: 20 6f 66 20 72 65 61 64 69 6e 67 0a 20 20 20 20   of reading.    
da00: 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 73 63  ** a database sc
da10: 68 65 6d 61 29 2e 20 20 2a 2f 0a 20 20 20 20 69  hema).  */.    i
da20: 66 28 20 76 20 29 7b 0a 20 20 20 20 20 20 61 73  f( v ){.      as
da30: 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62  sert( db->init.b
da40: 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  usy==0 );.      
da50: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
da60: 28 76 2c 20 70 50 6b 2d 3e 74 6e 75 6d 29 2d 3e  (v, pPk->tnum)->
da70: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 47 6f 74 6f  opcode = OP_Goto
da80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
da90: 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 61 6c      ** Remove al
daa0: 6c 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75  l redundant colu
dab0: 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 50 52 49  mns from the PRI
dac0: 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72 20 65  MARY KEY.  For e
dad0: 78 61 6d 70 6c 65 2c 20 63 68 61 6e 67 65 0a 20  xample, change. 
dae0: 20 20 20 2a 2a 20 22 50 52 49 4d 41 52 59 20 4b     ** "PRIMARY K
daf0: 45 59 28 61 2c 62 2c 61 2c 62 2c 63 2c 62 2c 63  EY(a,b,a,b,c,b,c
db00: 2c 64 29 22 20 69 6e 74 6f 20 6a 75 73 74 20 22  ,d)" into just "
db10: 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c  PRIMARY KEY(a,b,
db20: 63 2c 64 29 22 2e 20 20 4c 61 74 65 72 0a 20 20  c,d)".  Later.  
db30: 20 20 2a 2a 20 63 6f 64 65 20 61 73 73 75 6d 65    ** code assume
db40: 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  s the PRIMARY KE
db50: 59 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 65  Y contains no re
db60: 70 65 61 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a  peated columns..
db70: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
db80: 3d 6a 3d 31 3b 20 69 3c 70 50 6b 2d 3e 6e 4b 65  =j=1; i<pPk->nKe
db90: 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
dba0: 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28    if( hasColumn(
dbb0: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a  pPk->aiColumn, j
dbc0: 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  , pPk->aiColumn[
dbd0: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  i]) ){.        p
dbe0: 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 0a 20  Pk->nColumn--;. 
dbf0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
dc00: 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d      pPk->aiColum
dc10: 6e 5b 6a 2b 2b 5d 20 3d 20 70 50 6b 2d 3e 61 69  n[j++] = pPk->ai
dc20: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
dc30: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 6b   }.    }.    pPk
dc40: 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6a 3b 0a 20  ->nKeyCol = j;. 
dc50: 20 7d 0a 20 20 70 50 6b 2d 3e 69 73 43 6f 76 65   }.  pPk->isCove
dc60: 72 69 6e 67 20 3d 20 31 3b 0a 20 20 61 73 73 65  ring = 1;.  asse
dc70: 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20  rt( pPk!=0 );.  
dc80: 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43  nPk = pPk->nKeyC
dc90: 6f 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  ol;..  /* Make s
dca0: 75 72 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e  ure every column
dcb0: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
dcc0: 4b 45 59 20 69 73 20 4e 4f 54 20 4e 55 4c 4c 2e  KEY is NOT NULL.
dcd0: 20 20 28 45 78 63 65 70 74 2c 0a 20 20 2a 2a 20    (Except,.  ** 
dce0: 64 6f 20 6e 6f 74 20 65 6e 66 6f 72 63 65 20 74  do not enforce t
dcf0: 68 69 73 20 66 6f 72 20 69 6d 70 6f 73 74 65 72  his for imposter
dd00: 20 74 61 62 6c 65 73 2e 29 20 2a 2f 0a 20 20 69   tables.) */.  i
dd10: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 69 6d 70  f( !db->init.imp
dd20: 6f 73 74 65 72 54 61 62 6c 65 20 29 7b 0a 20 20  osterTable ){.  
dd30: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b    for(i=0; i<nPk
dd40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 54  ; i++){.      pT
dd50: 61 62 2d 3e 61 43 6f 6c 5b 70 50 6b 2d 3e 61 69  ab->aCol[pPk->ai
dd60: 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75  Column[i]].notNu
dd70: 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ll = 1;.    }.  
dd80: 20 20 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e 75    pPk->uniqNotNu
dd90: 6c 6c 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  ll = 1;.  }..  /
dda0: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
ddb0: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
ddc0: 45 59 20 69 73 20 74 68 65 20 74 61 62 6c 65 20  EY is the table 
ddd0: 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20 70  root page */.  p
dde0: 50 6b 2d 3e 74 6e 75 6d 20 3d 20 70 54 61 62 2d  Pk->tnum = pTab-
ddf0: 3e 74 6e 75 6d 3b 0a 0a 20 20 2f 2a 20 55 70 64  >tnum;..  /* Upd
de00: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
de10: 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
de20: 20 6f 66 20 61 6c 6c 20 55 4e 49 51 55 45 20 69   of all UNIQUE i
de30: 6e 64 69 63 65 73 20 62 79 20 63 6f 6e 76 65 72  ndices by conver
de40: 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 69  ting.  ** the fi
de50: 6e 61 6c 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e  nal rowid column
de60: 20 69 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72   into one or mor
de70: 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
de80: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 20 20   PRIMARY KEY..  
de90: 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54  */.  for(pIdx=pT
dea0: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
deb0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
dec0: 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  xt){.    int n;.
ded0: 20 20 20 20 69 66 28 20 49 73 50 72 69 6d 61 72      if( IsPrimar
dee0: 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20  yKeyIndex(pIdx) 
def0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
df00: 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 6e 50 6b  for(i=n=0; i<nPk
df10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
df20: 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64  ( !hasColumn(pId
df30: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64  x->aiColumn, pId
df40: 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d  x->nKeyCol, pPk-
df50: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 20  >aiColumn[i]) ) 
df60: 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n++;.    }.    i
df70: 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
df80: 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69   /* This index i
df90: 73 20 61 20 73 75 70 65 72 73 65 74 20 6f 66 20  s a superset of 
dfa0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
dfb0: 2a 2f 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 6e  */.      pIdx->n
dfc0: 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 6e  Column = pIdx->n
dfd0: 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 63 6f  KeyCol;.      co
dfe0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
dff0: 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65    if( resizeInde
e000: 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 49 64 78  xObject(db, pIdx
e010: 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b  , pIdx->nKeyCol+
e020: 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  n) ) return;.   
e030: 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 49 64 78   for(i=0, j=pIdx
e040: 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b  ->nKeyCol; i<nPk
e050: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
e060: 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64  ( !hasColumn(pId
e070: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64  x->aiColumn, pId
e080: 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d  x->nKeyCol, pPk-
e090: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b  >aiColumn[i]) ){
e0a0: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
e0b0: 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 50 6b  iColumn[j] = pPk
e0c0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
e0d0: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
e0e0: 6f 6c 6c 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a  oll[j] = pPk->az
e0f0: 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Coll[i];.       
e100: 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   j++;.      }.  
e110: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
e120: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70  pIdx->nColumn>=p
e130: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 20 29  Idx->nKeyCol+n )
e140: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
e150: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  dx->nColumn>=j )
e160: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  ;.  }..  /* Add 
e170: 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  all table column
e180: 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59  s to the PRIMARY
e190: 20 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a 2f 0a   KEY index.  */.
e1a0: 20 20 69 66 28 20 6e 50 6b 3c 70 54 61 62 2d 3e    if( nPk<pTab->
e1b0: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  nCol ){.    if( 
e1c0: 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63  resizeIndexObjec
e1d0: 74 28 64 62 2c 20 70 50 6b 2c 20 70 54 61 62 2d  t(db, pPk, pTab-
e1e0: 3e 6e 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 3b  >nCol) ) return;
e1f0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d  .    for(i=0, j=
e200: 6e 50 6b 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  nPk; i<pTab->nCo
e210: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
e220: 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 50  f( !hasColumn(pP
e230: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20  k->aiColumn, j, 
e240: 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  i) ){.        as
e250: 73 65 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f  sert( j<pPk->nCo
e260: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  lumn );.        
e270: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  pPk->aiColumn[j]
e280: 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 50   = i;.        pP
e290: 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 22  k->azColl[j] = "
e2a0: 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20  BINARY";.       
e2b0: 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   j++;.      }.  
e2c0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
e2d0: 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20  pPk->nColumn==j 
e2e0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
e2f0: 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a  Tab->nCol==j );.
e300: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b    }else{.    pPk
e310: 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62  ->nColumn = pTab
e320: 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ->nCol;.  }.}../
e330: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
e340: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  e is called to r
e350: 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20  eport the final 
e360: 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61  ")" that termina
e370: 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20  tes.** a CREATE 
e380: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
e390: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  .**.** The table
e3a0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
e3b0: 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75  other action rou
e3c0: 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20  tines have been 
e3d0: 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61  building.** is a
e3e0: 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65  dded to the inte
e3f0: 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73  rnal hash tables
e400: 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72  , assuming no er
e410: 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63  rors have.** occ
e420: 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  urred..**.** An 
e430: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61  entry for the ta
e440: 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74  ble is made in t
e450: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
e460: 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a  on disk, unless.
e470: 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  ** this is a tem
e480: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20  porary table or 
e490: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
e4a0: 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74  .  When db->init
e4b0: 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d  .busy==1.** it m
e4c0: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
e4d0: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ing the sqlite_m
e4e0: 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61  aster table beca
e4f0: 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63  use we just.** c
e500: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20  onnected to the 
e510: 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61  database or beca
e520: 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  use the sqlite_m
e530: 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a  aster table has.
e540: 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e  ** recently chan
e550: 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74 72  ged, so the entr
e560: 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65  y for this table
e570: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
e580: 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  in.** the sqlite
e590: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20  _master table.  
e5a0: 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  We do not want t
e5b0: 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69  o create it agai
e5c0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
e5d0: 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74  pSelect argument
e5e0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74   is not NULL, it
e5f0: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
e600: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20   routine.** was 
e610: 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
e620: 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74   a table generat
e630: 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43  ed from a .** "C
e640: 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20  REATE TABLE ... 
e650: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73  AS SELECT ..." s
e660: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63  tatement.  The c
e670: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a  olumn names of.*
e680: 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * the new table 
e690: 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72  will match the r
e6a0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
e6b0: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64   SELECT..*/.void
e6c0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
e6d0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e6e0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
e6f0: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
e700: 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20    Token *pCons, 
e710: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
e720: 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72   ',' token after
e730: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
e740: 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65   defn. */.  Toke
e750: 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20  n *pEnd,        
e760: 20 20 20 20 2f 2a 20 54 68 65 20 27 29 27 20 62      /* The ')' b
e770: 65 66 6f 72 65 20 6f 70 74 69 6f 6e 73 20 69 6e  efore options in
e780: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
e790: 45 20 2a 2f 0a 20 20 75 38 20 74 61 62 4f 70 74  E */.  u8 tabOpt
e7a0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
e7b0: 2a 20 45 78 74 72 61 20 74 61 62 6c 65 20 6f 70  * Extra table op
e7c0: 74 69 6f 6e 73 2e 20 55 73 75 61 6c 6c 79 20 30  tions. Usually 0
e7d0: 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  . */.  Select *p
e7e0: 53 65 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f  Select         /
e7f0: 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20  * Select from a 
e800: 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53  "CREATE ... AS S
e810: 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54  ELECT" */.){.  T
e820: 61 62 6c 65 20 2a 70 3b 20 20 20 20 20 20 20 20  able *p;        
e830: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
e840: 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  new table */.  s
e850: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
e860: 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20  rse->db; /* The 
e870: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
e880: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ion */.  int iDb
e890: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e8a0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69     /* Database i
e8b0: 6e 20 77 68 69 63 68 20 74 68 65 20 74 61 62 6c  n which the tabl
e8c0: 65 20 6c 69 76 65 73 20 2a 2f 0a 20 20 49 6e 64  e lives */.  Ind
e8d0: 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
e8e0: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6d 70         /* An imp
e8f0: 6c 69 65 64 20 69 6e 64 65 78 20 6f 66 20 74 68  lied index of th
e900: 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66  e table */..  if
e910: 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70 53  ( (pEnd==0 && pS
e920: 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 64 62 2d  elect==0) || db-
e930: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
e940: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
e950: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
e960: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
e970: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  p==0 ) return;..
e980: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69    assert( !db->i
e990: 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70 53 65  nit.busy || !pSe
e9a0: 6c 65 63 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  lect );..  /* If
e9b0: 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   the db->init.bu
e9c0: 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73  sy is 1 it means
e9d0: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
e9e0: 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a  the SQL off the.
e9f0: 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73    ** "sqlite_mas
ea00: 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f  ter" or "sqlite_
ea10: 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62  temp_master" tab
ea20: 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a  le on the disk..
ea30: 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77    ** So do not w
ea40: 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b  rite to the disk
ea50: 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74   again.  Extract
ea60: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
ea70: 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  umber.  ** for t
ea80: 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
ea90: 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  e db->init.newTn
eaa0: 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20  um field.  (The 
eab0: 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
eac0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
ead0: 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74  n put there by t
eae0: 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20  he sqliteOpenCb 
eaf0: 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20  routine.).  */. 
eb00: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
eb10: 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75  sy ){.    p->tnu
eb20: 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  m = db->init.new
eb30: 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Tnum;.  }..  /* 
eb40: 53 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73 69  Special processi
eb50: 6e 67 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52  ng for WITHOUT R
eb60: 4f 57 49 44 20 54 61 62 6c 65 73 20 2a 2f 0a 20  OWID Tables */. 
eb70: 20 69 66 28 20 74 61 62 4f 70 74 73 20 26 20 54   if( tabOpts & T
eb80: 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20 29  F_WithoutRowid )
eb90: 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61  {.    if( (p->ta
eba0: 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
ebb0: 69 6e 63 72 65 6d 65 6e 74 29 20 29 7b 0a 20 20  increment) ){.  
ebc0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
ebd0: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
ebe0: 20 20 20 20 20 20 22 41 55 54 4f 49 4e 43 52 45        "AUTOINCRE
ebf0: 4d 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  MENT not allowed
ec00: 20 6f 6e 20 57 49 54 48 4f 55 54 20 52 4f 57 49   on WITHOUT ROWI
ec10: 44 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20  D tables");.    
ec20: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
ec30: 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46      if( (p->tabF
ec40: 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69  lags & TF_HasPri
ec50: 6d 61 72 79 4b 65 79 29 3d 3d 30 20 29 7b 0a 20  maryKey)==0 ){. 
ec60: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
ec70: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 50 52  rMsg(pParse, "PR
ec80: 49 4d 41 52 59 20 4b 45 59 20 6d 69 73 73 69 6e  IMARY KEY missin
ec90: 67 20 6f 6e 20 74 61 62 6c 65 20 25 73 22 2c 20  g on table %s", 
eca0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  p->zName);.    }
ecb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 74  else{.      p->t
ecc0: 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 57 69  abFlags |= TF_Wi
ecd0: 74 68 6f 75 74 52 6f 77 69 64 20 7c 20 54 46 5f  thoutRowid | TF_
ece0: 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a  NoVisibleRowid;.
ecf0: 20 20 20 20 20 20 63 6f 6e 76 65 72 74 54 6f 57        convertToW
ed00: 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65  ithoutRowidTable
ed10: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
ed20: 20 7d 0a 20 20 7d 0a 0a 20 20 69 44 62 20 3d 20   }.  }..  iDb = 
ed30: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
ed40: 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68  ndex(db, p->pSch
ed50: 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ema);..#ifndef S
ed60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
ed70: 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61  .  /* Resolve na
ed80: 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b  mes in all CHECK
ed90: 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 70 72   constraint expr
eda0: 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  essions..  */.  
edb0: 69 66 28 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b  if( p->pCheck ){
edc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f  .    sqlite3Reso
edd0: 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65  lveSelfReference
ede0: 28 70 50 61 72 73 65 2c 20 70 2c 20 4e 43 5f 49  (pParse, p, NC_I
edf0: 73 43 68 65 63 6b 2c 20 30 2c 20 70 2d 3e 70 43  sCheck, 0, p->pC
ee00: 68 65 63 6b 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  heck);.  }.#endi
ee10: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
ee20: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29  LITE_OMIT_CHECK)
ee30: 20 2a 2f 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61   */..  /* Estima
ee40: 74 65 20 74 68 65 20 61 76 65 72 61 67 65 20 72  te the average r
ee50: 6f 77 20 73 69 7a 65 20 66 6f 72 20 74 68 65 20  ow size for the 
ee60: 74 61 62 6c 65 20 61 6e 64 20 66 6f 72 20 61 6c  table and for al
ee70: 6c 20 69 6d 70 6c 69 65 64 20 69 6e 64 69 63 65  l implied indice
ee80: 73 20 2a 2f 0a 20 20 65 73 74 69 6d 61 74 65 54  s */.  estimateT
ee90: 61 62 6c 65 57 69 64 74 68 28 70 29 3b 0a 20 20  ableWidth(p);.  
eea0: 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64  for(pIdx=p->pInd
eeb0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
eec0: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
eed0: 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69   estimateIndexWi
eee0: 64 74 68 28 70 49 64 78 29 3b 0a 20 20 7d 0a 0a  dth(pIdx);.  }..
eef0: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74    /* If not init
ef00: 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63  ializing, then c
ef10: 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 66  reate a record f
ef20: 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
ef30: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c  .  ** in the SQL
ef40: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
ef50: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
ef60: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
ef70: 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41  his is a TEMPORA
ef80: 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20  RY table, write 
ef90: 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74  the entry into t
efa0: 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  he auxiliary.  *
efb0: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
efc0: 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  f into the main 
efd0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
efe0: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
eff0: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
f000: 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20  int n;.    Vdbe 
f010: 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  *v;.    char *zT
f020: 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77  ype;    /* "view
f030: 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a  " or "table" */.
f040: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32      char *zType2
f050: 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72  ;   /* "VIEW" or
f060: 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20   "TABLE" */.    
f070: 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20  char *zStmt;    
f080: 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 43  /* Text of the C
f090: 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43  REATE TABLE or C
f0a0: 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65  REATE VIEW state
f0b0: 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d  ment */..    v =
f0c0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
f0d0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
f0e0: 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
f0f0: 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69  eturn;..    sqli
f100: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
f110: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a   OP_Close, 0);..
f120: 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20 49      /* .    ** I
f130: 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20  nitialize zType 
f140: 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69 65 77  for the new view
f150: 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a   or table..    *
f160: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65  /.    if( p->pSe
f170: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lect==0 ){.     
f180: 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61   /* A regular ta
f190: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79  ble */.      zTy
f1a0: 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20  pe = "table";.  
f1b0: 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41      zType2 = "TA
f1c0: 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51  BLE";.#ifndef SQ
f1d0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
f1e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f1f0: 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20  /* A view */.   
f200: 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77     zType = "view
f210: 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20  ";.      zType2 
f220: 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66  = "VIEW";.#endif
f230: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
f240: 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45 41  f this is a CREA
f250: 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20 53  TE TABLE xx AS S
f260: 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75  ELECT ..., execu
f270: 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  te the SELECT.  
f280: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
f290: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e  o populate the n
f2a0: 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f  ew table. The ro
f2b0: 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66  ot-page number f
f2c0: 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65  or the.    ** ne
f2d0: 77 20 74 61 62 6c 65 20 69 73 20 69 6e 20 72 65  w table is in re
f2e0: 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72  gister pParse->r
f2f0: 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20  egRoot..    **. 
f300: 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53     ** Once the S
f310: 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20 63  ELECT has been c
f320: 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33 53  oded by sqlite3S
f330: 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20 69  elect(), it is i
f340: 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61  n a.    ** suita
f350: 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75 65  ble state to que
f360: 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
f370: 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65  n names and type
f380: 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20  s to be used.   
f390: 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74   ** by the new t
f3a0: 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  able..    **.   
f3b0: 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61 63   ** A shared-cac
f3c0: 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73  he write-lock is
f3d0: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f   not required to
f3e0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e 65   write to the ne
f3f0: 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20  w table,.    ** 
f400: 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b  as a schema-lock
f410: 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61   must have alrea
f420: 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  dy been obtained
f430: 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20 53   to create it. S
f440: 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73 63  ince.    ** a sc
f450: 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64  hema-lock exclud
f460: 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61 74  es all other dat
f470: 61 62 61 73 65 20 75 73 65 72 73 2c 20 74 68 65  abase users, the
f480: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c   write-lock woul
f490: 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64 75  d.    ** be redu
f4a0: 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ndant..    */.  
f4b0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
f4c0: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
f4d0: 74 20 64 65 73 74 3b 20 20 20 20 2f 2a 20 57 68  t dest;    /* Wh
f4e0: 65 72 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ere the SELECT s
f4f0: 68 6f 75 6c 64 20 73 74 6f 72 65 20 72 65 73 75  hould store resu
f500: 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  lts */.      int
f510: 20 72 65 67 59 69 65 6c 64 3b 20 20 20 20 20 20   regYield;      
f520: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
f530: 64 69 6e 67 20 63 6f 2d 72 6f 75 74 69 6e 65 20  ding co-routine 
f540: 65 6e 74 72 79 2d 70 6f 69 6e 74 20 2a 2f 0a 20  entry-point */. 
f550: 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70       int addrTop
f560: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20  ;        /* Top 
f570: 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  of the co-routin
f580: 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  e */.      int r
f590: 65 67 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f  egRec;         /
f5a0: 2a 20 41 20 72 65 63 6f 72 64 20 74 6f 20 62 65  * A record to be
f5b0: 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 68 65   insert into the
f5c0: 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20   new table */.  
f5d0: 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64      int regRowid
f5e0: 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64  ;       /* Rowid
f5f0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 72 6f 77   of the next row
f600: 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20   to insert */.  
f610: 20 20 20 20 69 6e 74 20 61 64 64 72 49 6e 73 4c      int addrInsL
f620: 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 6f 70 20 6f  oop;    /* Top o
f630: 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 69  f the loop for i
f640: 6e 73 65 72 74 69 6e 67 20 72 6f 77 73 20 2a 2f  nserting rows */
f650: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53  .      Table *pS
f660: 65 6c 54 61 62 3b 20 20 20 20 20 2f 2a 20 41 20  elTab;     /* A 
f670: 74 61 62 6c 65 20 74 68 61 74 20 64 65 73 63 72  table that descr
f680: 69 62 65 73 20 74 68 65 20 53 45 4c 45 43 54 20  ibes the SELECT 
f690: 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 20 20  results */..    
f6a0: 20 20 72 65 67 59 69 65 6c 64 20 3d 20 2b 2b 70    regYield = ++p
f6b0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
f6c0: 20 20 20 72 65 67 52 65 63 20 3d 20 2b 2b 70 50     regRec = ++pP
f6d0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
f6e0: 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70    regRowid = ++p
f6f0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
f700: 20 20 20 61 73 73 65 72 74 28 70 50 61 72 73 65     assert(pParse
f710: 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20  ->nTab==1);.    
f720: 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
f730: 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  t(pParse);.     
f740: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f750: 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  p3(v, OP_OpenWri
f760: 74 65 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 72  te, 1, pParse->r
f770: 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20  egRoot, iDb);.  
f780: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
f790: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
f7a0: 47 5f 50 32 49 53 52 45 47 29 3b 0a 20 20 20 20  G_P2ISREG);.    
f7b0: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
f7c0: 20 32 3b 0a 20 20 20 20 20 20 61 64 64 72 54 6f   2;.      addrTo
f7d0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
f7e0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
f7f0: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
f800: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
f810: 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
f820: 72 65 67 59 69 65 6c 64 2c 20 30 2c 20 61 64 64  regYield, 0, add
f830: 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  rTop);.      sql
f840: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
f850: 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f  it(&dest, SRT_Co
f860: 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c  routine, regYiel
f870: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
f880: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
f890: 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 3b  pSelect, &dest);
f8a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f8b0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45  beAddOp1(v, OP_E
f8c0: 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  ndCoroutine, reg
f8d0: 59 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 73 71  Yield);.      sq
f8e0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
f8f0: 65 28 76 2c 20 61 64 64 72 54 6f 70 20 2d 20 31  e(v, addrTop - 1
f900: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
f910: 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
f920: 72 6e 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61  rn;.      pSelTa
f930: 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
f940: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
f950: 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  rse, pSelect);. 
f960: 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62       if( pSelTab
f970: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
f980: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
f990: 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Col==0 );.      
f9a0: 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->nCol = pSelTa
f9b0: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70  b->nCol;.      p
f9c0: 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->aCol = pSelTab
f9d0: 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53  ->aCol;.      pS
f9e0: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  elTab->nCol = 0;
f9f0: 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  .      pSelTab->
fa00: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  aCol = 0;.      
fa10: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
fa20: 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b  le(db, pSelTab);
fa30: 0a 20 20 20 20 20 20 61 64 64 72 49 6e 73 4c 6f  .      addrInsLo
fa40: 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
fa50: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
fa60: 6c 64 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d  ld, dest.iSDParm
fa70: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
fa80: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
fa90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
faa0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
fab0: 72 64 2c 20 64 65 73 74 2e 69 53 64 73 74 2c 20  rd, dest.iSdst, 
fac0: 64 65 73 74 2e 6e 53 64 73 74 2c 20 72 65 67 52  dest.nSdst, regR
fad0: 65 63 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ec);.      sqlit
fae0: 65 33 54 61 62 6c 65 41 66 66 69 6e 69 74 79 28  e3TableAffinity(
faf0: 76 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20  v, p, 0);.      
fb00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fb10: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
fb20: 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  , 1, regRowid);.
fb30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fb40: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
fb50: 73 65 72 74 2c 20 31 2c 20 72 65 67 52 65 63 2c  sert, 1, regRec,
fb60: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
fb70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fb80: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
fb90: 30 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b  0, addrInsLoop);
fba0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fbb0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
fbc0: 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20  drInsLoop);.    
fbd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fbe0: 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
fbf0: 20 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   1);.    }..    
fc00: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
fc10: 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
fc20: 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65  the CREATE state
fc30: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20  ment */.    if( 
fc40: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
fc50: 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54   zStmt = createT
fc60: 61 62 6c 65 53 74 6d 74 28 64 62 2c 20 70 29 3b  ableStmt(db, p);
fc70: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
fc80: 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 32 20 3d    Token *pEnd2 =
fc90: 20 74 61 62 4f 70 74 73 20 3f 20 26 70 50 61 72   tabOpts ? &pPar
fca0: 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 20 3a  se->sLastToken :
fcb0: 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 6e 20 3d   pEnd;.      n =
fcc0: 20 28 69 6e 74 29 28 70 45 6e 64 32 2d 3e 7a 20   (int)(pEnd2->z 
fcd0: 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  - pParse->sNameT
fce0: 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 69  oken.z);.      i
fcf0: 66 28 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d 21 3d  f( pEnd2->z[0]!=
fd00: 27 3b 27 20 29 20 6e 20 2b 3d 20 70 45 6e 64 32  ';' ) n += pEnd2
fd10: 2d 3e 6e 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74  ->n;.      zStmt
fd20: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
fd30: 66 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20  f(db, .         
fd40: 20 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73   "CREATE %s %.*s
fd50: 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50  ", zType2, n, pP
fd60: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
fd70: 2e 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .z.      );.    
fd80: 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74  }..    /* A slot
fd90: 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20   for the record 
fda0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
fdb0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68   allocated in th
fdc0: 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  e .    ** SQLITE
fdd0: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
fde0: 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20  We just need to 
fdf0: 75 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74  update that slot
fe00: 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a   with all.    **
fe10: 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
fe20: 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64   we've collected
fe30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
fe40: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
fe50: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55  pParse,.      "U
fe60: 50 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20  PDATE %Q.%s ".  
fe70: 20 20 20 20 20 20 20 22 53 45 54 20 74 79 70 65         "SET type
fe80: 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20  ='%s', name=%Q, 
fe90: 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f  tbl_name=%Q, roo
fea0: 74 70 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25  tpage=#%d, sql=%
feb0: 51 20 22 0a 20 20 20 20 20 20 20 22 57 48 45 52  Q ".       "WHER
fec0: 45 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20  E rowid=#%d",.  
fed0: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
fee0: 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
fef0: 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20  ABLE(iDb),.     
ff00: 20 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d   zType,.      p-
ff10: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d  >zName,.      p-
ff20: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 50  >zName,.      pP
ff30: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20  arse->regRoot,. 
ff40: 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20       zStmt,.    
ff50: 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77    pParse->regRow
ff60: 69 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  id.    );.    sq
ff70: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
ff80: 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69  zStmt);.    sqli
ff90: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
ffa0: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23  pParse, iDb);..#
ffb0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ffc0: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
ffd0: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
ffe0: 20 73 65 65 20 69 66 20 77 65 20 6e 65 65 64 20   see if we need 
fff0: 74 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c  to create an sql
10000 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
10010 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65  le for.    ** ke
10020 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61  eping track of a
10030 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79  utoincrement key
10040 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
10050 28 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  ( p->tabFlags & 
10060 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
10070 20 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70 44   ){.      Db *pD
10080 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
10090 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
100a0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
100b0 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
100c0 20 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28   0) );.      if(
100d0 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70   pDb->pSchema->p
100e0 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  SeqTab==0 ){.   
100f0 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74       sqlite3Nest
10100 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
10110 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
10120 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74  E TABLE %Q.sqlit
10130 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c  e_sequence(name,
10140 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20  seq)",.         
10150 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20   pDb->zName.    
10160 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
10170 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
10180 20 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65 72   /* Reparse ever
10190 79 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65  ything to update
101a0 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61   our internal da
101b0 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f  ta structures */
101c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
101d0 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70  AddParseSchemaOp
101e0 28 76 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20  (v, iDb,.       
101f0 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
10200 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65  tf(db, "tbl_name
10210 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65 21 3d  ='%q' AND type!=
10220 27 74 72 69 67 67 65 72 27 22 2c 20 70 2d 3e 7a  'trigger'", p->z
10230 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20  Name));.  }...  
10240 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65  /* Add the table
10250 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   to the in-memor
10260 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
10270 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
10280 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
10290 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
102a0 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20    Table *pOld;. 
102b0 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65     Schema *pSche
102c0 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b  ma = p->pSchema;
102d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
102e0 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
102f0 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
10300 29 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71  );.    pOld = sq
10310 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
10320 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  &pSchema->tblHas
10330 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70 29 3b  h, p->zName, p);
10340 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b  .    if( pOld ){
10350 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10360 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61  ==pOld );  /* Ma
10370 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
10380 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73  ailed inside Has
10390 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20  hInsert() */.   
103a0 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
103b0 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  led = 1;.      r
103c0 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
103d0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
103e0 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  le = 0;.    db->
103f0 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
10400 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a  InternChanges;..
10410 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10420 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20  MIT_ALTERTABLE. 
10430 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65     if( !p->pSele
10440 63 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ct ){.      cons
10450 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
10460 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50  (const char *)pP
10470 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
10480 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e  .z;.      int nN
10490 61 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ame;.      asser
104a0 74 28 20 21 70 53 65 6c 65 63 74 20 26 26 20 70  t( !pSelect && p
104b0 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a  Cons && pEnd );.
104c0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d        if( pCons-
104d0 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >z==0 ){.       
104e0 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20   pCons = pEnd;. 
104f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61       }.      nNa
10500 6d 65 20 3d 20 28 69 6e 74 29 28 28 63 6f 6e 73  me = (int)((cons
10510 74 20 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e  t char *)pCons->
10520 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  z - zName);.    
10530 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65    p->addColOffse
10540 74 20 3d 20 31 33 20 2b 20 73 71 6c 69 74 65 33  t = 13 + sqlite3
10550 55 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d  Utf8CharLen(zNam
10560 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e, nName);.    }
10570 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23  .#endif.  }.}..#
10580 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10590 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68  IT_VIEW./*.** Th
105a0 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
105b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f  his routine in o
105c0 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 61  rder to create a
105d0 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69   new VIEW.*/.voi
105e0 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 56  d sqlite3CreateV
105f0 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50  iew(.  Parse *pP
10600 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65  arse,     /* The
10610 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
10620 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65   */.  Token *pBe
10630 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  gin,     /* The 
10640 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
10650 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74 61  t begins the sta
10660 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65  tement */.  Toke
10670 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f  n *pName1,     /
10680 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
10690 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
106a0 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
106b0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
106c0 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
106d0 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
106e0 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
106f0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
10700 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45  elect,   /* A SE
10710 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
10720 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
10730 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a  the new view */.
10740 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20    int isTemp,   
10750 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72       /* TRUE for
10760 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65   a TEMPORARY vie
10770 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72  w */.  int noErr
10780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 70            /* Sup
10790 70 72 65 73 73 20 65 72 72 6f 72 20 6d 65 73 73  press error mess
107a0 61 67 65 73 20 69 66 20 56 49 45 57 20 61 6c 72  ages if VIEW alr
107b0 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29  eady exists */.)
107c0 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
107d0 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63  int n;.  const c
107e0 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20  har *z;.  Token 
107f0 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20  sEnd;.  DbFixer 
10800 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70  sFix;.  Token *p
10810 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Name = 0;.  int 
10820 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  iDb;.  sqlite3 *
10830 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
10840 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
10850 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 73 71  nVar>0 ){.    sq
10860 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
10870 61 72 73 65 2c 20 22 70 61 72 61 6d 65 74 65 72  arse, "parameter
10880 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65  s are not allowe
10890 64 20 69 6e 20 76 69 65 77 73 22 29 3b 0a 20 20  d in views");.  
108a0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
108b0 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63  elete(db, pSelec
108c0 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
108d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 61    }.  sqlite3Sta
108e0 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  rtTable(pParse, 
108f0 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
10900 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f  isTemp, 1, 0, no
10910 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  Err);.  p = pPar
10920 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
10930 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
10940 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
10950 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
10960 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74  lete(db, pSelect
10970 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
10980 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50   }.  sqlite3TwoP
10990 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
109a0 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
109b0 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20 3d  &pName);.  iDb =
109c0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
109d0 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63  Index(db, p->pSc
109e0 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  hema);.  sqlite3
109f0 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70  FixInit(&sFix, p
10a00 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76 69 65  Parse, iDb, "vie
10a10 77 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  w", pName);.  if
10a20 28 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65  ( sqlite3FixSele
10a30 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63  ct(&sFix, pSelec
10a40 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  t) ){.    sqlite
10a50 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
10a60 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
10a70 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
10a80 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  * Make a copy of
10a90 20 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45   the entire SELE
10aa0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
10ab0 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69  t defines the vi
10ac0 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69  ew..  ** This wi
10ad0 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65  ll force all the
10ae0 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61   Expr.token.z va
10af0 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d  lues to be dynam
10b00 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f  ically.  ** allo
10b10 63 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61  cated rather tha
10b20 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69  n point to the i
10b30 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68  nput string - wh
10b40 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20  ich means that. 
10b50 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65   ** they will pe
10b60 72 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20  rsist after the 
10b70 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f  current sqlite3_
10b80 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75  exec() call retu
10b90 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  rns..  */.  p->p
10ba0 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
10bb0 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 53  SelectDup(db, pS
10bc0 65 6c 65 63 74 2c 20 45 58 50 52 44 55 50 5f 52  elect, EXPRDUP_R
10bd0 45 44 55 43 45 29 3b 0a 20 20 73 71 6c 69 74 65  EDUCE);.  sqlite
10be0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
10bf0 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66  , pSelect);.  if
10c00 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
10c10 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
10c20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 2d  ;.  }.  if( !db-
10c30 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
10c40 20 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74    sqlite3ViewGet
10c50 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
10c60 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  se, p);.  }..  /
10c70 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64  * Locate the end
10c80 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56   of the CREATE V
10c90 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  IEW statement.  
10ca0 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20  Make sEnd point 
10cb0 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e  to.  ** the end.
10cc0 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70  .  */.  sEnd = p
10cd0 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
10ce0 6e 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  n;.  if( ALWAYS(
10cf0 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 29 20 26 26  sEnd.z[0]!=0) &&
10d00 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20   sEnd.z[0]!=';' 
10d10 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d  ){.    sEnd.z +=
10d20 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73   sEnd.n;.  }.  s
10d30 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d  End.n = 0;.  n =
10d40 20 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d 20   (int)(sEnd.z - 
10d50 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 7a 20  pBegin->z);.  z 
10d60 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77  = pBegin->z;.  w
10d70 68 69 6c 65 28 20 41 4c 57 41 59 53 28 6e 3e 30  hile( ALWAYS(n>0
10d80 29 20 26 26 20 73 71 6c 69 74 65 33 49 73 73 70  ) && sqlite3Issp
10d90 61 63 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e  ace(z[n-1]) ){ n
10da0 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d  --; }.  sEnd.z =
10db0 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64   &z[n-1];.  sEnd
10dc0 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73  .n = 1;..  /* Us
10dd0 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
10de0 65 28 29 20 74 6f 20 61 64 64 20 74 68 65 20 76  e() to add the v
10df0 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54  iew to the SQLIT
10e00 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a  E_MASTER table *
10e10 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61  /.  sqlite3EndTa
10e20 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 26  ble(pParse, 0, &
10e30 73 45 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20 72  sEnd, 0, 0);.  r
10e40 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20  eturn;.}.#endif 
10e50 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
10e60 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  IEW */..#if !def
10e70 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
10e80 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
10e90 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
10ea0 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a  IRTUALTABLE)./*.
10eb0 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72  ** The Table str
10ec0 75 63 74 75 72 65 20 70 54 61 62 6c 65 20 69 73  ucture pTable is
10ed0 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20   really a VIEW. 
10ee0 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d   Fill in the nam
10ef0 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c  es of.** the col
10f00 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77  umns of the view
10f10 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73   in the pTable s
10f20 74 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72  tructure.  Retur
10f30 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  n the number.** 
10f40 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61  of errors.  If a
10f50 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20  n error is seen 
10f60 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
10f70 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
10f80 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e  ->zErrMsg..*/.in
10f90 74 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  t sqlite3ViewGet
10fa0 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73  ColumnNames(Pars
10fb0 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
10fc0 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62   *pTable){.  Tab
10fd0 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f  le *pSelTab;   /
10fe0 2a 20 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66  * A fake table f
10ff0 72 6f 6d 20 77 68 69 63 68 20 77 65 20 67 65 74  rom which we get
11000 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
11010 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
11020 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f  l;     /* Copy o
11030 66 20 74 68 65 20 53 45 4c 45 43 54 20 74 68 61  f the SELECT tha
11040 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
11050 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e   view */.  int n
11060 45 72 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Err = 0;     /* 
11070 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  Number of errors
11080 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a   encountered */.
11090 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
110a0 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69      /* Temporari
110b0 6c 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d  ly holds the num
110c0 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61  ber of cursors a
110d0 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c  ssigned */.  sql
110e0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
110f0 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62  e->db;  /* Datab
11100 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  ase connection f
11110 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  or malloc errors
11120 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 78 61   */.  sqlite3_xa
11130 75 74 68 20 78 41 75 74 68 3b 20 20 20 20 20 20  uth xAuth;      
11140 20 2f 2a 20 53 61 76 65 64 20 78 41 75 74 68 20   /* Saved xAuth 
11150 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  pointer */..  as
11160 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a  sert( pTable );.
11170 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11180 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
11190 45 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56  E.  if( sqlite3V
111a0 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70  tabCallConnect(p
111b0 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 20 29  Parse, pTable) )
111c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
111d0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
111e0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
111f0 54 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20  Table) ) return 
11200 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  0;.#endif..#ifnd
11210 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
11220 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74  IEW.  /* A posit
11230 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74  ive nCol means t
11240 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73  he columns names
11250 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61   for this view a
11260 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  re.  ** already 
11270 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  known..  */.  if
11280 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30  ( pTable->nCol>0
11290 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
112a0 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43  /* A negative nC
112b0 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  ol is a special 
112c0 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74  marker meaning t
112d0 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65  hat we are curre
112e0 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67  ntly.  ** trying
112f0 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
11300 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49  column names.  I
11310 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20  f we enter this 
11320 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a  routine with.  *
11330 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * a negative nCo
11340 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20  l, it means two 
11350 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f  or more views fo
11360 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20  rm a loop, like 
11370 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this:.  **.  ** 
11380 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
11390 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20  one AS SELECT * 
113a0 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20  FROM two;.  **  
113b0 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74     CREATE VIEW t
113c0 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  wo AS SELECT * F
113d0 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20  ROM one;.  **.  
113e0 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65  ** Actually, the
113f0 20 65 72 72 6f 72 20 61 62 6f 76 65 20 69 73 20   error above is 
11400 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f 72  now caught prior
11410 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69   to reaching thi
11420 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75  s point..  ** Bu
11430 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  t the following 
11440 74 65 73 74 20 69 73 20 73 74 69 6c 6c 20 69 6d  test is still im
11450 70 6f 72 74 61 6e 74 20 61 73 20 69 74 20 64 6f  portant as it do
11460 65 73 20 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20  es come up.  ** 
11470 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
11480 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20  :.  ** .  **    
11490 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6d 61   CREATE TABLE ma
114a0 69 6e 2e 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20  in.ex1(a);.  ** 
114b0 20 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20      CREATE TEMP 
114c0 56 49 45 57 20 65 78 31 20 41 53 20 53 45 4c 45  VIEW ex1 AS SELE
114d0 43 54 20 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20  CT a FROM ex1;. 
114e0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 2a   **     SELECT *
114f0 20 46 52 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a   FROM temp.ex1;.
11500 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
11510 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  e->nCol<0 ){.   
11520 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11530 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25  (pParse, "view %
11540 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20  s is circularly 
11550 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65  defined", pTable
11560 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
11570 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73  turn 1;.  }.  as
11580 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43  sert( pTable->nC
11590 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ol>=0 );..  /* I
115a0 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
115b0 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e  r, it means we n
115c0 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
115d0 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a  he table names..
115e0 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
115f0 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
11600 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
11610 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e  ect() will expan
11620 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65  d any.  ** "*" e
11630 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72  lements in the r
11640 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68  esults set of th
11650 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20  e view and will 
11660 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20  assign cursors. 
11670 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65   ** to the eleme
11680 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  nts of the FROM 
11690 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65 20  clause.  But we 
116a0 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73  do not want thes
116b0 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74  e changes.  ** t
116c0 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20  o be permanent. 
116d0 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74   So the computat
116e0 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61  ion is done on a
116f0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   copy of the SEL
11700 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  ECT.  ** stateme
11710 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  nt that defines 
11720 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20  the view..  */. 
11730 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
11740 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53  >pSelect );.  pS
11750 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  el = sqlite3Sele
11760 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65  ctDup(db, pTable
11770 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ->pSelect, 0);. 
11780 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20   if( pSel ){.   
11790 20 75 38 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73   u8 enableLookas
117a0 69 64 65 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ide = db->lookas
117b0 69 64 65 2e 62 45 6e 61 62 6c 65 64 3b 0a 20 20  ide.bEnabled;.  
117c0 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54    n = pParse->nT
117d0 61 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  ab;.    sqlite3S
117e0 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
117f0 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ors(pParse, pSel
11800 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 70 54 61  ->pSrc);.    pTa
11810 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a  ble->nCol = -1;.
11820 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
11830 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a  e.bEnabled = 0;.
11840 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11850 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
11860 4e 0a 20 20 20 20 78 41 75 74 68 20 3d 20 64 62  N.    xAuth = db
11870 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20 64 62 2d  ->xAuth;.    db-
11880 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20  >xAuth = 0;.    
11890 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
118a0 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
118b0 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29  ct(pParse, pSel)
118c0 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20  ;.    db->xAuth 
118d0 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20  = xAuth;.#else. 
118e0 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
118f0 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
11900 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
11910 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  el);.#endif.    
11920 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45  db->lookaside.bE
11930 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62 6c 65 4c  nabled = enableL
11940 6f 6f 6b 61 73 69 64 65 3b 0a 20 20 20 20 70 50  ookaside;.    pP
11950 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a  arse->nTab = n;.
11960 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 20      if( pSelTab 
11970 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
11980 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30   pTable->aCol==0
11990 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65   );.      pTable
119a0 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->nCol = pSelTab
119b0 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54  ->nCol;.      pT
119c0 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65  able->aCol = pSe
119d0 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  lTab->aCol;.    
119e0 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
119f0 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  = 0;.      pSelT
11a00 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
11a10 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
11a20 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54  eTable(db, pSelT
11a30 61 62 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ab);.      asser
11a40 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
11a50 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
11a60 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
11a70 29 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c  ) );.      pTabl
11a80 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  e->pSchema->sche
11a90 6d 61 46 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e  maFlags |= DB_Un
11aa0 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20 20 20  resetViews;.    
11ab0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61  }else{.      pTa
11ac0 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  ble->nCol = 0;. 
11ad0 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
11ae0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65   }.    sqlite3Se
11af0 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
11b00 53 65 6c 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  Sel);.  } else {
11b10 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d  .    nErr++;.  }
11b20 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
11b30 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20  E_OMIT_VIEW */. 
11b40 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a   return nErr;  .
11b50 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
11b60 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
11b70 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
11b80 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
11b90 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a  IRTUALTABLE) */.
11ba0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11bb0 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20  OMIT_VIEW./*.** 
11bc0 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  Clear the column
11bd0 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72   names from ever
11be0 79 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61  y VIEW in databa
11bf0 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69  se idx..*/.stati
11c00 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65  c void sqliteVie
11c10 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65  wResetAll(sqlite
11c20 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b  3 *db, int idx){
11c30 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a  .  HashElem *i;.
11c40 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11c50 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
11c60 28 64 62 2c 20 69 64 78 2c 20 30 29 20 29 3b 0a  (db, idx, 0) );.
11c70 20 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70    if( !DbHasProp
11c80 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42  erty(db, idx, DB
11c90 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29  _UnresetViews) )
11ca0 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
11cb0 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
11cc0 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70  (&db->aDb[idx].p
11cd0 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
11ce0 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68  ; i;i=sqliteHash
11cf0 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61  Next(i)){.    Ta
11d00 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
11d10 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
11d20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
11d30 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71  lect ){.      sq
11d40 6c 69 74 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e  liteDeleteColumn
11d50 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62 29 3b  Names(db, pTab);
11d60 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f  .      pTab->aCo
11d70 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 54 61  l = 0;.      pTa
11d80 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
11d90 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72   }.  }.  DbClear
11da0 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
11db0 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
11dc0 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  s);.}.#else.# de
11dd0 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52  fine sqliteViewR
11de0 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e  esetAll(A,B).#en
11df0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
11e00 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a  IT_VIEW */../*.*
11e10 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
11e20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
11e30 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20   VDBE to adjust 
11e40 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  the internal sch
11e50 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53  ema.** used by S
11e60 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62  QLite when the b
11e70 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73  tree layer moves
11e80 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61   a table root pa
11e90 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d  ge. The.** root-
11ea0 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
11eb0 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61  or index in data
11ec0 62 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61  base iDb has cha
11ed0 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a  nged from iFrom.
11ee0 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a  ** to iTo..**.**
11ef0 20 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20 20   Ticket #1728:  
11f00 54 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65  The symbol table
11f10 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e   might still con
11f20 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tain information
11f30 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e  .** on tables an
11f40 64 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68 61  d/or indices tha
11f50 74 20 61 72 65 20 74 68 65 20 70 72 6f 63 65 73  t are the proces
11f60 73 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65 74  s of being delet
11f70 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72  ed..** If you ar
11f80 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f  e unlucky, one o
11f90 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64 20  f those deleted 
11fa0 69 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c 65  indices or table
11fb0 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20  s might.** have 
11fc0 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61 67  the same rootpag
11fd0 65 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20  e number as the 
11fe0 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e  real table or in
11ff0 64 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20 62  dex that is.** b
12000 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20  eing moved.  So 
12010 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73  we cannot stop s
12020 65 61 72 63 68 69 6e 67 20 61 66 74 65 72 20 74  earching after t
12030 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 0a  he first match .
12040 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ** because the f
12050 69 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68 74  irst match might
12060 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74   be for one of t
12070 68 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63  he deleted indic
12080 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20  es.** or tables 
12090 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62 6c  and not the tabl
120a0 65 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  e/index that is 
120b0 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d  actually being m
120c0 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74  oved..** We must
120d0 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e   continue loopin
120e0 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c  g until all tabl
120f0 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 77  es and indices w
12100 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d  ith.** rootpage=
12110 3d 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65 6e  =iFrom have been
12120 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68 61   converted to ha
12130 76 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f 66  ve a rootpage of
12140 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72   iTo.** in order
12150 20 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20 74   to be certain t
12160 68 61 74 20 77 65 20 67 6f 74 20 74 68 65 20 72  hat we got the r
12170 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66  ight one..*/.#if
12180 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12190 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64  _AUTOVACUUM.void
121a0 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65   sqlite3RootPage
121b0 4d 6f 76 65 64 28 73 71 6c 69 74 65 33 20 2a 64  Moved(sqlite3 *d
121c0 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20  b, int iDb, int 
121d0 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b  iFrom, int iTo){
121e0 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c  .  HashElem *pEl
121f0 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73  em;.  Hash *pHas
12200 68 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20  h;.  Db *pDb;.. 
12210 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12220 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
12230 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
12240 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
12250 69 44 62 5d 3b 0a 20 20 70 48 61 73 68 20 3d 20  iDb];.  pHash = 
12260 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
12270 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45  blHash;.  for(pE
12280 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
12290 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65  rst(pHash); pEle
122a0 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
122b0 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
122c0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
122d0 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
122e0 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66  a(pElem);.    if
122f0 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46  ( pTab->tnum==iF
12300 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61  rom ){.      pTa
12310 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20  b->tnum = iTo;. 
12320 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68     }.  }.  pHash
12330 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61   = &pDb->pSchema
12340 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72  ->idxHash;.  for
12350 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
12360 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70  hFirst(pHash); p
12370 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
12380 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
12390 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  )){.    Index *p
123a0 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Idx = sqliteHash
123b0 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
123c0 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d   if( pIdx->tnum=
123d0 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
123e0 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f  pIdx->tnum = iTo
123f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
12400 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
12410 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20  e code to erase 
12420 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
12430 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20  oot-page iTable 
12440 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44  from database iD
12450 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65  b..** Also write
12460 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20   code to modify 
12470 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
12480 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65  r table and inte
12490 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69  rnal schema.** i
124a0 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  f a root-page of
124b0 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
124c0 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62  s moved by the b
124d0 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73  tree-layer whils
124e0 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61  t.** erasing iTa
124f0 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68 61  ble (this can ha
12500 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74  ppen with an aut
12510 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
12520 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  e)..*/ .static v
12530 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50  oid destroyRootP
12540 61 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  age(Parse *pPars
12550 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69  e, int iTable, i
12560 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20  nt iDb){.  Vdbe 
12570 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
12580 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
12590 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
125a0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
125b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
125c0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65 73  AddOp3(v, OP_Des
125d0 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72 31  troy, iTable, r1
125e0 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , iDb);.  sqlite
125f0 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
12600 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
12610 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
12620 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f  M.  /* OP_Destro
12630 79 20 73 74 6f 72 65 73 20 61 6e 20 69 6e 20 69  y stores an in i
12640 6e 74 65 67 65 72 20 72 31 2e 20 49 66 20 74 68  nteger r1. If th
12650 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20  is integer.  ** 
12660 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
12670 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74  n it is the root
12680 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
12690 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f  a table moved to
126a0 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69  .  ** location i
126b0 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f  Table. The follo
126c0 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69  wing code modifi
126d0 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  es the sqlite_ma
126e0 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20  ster table to.  
126f0 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e  ** reflect this.
12700 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22  .  **.  ** The "
12710 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20 53 51 4c  #NNN" in the SQL
12720 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f   is a special co
12730 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e  nstant that mean
12740 73 20 77 68 61 74 65 76 65 72 20 76 61 6c 75 65  s whatever value
12750 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72 65 67 69  .  ** is in regi
12760 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65 65 20 67  ster NNN.  See g
12770 72 61 6d 6d 61 72 20 72 75 6c 65 73 20 61 73 73  rammar rules ass
12780 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
12790 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 2a   TK_REGISTER.  *
127a0 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61 64 64 69  * token for addi
127b0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
127c0 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  on..  */.  sqlit
127d0 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
127e0 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44  arse, .     "UPD
127f0 41 54 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f  ATE %Q.%s SET ro
12800 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52 45 20  otpage=%d WHERE 
12810 23 25 64 20 41 4e 44 20 72 6f 6f 74 70 61 67 65  #%d AND rootpage
12820 3d 23 25 64 22 2c 0a 20 20 20 20 20 70 50 61 72  =#%d",.     pPar
12830 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
12840 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
12850 41 42 4c 45 28 69 44 62 29 2c 20 69 54 61 62 6c  ABLE(iDb), iTabl
12860 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64  e, r1, r1);.#end
12870 69 66 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  if.  sqlite3Rele
12880 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
12890 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e, r1);.}../*.**
128a0 20 57 72 69 74 65 20 56 44 42 45 20 63 6f 64 65   Write VDBE code
128b0 20 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20   to erase table 
128c0 70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73  pTab and all ass
128d0 6f 63 69 61 74 65 64 20 69 6e 64 69 63 65 73 20  ociated indices 
128e0 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65  on disk..** Code
128f0 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 73   to update the s
12900 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
12910 6c 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c  les and internal
12920 20 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69   schema definiti
12930 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61  ons.** in case a
12940 20 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e   root-page belon
12950 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20  ging to another 
12960 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
12970 79 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  y the btree laye
12980 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64  r.** is also add
12990 65 64 20 28 74 68 69 73 20 63 61 6e 20 68 61 70  ed (this can hap
129a0 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f  pen with an auto
129b0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
129c0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
129d0 64 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50  d destroyTable(P
129e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
129f0 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69 66 64  ble *pTab){.#ifd
12a00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
12a10 55 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64 65  UTOVACUUM.  Inde
12a20 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69  x *pIdx;.  int i
12a30 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
12a40 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
12a50 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
12a60 65 6d 61 29 3b 0a 20 20 64 65 73 74 72 6f 79 52  ema);.  destroyR
12a70 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
12a80 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  pTab->tnum, iDb)
12a90 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61  ;.  for(pIdx=pTa
12aa0 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
12ab0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
12ac0 74 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 52  t){.    destroyR
12ad0 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
12ae0 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  pIdx->tnum, iDb)
12af0 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a  ;.  }.#else.  /*
12b00 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
12b10 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63   may be auto-vac
12b20 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20  uum capable (if 
12b30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
12b40 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e  VACUUM.  ** is n
12b50 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65  ot defined), the
12b60 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  n it is importan
12b70 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73  t to call OP_Des
12b80 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  troy on the.  **
12b90 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
12ba0 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f   root-pages in o
12bb0 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77  rder, starting w
12bc0 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61  ith the numerica
12bd0 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73  lly .  ** larges
12be0 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  t root-page numb
12bf0 65 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  er. This guarant
12c00 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66  ees that none of
12c10 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a   the root-pages.
12c20 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72    ** to be destr
12c30 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65  oyed is relocate
12c40 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
12c50 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e  OP_Destroy. i.e.
12c60 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c   if the.  ** fol
12c70 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65  lowing were code
12c80 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f  d:.  **.  ** OP_
12c90 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a  Destroy 4 0.  **
12ca0 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73   ....  ** OP_Des
12cb0 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20  troy 5 0.  **.  
12cc0 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65  ** and root page
12cd0 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62   5 happened to b
12ce0 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  e the largest ro
12cf0 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69  ot-page number i
12d00 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
12d10 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70  ase, then root p
12d20 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d  age 5 would be m
12d30 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34 20 62  oved to page 4 b
12d40 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f  y the .  ** "OP_
12d50 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63  Destroy 4 0" opc
12d60 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65 71 75  ode. The subsequ
12d70 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20  ent "OP_Destroy 
12d80 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20  5 0" would hit. 
12d90 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20   ** a free-list 
12da0 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  page..  */.  int
12db0 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e   iTab = pTab->tn
12dc0 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72  um;.  int iDestr
12dd0 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69  oyed = 0;..  whi
12de0 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64  le( 1 ){.    Ind
12df0 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e  ex *pIdx;.    in
12e00 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a  t iLargest = 0;.
12e10 0a 20 20 20 20 69 66 28 20 69 44 65 73 74 72 6f  .    if( iDestro
12e20 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69  yed==0 || iTab<i
12e30 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20  Destroyed ){.   
12e40 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54     iLargest = iT
12e50 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ab;.    }.    fo
12e60 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
12e70 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
12e80 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
12e90 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70      int iIdx = p
12ea0 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  Idx->tnum;.     
12eb0 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70   assert( pIdx->p
12ec0 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
12ed0 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69  chema );.      i
12ee0 66 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d  f( (iDestroyed==
12ef0 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74  0 || (iIdx<iDest
12f00 72 6f 79 65 64 29 29 20 26 26 20 69 49 64 78 3e  royed)) && iIdx>
12f10 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20  iLargest ){.    
12f20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69      iLargest = i
12f30 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Idx;.      }.   
12f40 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67   }.    if( iLarg
12f50 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  est==0 ){.      
12f60 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73  return;.    }els
12f70 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  e{.      int iDb
12f80 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
12f90 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
12fa0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
12fb0 61 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  a);.      assert
12fc0 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
12fd0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20  pParse->db->nDb 
12fe0 29 3b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79  );.      destroy
12ff0 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
13000 20 69 4c 61 72 67 65 73 74 2c 20 69 44 62 29 3b   iLargest, iDb);
13010 0a 20 20 20 20 20 20 69 44 65 73 74 72 6f 79 65  .      iDestroye
13020 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20  d = iLargest;.  
13030 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d    }.  }.#endif.}
13040 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 65  ../*.** Remove e
13050 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68 65 20  ntries from the 
13060 73 71 6c 69 74 65 5f 73 74 61 74 4e 20 74 61 62  sqlite_statN tab
13070 6c 65 73 20 28 66 6f 72 20 4e 20 69 6e 20 28 31  les (for N in (1
13080 2c 32 2c 33 29 29 0a 2a 2a 20 61 66 74 65 72 20  ,2,3)).** after 
13090 61 20 44 52 4f 50 20 49 4e 44 45 58 20 6f 72 20  a DROP INDEX or 
130a0 44 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61  DROP TABLE comma
130b0 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nd..*/.static vo
130c0 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53  id sqlite3ClearS
130d0 74 61 74 54 61 62 6c 65 73 28 0a 20 20 50 61 72  tatTables(.  Par
130e0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
130f0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
13100 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
13110 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20  int iDb,        
13120 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
13130 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f  tabase number */
13140 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
13150 54 79 70 65 2c 20 20 20 20 20 2f 2a 20 22 69 64  Type,     /* "id
13160 78 22 20 6f 72 20 22 74 62 6c 22 20 2a 2f 0a 20  x" or "tbl" */. 
13170 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
13180 6d 65 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me      /* Name 
13190 6f 66 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  of index or tabl
131a0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
131b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
131c0 44 62 4e 61 6d 65 20 3d 20 70 50 61 72 73 65 2d  DbName = pParse-
131d0 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e  >db->aDb[iDb].zN
131e0 61 6d 65 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  ame;.  for(i=1; 
131f0 69 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<=4; i++){.    
13200 63 68 61 72 20 7a 54 61 62 5b 32 34 5d 3b 0a 20  char zTab[24];. 
13210 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
13220 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 61 62 29  ntf(sizeof(zTab)
13230 2c 7a 54 61 62 2c 22 73 71 6c 69 74 65 5f 73 74  ,zTab,"sqlite_st
13240 61 74 25 64 22 2c 69 29 3b 0a 20 20 20 20 69 66  at%d",i);.    if
13250 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  ( sqlite3FindTab
13260 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  le(pParse->db, z
13270 54 61 62 2c 20 7a 44 62 4e 61 6d 65 29 20 29 7b  Tab, zDbName) ){
13280 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65  .      sqlite3Ne
13290 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
132a0 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54  ,.        "DELET
132b0 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45  E FROM %Q.%s WHE
132c0 52 45 20 25 73 3d 25 51 22 2c 0a 20 20 20 20 20  RE %s=%Q",.     
132d0 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61 62     zDbName, zTab
132e0 2c 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65 0a 20  , zType, zName. 
132f0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
13300 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
13310 61 74 65 20 63 6f 64 65 20 74 6f 20 64 72 6f 70  ate code to drop
13320 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69   a table..*/.voi
13330 64 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f  d sqlite3CodeDro
13340 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
13350 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
13360 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20  b, int iDb, int 
13370 69 73 56 69 65 77 29 7b 0a 20 20 56 64 62 65 20  isView){.  Vdbe 
13380 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
13390 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
133a0 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
133b0 67 65 72 3b 0a 20 20 44 62 20 2a 70 44 62 20 3d  ger;.  Db *pDb =
133c0 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
133d0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
133e0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
133f0 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
13400 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57  .  sqlite3BeginW
13410 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
13420 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a  arse, 1, iDb);..
13430 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13440 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
13450 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
13460 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71  (pTab) ){.    sq
13470 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
13480 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20  v, OP_VBegin);. 
13490 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
134a0 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72  Drop all trigger
134b0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
134c0 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  h the table bein
134d0 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a  g dropped. Code.
134e0 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65    ** is generate
134f0 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72  d to remove entr
13500 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f  ies from sqlite_
13510 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20  master and/or.  
13520 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  ** sqlite_temp_m
13530 61 73 74 65 72 20 69 66 20 72 65 71 75 69 72 65  aster if require
13540 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 72 69 67 67  d..  */.  pTrigg
13550 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67  er = sqlite3Trig
13560 67 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  gerList(pParse, 
13570 70 54 61 62 29 3b 0a 20 20 77 68 69 6c 65 28 20  pTab);.  while( 
13580 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20  pTrigger ){.    
13590 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
135a0 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
135b0 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20  >pSchema || .   
135c0 20 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70       pTrigger->p
135d0 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b  Schema==db->aDb[
135e0 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  1].pSchema );.  
135f0 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69    sqlite3DropTri
13600 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20  ggerPtr(pParse, 
13610 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 70  pTrigger);.    p
13620 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67  Trigger = pTrigg
13630 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a  er->pNext;.  }..
13640 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13650 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
13660 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e  T.  /* Remove an
13670 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65  y entries of the
13680 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
13690 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   table associate
136a0 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20  d with.  ** the 
136b0 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70  table being drop
136c0 70 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e  ped. This is don
136d0 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 61 62  e before the tab
136e0 6c 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20  le is dropped.  
136f0 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65 20  ** at the btree 
13700 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74  level, in case t
13710 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  he sqlite_sequen
13720 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74  ce table needs t
13730 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61  o.  ** move as a
13740 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64   result of the d
13750 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20  rop (can happen 
13760 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  in auto-vacuum m
13770 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ode)..  */.  if(
13780 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
13790 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
137a0 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nt ){.    sqlite
137b0 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
137c0 72 73 65 2c 0a 20 20 20 20 20 20 22 44 45 4c 45  rse,.      "DELE
137d0 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74  TE FROM %Q.sqlit
137e0 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52 45  e_sequence WHERE
137f0 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20   name=%Q",.     
13800 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61   pDb->zName, pTa
13810 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a  b->zName.    );.
13820 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
13830 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45   Drop all SQLITE
13840 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e  _MASTER table an
13850 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  d index entries 
13860 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
13870 65 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68  e.  ** table. Th
13880 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c  e program name l
13890 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65  oops through the
138a0 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e   master table an
138b0 64 20 64 65 6c 65 74 65 73 0a 20 20 2a 2a 20 65  d deletes.  ** e
138c0 76 65 72 79 20 72 6f 77 20 74 68 61 74 20 72 65  very row that re
138d0 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20  fers to a table 
138e0 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
138f0 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e   as the one bein
13900 67 0a 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20  g.  ** dropped. 
13910 54 72 69 67 67 65 72 73 20 61 72 65 20 68 61 6e  Triggers are han
13920 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 20  dled separately 
13930 62 65 63 61 75 73 65 20 61 20 74 72 69 67 67 65  because a trigge
13940 72 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 63 72  r can be.  ** cr
13950 65 61 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d  eated in the tem
13960 70 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  p database that 
13970 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
13980 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 2a  e in another.  *
13990 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  * database..  */
139a0 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  .  sqlite3Nested
139b0 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
139c0 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
139d0 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 74 62  M %Q.%s WHERE tb
139e0 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79  l_name=%Q and ty
139f0 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a  pe!='trigger'",.
13a00 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65        pDb->zName
13a10 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
13a20 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  Db), pTab->zName
13a30 29 3b 0a 20 20 69 66 28 20 21 69 73 56 69 65 77  );.  if( !isView
13a40 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70   && !IsVirtual(p
13a50 54 61 62 29 20 29 7b 0a 20 20 20 20 64 65 73 74  Tab) ){.    dest
13a60 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c  royTable(pParse,
13a70 20 70 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f   pTab);.  }..  /
13a80 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62  * Remove the tab
13a90 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51  le entry from SQ
13aa0 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20  Lite's internal 
13ab0 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66  schema and modif
13ac0 79 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d  y.  ** the schem
13ad0 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a 20  a cookie..  */. 
13ae0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
13af0 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Tab) ){.    sqli
13b00 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
13b10 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44   OP_VDestroy, iD
13b20 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  b, 0, 0, pTab->z
13b30 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Name, 0);.  }.  
13b40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13b50 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c  4(v, OP_DropTabl
13b60 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54  e, iDb, 0, 0, pT
13b70 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
13b80 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
13b90 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
13ba0 29 3b 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52  );.  sqliteViewR
13bb0 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29  esetAll(db, iDb)
13bc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
13bd0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
13be0 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b  d to do the work
13bf0 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45   of a DROP TABLE
13c00 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70   statement..** p
13c10 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  Name is the name
13c20 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
13c30 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a   be dropped..*/.
13c40 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70  void sqlite3Drop
13c50 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
13c60 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e  rse, SrcList *pN
13c70 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 2c  ame, int isView,
13c80 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54   int noErr){.  T
13c90 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64  able *pTab;.  Vd
13ca0 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33  be *v;.  sqlite3
13cb0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
13cc0 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
13cd0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
13ce0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
13cf0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
13d00 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
13d10 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
13d20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e   );.  assert( pN
13d30 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ame->nSrc==1 );.
13d40 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 61    if( sqlite3Rea
13d50 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
13d60 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70  ) goto exit_drop
13d70 5f 74 61 62 6c 65 3b 0a 20 20 69 66 28 20 6e 6f  _table;.  if( no
13d80 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65  Err ) db->suppre
13d90 73 73 45 72 72 2b 2b 3b 0a 20 20 70 54 61 62 20  ssErr++;.  pTab 
13da0 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
13db0 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c  ableItem(pParse,
13dc0 20 69 73 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d   isView, &pName-
13dd0 3e 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f  >a[0]);.  if( no
13de0 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65  Err ) db->suppre
13df0 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20  ssErr--;..  if( 
13e00 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69  pTab==0 ){.    i
13e10 66 28 20 6e 6f 45 72 72 20 29 20 73 71 6c 69 74  f( noErr ) sqlit
13e20 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65  e3CodeVerifyName
13e30 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  dSchema(pParse, 
13e40 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
13e50 61 62 61 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f  abase);.    goto
13e60 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
13e70 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
13e80 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
13e90 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
13ea0 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28  hema);.  assert(
13eb0 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
13ec0 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20  b->nDb );..  /* 
13ed0 49 66 20 70 54 61 62 20 69 73 20 61 20 76 69 72  If pTab is a vir
13ee0 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c  tual table, call
13ef0 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61   ViewGetColumnNa
13f00 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a  mes() to ensure.
13f10 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69    ** it is initi
13f20 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  alized..  */.  i
13f30 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
13f40 62 29 20 26 26 20 73 71 6c 69 74 65 33 56 69 65  b) && sqlite3Vie
13f50 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
13f60 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b  pParse, pTab) ){
13f70 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
13f80 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23  rop_table;.  }.#
13f90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13fa0 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
13fb0 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
13fc0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
13fd0 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
13fe0 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20  _TABLE(iDb);.   
13ff0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
14000 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
14010 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  zName;.    const
14020 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30   char *zArg2 = 0
14030 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
14040 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
14050 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
14060 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29  , zTab, 0, zDb))
14070 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
14080 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
14090 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69    }.    if( isVi
140a0 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
140b0 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
140c0 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
140d0 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
140e0 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a  DROP_TEMP_VIEW;.
140f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14100 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
14110 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20  TE_DROP_VIEW;.  
14120 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
14130 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
14140 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65  LTABLE.    }else
14150 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
14160 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  Tab) ){.      co
14170 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
14180 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a  _VTABLE;.      z
14190 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65  Arg2 = sqlite3Ge
141a0 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  tVTable(db, pTab
141b0 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a  )->pMod->zName;.
141c0 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
141d0 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
141e0 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
141f0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =1 ){.        co
14200 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
14210 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _TEMP_TABLE;.   
14220 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14230 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
14240 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  DROP_TABLE;.    
14250 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
14260 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
14270 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
14280 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41   pTab->zName, zA
14290 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  rg2, zDb) ){.   
142a0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
142b0 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
142c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
142d0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
142e0 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70  SQLITE_DELETE, p
142f0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a  Tab->zName, 0, z
14300 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
14310 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
14320 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  e;.    }.  }.#en
14330 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65  dif.  if( sqlite
14340 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e  3StrNICmp(pTab->
14350 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22  zName, "sqlite_"
14360 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 26 26 20  , 7)==0 .    && 
14370 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
14380 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71  pTab->zName, "sq
14390 6c 69 74 65 5f 73 74 61 74 22 2c 20 31 31 29 21  lite_stat", 11)!
143a0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
143b0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
143c0 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
143d0 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
143e0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
143f0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
14400 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69  p_table;.  }..#i
14410 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14420 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75  T_VIEW.  /* Ensu
14430 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73  re DROP TABLE is
14440 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76   not used on a v
14450 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49  iew, and DROP VI
14460 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20  EW is not used. 
14470 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a   ** on a table..
14480 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65    */.  if( isVie
14490 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65  w && pTab->pSele
144a0 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ct==0 ){.    sql
144b0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
144c0 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54  rse, "use DROP T
144d0 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74  ABLE to delete t
144e0 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e  able %s", pTab->
144f0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
14500 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
14510 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56  ;.  }.  if( !isV
14520 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
14530 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
14540 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14550 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49  se, "use DROP VI
14560 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65  EW to delete vie
14570 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  w %s", pTab->zNa
14580 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
14590 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
145a0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
145b0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
145c0 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   remove the tabl
145d0 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  e from the maste
145e0 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20  r table.  ** on 
145f0 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  disk..  */.  v =
14600 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
14610 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
14620 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
14630 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
14640 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
14650 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  b);.    sqlite3C
14660 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70  learStatTables(p
14670 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74 62 6c  Parse, iDb, "tbl
14680 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
14690 0a 20 20 20 20 73 71 6c 69 74 65 33 46 6b 44 72  .    sqlite3FkDr
146a0 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  opTable(pParse, 
146b0 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a 20 20  pName, pTab);.  
146c0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f    sqlite3CodeDro
146d0 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  pTable(pParse, p
146e0 54 61 62 2c 20 69 44 62 2c 20 69 73 56 69 65 77  Tab, iDb, isView
146f0 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f  );.  }..exit_dro
14700 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74  p_table:.  sqlit
14710 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
14720 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  db, pName);.}../
14730 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14740 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  e is called to c
14750 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65  reate a new fore
14760 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74  ign key on the t
14770 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  able.** currentl
14780 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
14790 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20  tion.  pFromCol 
147a0 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
147b0 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
147c0 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
147d0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f   point to the fo
147e0 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70  reign key.  If p
147f0 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a  FromCol==0 then.
14800 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b  ** connect the k
14810 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63  ey to the last c
14820 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20  olumn inserted. 
14830 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65   pTo is the name
14840 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
14850 20 72 65 66 65 72 72 65 64 20 74 6f 20 28 61 2e   referred to (a.
14860 6b 2e 61 20 74 68 65 20 22 70 61 72 65 6e 74 22  k.a the "parent"
14870 20 74 61 62 6c 65 29 2e 20 20 70 54 6f 43 6f 6c   table).  pToCol
14880 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20 6f 66   is a list.** of
14890 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70   tables in the p
148a0 61 72 65 6e 74 20 70 54 6f 20 74 61 62 6c 65 2e  arent pTo table.
148b0 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73    flags contains
148c0 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74   all.** informat
148d0 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ion about the co
148e0 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
148f0 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  n algorithms spe
14900 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cified.** in the
14910 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55   ON DELETE, ON U
14920 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53  PDATE and ON INS
14930 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ERT clauses..**.
14940 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63  ** An FKey struc
14950 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
14960 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
14970 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
14980 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
14990 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50  uction in the pP
149a0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
149b0 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  field..**.** The
149c0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
149d0 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54  set for IMMEDIAT
149e0 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41  E processing.  A
149f0 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
14a00 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65  .** to sqlite3De
14a10 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20  ferForeignKey() 
14a20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69  might change thi
14a30 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a  s to DEFERRED..*
14a40 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
14a50 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a  eateForeignKey(.
14a60 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
14a70 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
14a80 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
14a90 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f  xprList *pFromCo
14aa0 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69  l,  /* Columns i
14ab0 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61  n this table tha
14ac0 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72  t point to other
14ad0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65   table */.  Toke
14ae0 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20  n *pTo,         
14af0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
14b00 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
14b10 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f   ExprList *pToCo
14b20 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  l,    /* Columns
14b30 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61   in the other ta
14b40 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ble */.  int fla
14b50 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
14b60 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
14b70 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e  tion algorithms.
14b80 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
14b90 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
14ba0 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
14bb0 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
14bc0 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  EY.  FKey *pFKey
14bd0 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e   = 0;.  FKey *pN
14be0 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a  extTo;.  Table *
14bf0 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
14c00 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79  Table;.  int nBy
14c10 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  te;.  int i;.  i
14c20 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20  nt nCol;.  char 
14c30 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *z;..  assert( p
14c40 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  To!=0 );.  if( p
14c50 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52  ==0 || IN_DECLAR
14c60 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b  E_VTAB ) goto fk
14c70 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f  _end;.  if( pFro
14c80 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  mCol==0 ){.    i
14c90 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f  nt iCol = p->nCo
14ca0 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  l-1;.    if( NEV
14cb0 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74  ER(iCol<0) ) got
14cc0 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66  o fk_end;.    if
14cd0 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
14ce0 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  ol->nExpr!=1 ){.
14cf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
14d00 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66  orMsg(pParse, "f
14d10 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73  oreign key on %s
14d20 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f  ".         " sho
14d30 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  uld reference on
14d40 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66  ly one column of
14d50 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20   table %T",.    
14d60 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f       p->aCol[iCo
14d70 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a  l].zName, pTo);.
14d80 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
14d90 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f  d;.    }.    nCo
14da0 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  l = 1;.  }else i
14db0 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
14dc0 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f  Col->nExpr!=pFro
14dd0 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  mCol->nExpr ){. 
14de0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14df0 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
14e00 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f     "number of co
14e10 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e  lumns in foreign
14e20 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61   key does not ma
14e30 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
14e40 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c  f ".        "col
14e50 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65  umns in the refe
14e60 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a  renced table");.
14e70 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
14e80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
14e90 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  ol = pFromCol->n
14ea0 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  Expr;.  }.  nByt
14eb0 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65  e = sizeof(*pFKe
14ec0 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69  y) + (nCol-1)*si
14ed0 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c  zeof(pFKey->aCol
14ee0 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20  [0]) + pTo->n + 
14ef0 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  1;.  if( pToCol 
14f00 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
14f10 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b  i<pToCol->nExpr;
14f20 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79   i++){.      nBy
14f30 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  te += sqlite3Str
14f40 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b  len30(pToCol->a[
14f50 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
14f60 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
14f70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
14f80 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
14f90 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d   );.  if( pFKey=
14fa0 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  =0 ){.    goto f
14fb0 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b  k_end;.  }.  pFK
14fc0 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20  ey->pFrom = p;. 
14fd0 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
14fe0 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20  m = p->pFKey;.  
14ff0 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65  z = (char*)&pFKe
15000 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20  y->aCol[nCol];. 
15010 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b   pFKey->zTo = z;
15020 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f  .  memcpy(z, pTo
15030 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20  ->z, pTo->n);.  
15040 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  z[pTo->n] = 0;. 
15050 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
15060 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e  z);.  z += pTo->
15070 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43  n+1;.  pFKey->nC
15080 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28  ol = nCol;.  if(
15090 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
150a0 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
150b0 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43  0].iFrom = p->nC
150c0 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ol-1;.  }else{. 
150d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
150e0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
150f0 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
15100 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b  (j=0; j<p->nCol;
15110 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
15120 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
15130 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  p(p->aCol[j].zNa
15140 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b  me, pFromCol->a[
15150 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
15160 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
15170 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d  >aCol[i].iFrom =
15180 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   j;.          br
15190 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
151a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
151b0 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20   j>=p->nCol ){. 
151c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
151d0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
151e0 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f            "unkno
151f0 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22  wn column \"%s\"
15200 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
15210 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20  definition", .  
15220 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c          pFromCol
15230 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
15240 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65         goto fk_e
15250 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
15260 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43  }.  }.  if( pToC
15270 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
15280 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
15290 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
152a0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
152b0 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
152c0 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  e);.      pFKey-
152d0 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20  >aCol[i].zCol = 
152e0 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  z;.      memcpy(
152f0 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  z, pToCol->a[i].
15300 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
15310 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[n] = 0;.     
15320 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d   z += n+1;.    }
15330 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73  .  }.  pFKey->is
15340 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20  Deferred = 0;.  
15350 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30  pFKey->aAction[0
15360 5d 20 3d 20 28 75 38 29 28 66 6c 61 67 73 20 26  ] = (u8)(flags &
15370 20 30 78 66 66 29 3b 20 20 20 20 20 20 20 20 20   0xff);         
15380 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20     /* ON DELETE 
15390 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65  action */.  pFKe
153a0 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20  y->aAction[1] = 
153b0 28 75 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 38  (u8)((flags >> 8
153c0 20 29 20 26 20 30 78 66 66 29 3b 20 20 20 20 2f   ) & 0xff);    /
153d0 2a 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69  * ON UPDATE acti
153e0 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  on */..  assert(
153f0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
15400 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
15410 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
15420 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b 65 79 20  pNextTo = (FKey 
15430 2a 29 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  *)sqlite3HashIns
15440 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d  ert(&p->pSchema-
15450 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20 20 20 20  >fkeyHash, .    
15460 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 28 76    pFKey->zTo, (v
15470 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b  oid *)pFKey.  );
15480 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d  .  if( pNextTo==
15490 70 46 4b 65 79 20 29 7b 0a 20 20 20 20 64 62 2d  pFKey ){.    db-
154a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
154b0 31 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  1;.    goto fk_e
154c0 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e  nd;.  }.  if( pN
154d0 65 78 74 54 6f 20 29 7b 0a 20 20 20 20 61 73 73  extTo ){.    ass
154e0 65 72 74 28 20 70 4e 65 78 74 54 6f 2d 3e 70 50  ert( pNextTo->pP
154f0 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20  revTo==0 );.    
15500 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d  pFKey->pNextTo =
15510 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 70 4e   pNextTo;.    pN
15520 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 20 3d  extTo->pPrevTo =
15530 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f   pFKey;.  }..  /
15540 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69  * Link the forei
15550 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61  gn key to the ta
15560 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20  ble as the last 
15570 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  step..  */.  p->
15580 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20  pFKey = pFKey;. 
15590 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f   pFKey = 0;..fk_
155a0 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 44 62  end:.  sqlite3Db
155b0 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29 3b  Free(db, pFKey);
155c0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
155d0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
155e0 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a  FOREIGN_KEY) */.
155f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
15600 74 44 65 6c 65 74 65 28 64 62 2c 20 70 46 72 6f  tDelete(db, pFro
15610 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  mCol);.  sqlite3
15620 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
15630 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f  b, pToCol);.}../
15640 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15650 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
15660 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d   an INITIALLY IM
15670 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49  MEDIATE or INITI
15680 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a  ALLY DEFERRED.**
15690 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20   clause is seen 
156a0 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72  as part of a for
156b0 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74  eign key definit
156c0 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65  ion.  The isDefe
156d0 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  rred.** paramete
156e0 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49  r is 1 for INITI
156f0 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e  ALLY DEFERRED an
15700 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  d 0 for INITIALL
15710 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20  Y IMMEDIATE..** 
15720 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  The behavior of 
15730 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
15740 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67  y created foreig
15750 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65  n key is adjuste
15760 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79  d.** accordingly
15770 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15780 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
15790 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
157a0 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b  int isDeferred){
157b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
157c0 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
157d0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
157e0 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20    FKey *pFKey;. 
157f0 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61   if( (pTab = pPa
15800 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
15810 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70  =0 || (pFKey = p
15820 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29  Tab->pFKey)==0 )
15830 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
15840 74 28 20 69 73 44 65 66 65 72 72 65 64 3d 3d 30  t( isDeferred==0
15850 20 7c 7c 20 69 73 44 65 66 65 72 72 65 64 3d 3d   || isDeferred==
15860 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30  1 ); /* EV: R-30
15870 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a 20 20 70  323-21917 */.  p
15880 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
15890 20 3d 20 28 75 38 29 69 73 44 65 66 65 72 72 65   = (u8)isDeferre
158a0 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  d;.#endif.}../*.
158b0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
158c0 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65   that will erase
158d0 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65   and refill inde
158e0 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69  x *pIdx.  This i
158f0 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69  s.** used to ini
15900 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20  tialize a newly 
15910 63 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72  created index or
15920 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68   to recompute th
15930 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  e.** content of 
15940 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70  an index in resp
15950 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45  onse to a REINDE
15960 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  X command..**.**
15970 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20   if memRootPage 
15980 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c  is not negative,
15990 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
159a0 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c  he index is newl
159b0 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54  y.** created.  T
159c0 68 65 20 72 65 67 69 73 74 65 72 20 73 70 65 63  he register spec
159d0 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74  ified by memRoot
159e0 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Page contains th
159f0 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e  e.** root page n
15a00 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64  umber of the ind
15a10 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50  ex.  If memRootP
15a20 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c  age is negative,
15a30 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64   then.** the ind
15a40 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
15a50 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c  s and must be cl
15a60 65 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69  eared before bei
15a70 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a  ng refilled and.
15a80 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ** the root page
15a90 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
15aa0 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72  ndex is taken fr
15ab0 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e  om pIndex->tnum.
15ac0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
15ad0 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
15ae0 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
15af0 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c  , Index *pIndex,
15b00 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65   int memRootPage
15b10 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
15b20 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
15b30 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  e;  /* The table
15b40 20 74 68 61 74 20 69 73 20 69 6e 64 65 78 65 64   that is indexed
15b50 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
15b60 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
15b70 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75       /* Btree cu
15b80 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54  rsor used for pT
15b90 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ab */.  int iIdx
15ba0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
15bb0 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20  +;     /* Btree 
15bc0 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  cursor used for 
15bd0 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20  pIndex */.  int 
15be0 69 53 6f 72 74 65 72 3b 20 20 20 20 20 20 20 20  iSorter;        
15bf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
15c00 72 73 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 4f  rsor opened by O
15c10 70 65 6e 53 6f 72 74 65 72 20 28 69 66 20 69 6e  penSorter (if in
15c20 20 75 73 65 29 20 2a 2f 0a 20 20 69 6e 74 20 61   use) */.  int a
15c30 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  ddr1;           
15c40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
15c50 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c  ress of top of l
15c60 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
15c70 72 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r2;             
15c80 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
15c90 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f  ss to jump to fo
15ca0 72 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  r next iteration
15cb0 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20   */.  int tnum; 
15cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cd0 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
15ce0 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e of index */.  
15cf0 69 6e 74 20 69 50 61 72 74 49 64 78 4c 61 62 65  int iPartIdxLabe
15d00 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
15d10 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69 73 20 6c  * Jump to this l
15d20 61 62 65 6c 20 74 6f 20 73 6b 69 70 20 61 20 72  abel to skip a r
15d30 6f 77 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ow */.  Vdbe *v;
15d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d50 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
15d60 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
15d70 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
15d80 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  e */.  KeyInfo *
15d90 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  pKey;           
15da0 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f        /* KeyInfo
15db0 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20   for index */.  
15dc0 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20  int regRecord;  
15dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15de0 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
15df0 6e 67 20 61 73 73 65 6d 62 6c 65 64 20 69 6e 64  ng assembled ind
15e00 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73  ex record */.  s
15e10 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
15e20 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a  rse->db;      /*
15e30 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
15e40 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
15e50 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
15e60 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
15e70 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
15e80 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
15e90 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
15ea0 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69  ATION.  if( sqli
15eb0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
15ec0 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e  rse, SQLITE_REIN
15ed0 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  DEX, pIndex->zNa
15ee0 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 64 62 2d  me, 0,.      db-
15ef0 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20  >aDb[iDb].zName 
15f00 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
15f10 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
15f20 2a 20 52 65 71 75 69 72 65 20 61 20 77 72 69 74  * Require a writ
15f30 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  e-lock on the ta
15f40 62 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74  ble to perform t
15f50 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  his operation */
15f60 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c  .  sqlite3TableL
15f70 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
15f80 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20   pTab->tnum, 1, 
15f90 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20  pTab->zName);.. 
15fa0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
15fb0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
15fc0 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
15fd0 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50  ;.  if( memRootP
15fe0 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e  age>=0 ){.    tn
15ff0 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65  um = memRootPage
16000 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
16010 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e  num = pIndex->tn
16020 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d  um;.  }.  pKey =
16030 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f   sqlite3KeyInfoO
16040 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  fIndex(pParse, p
16050 49 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 4f 70  Index);..  /* Op
16060 65 6e 20 74 68 65 20 73 6f 72 74 65 72 20 63 75  en the sorter cu
16070 72 73 6f 72 20 69 66 20 77 65 20 61 72 65 20 74  rsor if we are t
16080 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20  o use one. */.  
16090 69 53 6f 72 74 65 72 20 3d 20 70 50 61 72 73 65  iSorter = pParse
160a0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69  ->nTab++;.  sqli
160b0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
160c0 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20   OP_SorterOpen, 
160d0 69 53 6f 72 74 65 72 2c 20 30 2c 20 70 49 6e 64  iSorter, 0, pInd
160e0 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 28 63 68  ex->nKeyCol, (ch
160f0 61 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20 20  ar*).           
16100 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16110 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 29  KeyInfoRef(pKey)
16120 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a  , P4_KEYINFO);..
16130 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 74 61    /* Open the ta
16140 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ble. Loop throug
16150 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68  h all rows of th
16160 65 20 74 61 62 6c 65 2c 20 69 6e 73 65 72 74 69  e table, inserti
16170 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a 20 72 65  ng index.  ** re
16180 63 6f 72 64 73 20 69 6e 74 6f 20 74 68 65 20 73  cords into the s
16190 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73 71 6c 69  orter. */.  sqli
161a0 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
161b0 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
161c0 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
161d0 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71  d);.  addr1 = sq
161e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
161f0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54  v, OP_Rewind, iT
16200 61 62 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65  ab, 0); VdbeCove
16210 72 61 67 65 28 76 29 3b 0a 20 20 72 65 67 52 65  rage(v);.  regRe
16220 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
16230 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
16240 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65  ;..  sqlite3Gene
16250 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61  rateIndexKey(pPa
16260 72 73 65 2c 70 49 6e 64 65 78 2c 69 54 61 62 2c  rse,pIndex,iTab,
16270 72 65 67 52 65 63 6f 72 64 2c 30 2c 26 69 50 61  regRecord,0,&iPa
16280 72 74 49 64 78 4c 61 62 65 6c 2c 30 2c 30 29 3b  rtIdxLabel,0,0);
16290 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
162a0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
162b0 72 49 6e 73 65 72 74 2c 20 69 53 6f 72 74 65 72  rInsert, iSorter
162c0 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
162d0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 50 61  sqlite3ResolvePa
162e0 72 74 49 64 78 4c 61 62 65 6c 28 70 50 61 72 73  rtIdxLabel(pPars
162f0 65 2c 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c  e, iPartIdxLabel
16300 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16310 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
16320 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31  t, iTab, addr1+1
16330 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
16340 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
16350 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
16360 72 31 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f  r1);.  if( memRo
16370 6f 74 50 61 67 65 3c 30 20 29 20 73 71 6c 69 74  otPage<0 ) sqlit
16380 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16390 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20  OP_Clear, tnum, 
163a0 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  iDb);.  sqlite3V
163b0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
163c0 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c  OpenWrite, iIdx,
163d0 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20   tnum, iDb, .   
163e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163f0 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50   (char *)pKey, P
16400 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71  4_KEYINFO);.  sq
16410 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
16420 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42 55 4c 4b  5(v, OPFLAG_BULK
16430 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74 50 61 67  CSR|((memRootPag
16440 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f 50 32 49  e>=0)?OPFLAG_P2I
16450 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20 61 64 64  SREG:0));..  add
16460 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
16470 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
16480 74 65 72 53 6f 72 74 2c 20 69 53 6f 72 74 65 72  terSort, iSorter
16490 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 0); VdbeCovera
164a0 67 65 28 76 29 3b 0a 20 20 61 73 73 65 72 74 28  ge(v);.  assert(
164b0 20 70 4b 65 79 21 3d 30 20 7c 7c 20 64 62 2d 3e   pKey!=0 || db->
164c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
164d0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a  pParse->nErr );.
164e0 20 20 69 66 28 20 49 73 55 6e 69 71 75 65 49 6e    if( IsUniqueIn
164f0 64 65 78 28 70 49 6e 64 65 78 29 20 26 26 20 70  dex(pIndex) && p
16500 4b 65 79 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  Key!=0 ){.    in
16510 74 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t j2 = sqlite3Vd
16520 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
16530 20 2b 20 33 3b 0a 20 20 20 20 73 71 6c 69 74 65   + 3;.    sqlite
16540 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16550 50 5f 47 6f 74 6f 2c 20 30 2c 20 6a 32 29 3b 0a  P_Goto, 0, j2);.
16560 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
16570 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
16580 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  dr(v);.    sqlit
16590 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
165a0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 43 6f 6d 70  v, OP_SorterComp
165b0 61 72 65 2c 20 69 53 6f 72 74 65 72 2c 20 6a 32  are, iSorter, j2
165c0 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a 20 20 20  , regRecord,.   
165d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165e0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 4b        pIndex->nK
165f0 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65  eyCol); VdbeCove
16600 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
16610 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72  ite3UniqueConstr
16620 61 69 6e 74 28 70 50 61 72 73 65 2c 20 4f 45 5f  aint(pParse, OE_
16630 41 62 6f 72 74 2c 20 70 49 6e 64 65 78 29 3b 0a  Abort, pIndex);.
16640 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64    }else{.    add
16650 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
16660 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
16670 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
16680 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f  eAddOp3(v, OP_So
16690 72 74 65 72 44 61 74 61 2c 20 69 53 6f 72 74 65  rterData, iSorte
166a0 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 69 49  r, regRecord, iI
166b0 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dx);.  sqlite3Vd
166c0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4c  beAddOp3(v, OP_L
166d0 61 73 74 2c 20 69 49 64 78 2c 20 30 2c 20 2d 31  ast, iIdx, 0, -1
166e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
166f0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  AddOp3(v, OP_Idx
16700 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72 65  Insert, iIdx, re
16710 67 52 65 63 6f 72 64 2c 20 30 29 3b 0a 20 20 73  gRecord, 0);.  s
16720 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
16730 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
16740 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73  SEEKRESULT);.  s
16750 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
16760 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
16770 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
16780 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16790 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69  OP_SorterNext, i
167a0 53 6f 72 74 65 72 2c 20 61 64 64 72 32 29 3b 20  Sorter, addr2); 
167b0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
167c0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
167d0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
167e0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ;..  sqlite3Vdbe
167f0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
16800 73 65 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c  se, iTab);.  sql
16810 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
16820 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78  , OP_Close, iIdx
16830 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16840 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
16850 73 65 2c 20 69 53 6f 72 74 65 72 29 3b 0a 7d 0a  se, iSorter);.}.
16860 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
16870 68 65 61 70 20 73 70 61 63 65 20 74 6f 20 68 6f  heap space to ho
16880 6c 64 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65  ld an Index obje
16890 63 74 20 77 69 74 68 20 6e 43 6f 6c 20 63 6f 6c  ct with nCol col
168a0 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72  umns..**.** Incr
168b0 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 63 61 74  ease the allocat
168c0 69 6f 6e 20 73 69 7a 65 20 74 6f 20 70 72 6f 76  ion size to prov
168d0 69 64 65 20 61 6e 20 65 78 74 72 61 20 6e 45 78  ide an extra nEx
168e0 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20  tra bytes.** of 
168f0 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 73  8-byte aligned s
16900 70 61 63 65 20 61 66 74 65 72 20 74 68 65 20 49  pace after the I
16910 6e 64 65 78 20 6f 62 6a 65 63 74 20 61 6e 64 20  ndex object and 
16920 72 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e  return a.** poin
16930 74 65 72 20 74 6f 20 74 68 69 73 20 65 78 74 72  ter to this extr
16940 61 20 73 70 61 63 65 20 69 6e 20 2a 70 70 45 78  a space in *ppEx
16950 74 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73  tra..*/.Index *s
16960 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e  qlite3AllocateIn
16970 64 65 78 4f 62 6a 65 63 74 28 0a 20 20 73 71 6c  dexObject(.  sql
16980 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
16990 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
169a0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 31  nnection */.  i1
169b0 36 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  6 nCol,         
169c0 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
169d0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
169e0 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
169f0 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
16a00 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16a10 66 20 62 79 74 65 73 20 6f 66 20 65 78 74 72 61  f bytes of extra
16a20 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 20   space to alloc 
16a30 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 45 78  */.  char **ppEx
16a40 74 72 61 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  tra       /* Poi
16a50 6e 74 65 72 20 74 6f 20 74 68 65 20 22 65 78 74  nter to the "ext
16a60 72 61 22 20 73 70 61 63 65 20 2a 2f 0a 29 7b 0a  ra" space */.){.
16a70 20 20 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20    Index *p;     
16a80 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
16a90 74 65 64 20 69 6e 64 65 78 20 6f 62 6a 65 63 74  ted index object
16aa0 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   */.  int nByte;
16ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
16ac0 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
16ad0 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2b 20   Index object + 
16ae0 61 72 72 61 79 73 20 2a 2f 0a 0a 20 20 6e 42 79  arrays */..  nBy
16af0 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  te = ROUND8(size
16b00 6f 66 28 49 6e 64 65 78 29 29 20 2b 20 20 20 20  of(Index)) +    
16b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
16b20 65 78 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f  ex structure  */
16b30 0a 20 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44  .          ROUND
16b40 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a  8(sizeof(char*)*
16b50 6e 43 6f 6c 29 20 2b 20 20 20 20 20 20 20 20 20  nCol) +         
16b60 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20  /* Index.azColl 
16b70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
16b80 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4c   ROUND8(sizeof(L
16b90 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 20  ogEst)*(nCol+1) 
16ba0 2b 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61  +     /* Index.a
16bb0 69 52 6f 77 4c 6f 67 45 73 74 20 20 20 2a 2f 0a  iRowLogEst   */.
16bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bd0 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f   sizeof(i16)*nCo
16be0 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f  l +            /
16bf0 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e  * Index.aiColumn
16c00 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
16c10 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38         sizeof(u8
16c20 29 2a 6e 43 6f 6c 29 3b 20 20 20 20 20 20 20 20  )*nCol);        
16c30 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53       /* Index.aS
16c40 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 20  ortOrder */.  p 
16c50 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
16c60 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20  cZero(db, nByte 
16c70 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28  + nExtra);.  if(
16c80 20 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a   p ){.    char *
16c90 70 45 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a  pExtra = ((char*
16ca0 29 70 29 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  )p)+ROUND8(sizeo
16cb0 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 70  f(Index));.    p
16cc0 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72  ->azColl = (char
16cd0 2a 2a 29 70 45 78 74 72 61 3b 20 20 20 20 20 20  **)pExtra;      
16ce0 20 70 45 78 74 72 61 20 2b 3d 20 52 4f 55 4e 44   pExtra += ROUND
16cf0 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a  8(sizeof(char*)*
16d00 6e 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 69  nCol);.    p->ai
16d10 52 6f 77 4c 6f 67 45 73 74 20 3d 20 28 4c 6f 67  RowLogEst = (Log
16d20 45 73 74 2a 29 70 45 78 74 72 61 3b 20 70 45 78  Est*)pExtra; pEx
16d30 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f  tra += sizeof(Lo
16d40 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a  gEst)*(nCol+1);.
16d50 20 20 20 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20      p->aiColumn 
16d60 3d 20 28 69 31 36 2a 29 70 45 78 74 72 61 3b 20  = (i16*)pExtra; 
16d70 20 20 20 20 20 20 70 45 78 74 72 61 20 2b 3d 20        pExtra += 
16d80 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c  sizeof(i16)*nCol
16d90 3b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72  ;.    p->aSortOr
16da0 64 65 72 20 3d 20 28 75 38 2a 29 70 45 78 74 72  der = (u8*)pExtr
16db0 61 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d  a;.    p->nColum
16dc0 6e 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d  n = nCol;.    p-
16dd0 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20  >nKeyCol = nCol 
16de0 2d 20 31 3b 0a 20 20 20 20 2a 70 70 45 78 74 72  - 1;.    *ppExtr
16df0 61 20 3d 20 28 28 63 68 61 72 2a 29 70 29 20 2b  a = ((char*)p) +
16e00 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65   nByte;.  }.  re
16e10 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
16e20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e   Create a new in
16e30 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74  dex for an SQL t
16e40 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e  able.  pName1.pN
16e50 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65  ame2 is the name
16e60 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a   of the index .*
16e70 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69  * and pTblList i
16e80 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
16e90 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
16ea0 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
16eb0 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65  Both will .** be
16ec0 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d   NULL for a prim
16ed0 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e  ary key or an in
16ee0 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61  dex that is crea
16ef0 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61  ted to satisfy a
16f00 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  .** UNIQUE const
16f10 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c  raint.  If pTabl
16f20 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65  e and pIndex are
16f30 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73   NULL, use pPars
16f40 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20  e->pNewTable.** 
16f50 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  as the table to 
16f60 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61  be indexed.  pPa
16f70 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
16f80 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69  s a table that i
16f90 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62  s.** currently b
16fa0 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
16fb0 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42   by a CREATE TAB
16fc0 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
16fd0 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c  .** pList is a l
16fe0 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
16ff0 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
17000 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c  List will be NUL
17010 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  L if this.** is 
17020 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
17030 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69   unique-constrai
17040 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
17050 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64  ecent column add
17060 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62  ed.** to the tab
17070 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
17080 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
17090 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
170a0 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64  index is created
170b0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 72   successfully, r
170c0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
170d0 74 6f 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78  to the new Index
170e0 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 54  .** structure. T
170f0 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 73  his is used by s
17100 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79  qlite3AddPrimary
17110 4b 65 79 28 29 20 74 6f 20 6d 61 72 6b 20 74 68  Key() to mark th
17120 65 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 74 68  e index.** as th
17130 65 20 74 61 62 6c 65 73 20 70 72 69 6d 61 72 79  e tables primary
17140 20 6b 65 79 20 28 49 6e 64 65 78 2e 69 64 78 54   key (Index.idxT
17150 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54  ype==SQLITE_IDXT
17160 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 0a  YPE_PRIMARYKEY).
17170 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65  */.Index *sqlite
17180 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20  3CreateIndex(.  
17190 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
171a0 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d     /* All inform
171b0 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73  ation about this
171c0 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65   parse */.  Toke
171d0 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f  n *pName1,     /
171e0 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20  * First part of 
171f0 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20  index name. May 
17200 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b  be NULL */.  Tok
17210 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
17220 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f  /* Second part o
17230 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61  f index name. Ma
17240 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53  y be NULL */.  S
17250 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65  rcList *pTblName
17260 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e  , /* Table to in
17270 64 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d  dex. Use pParse-
17280 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20  >pNewTable if 0 
17290 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
172a0 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73  List,   /* A lis
172b0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
172c0 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
172d0 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
172e0 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20     /* OE_Abort, 
172f0 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65  OE_Ignore, OE_Re
17300 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e  place, or OE_Non
17310 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53  e */.  Token *pS
17320 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  tart,     /* The
17330 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
17340 61 74 20 62 65 67 69 6e 73 20 74 68 69 73 20 73  at begins this s
17350 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78  tatement */.  Ex
17360 70 72 20 2a 70 50 49 57 68 65 72 65 2c 20 20 20  pr *pPIWhere,   
17370 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
17380 20 66 6f 72 20 70 61 72 74 69 61 6c 20 69 6e 64   for partial ind
17390 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  ices */.  int so
173a0 72 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20  rtOrder,     /* 
173b0 53 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72  Sort order of pr
173c0 69 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70  imary key when p
173d0 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20  List==NULL */.  
173e0 69 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 20 20  int ifNotExist  
173f0 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72     /* Omit error
17400 20 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64   if index alread
17410 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20  y exists */.){. 
17420 20 49 6e 64 65 78 20 2a 70 52 65 74 20 3d 20 30   Index *pRet = 0
17430 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  ;     /* Pointer
17440 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
17450 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
17460 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
17470 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
17480 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d   Index *pIndex =
17490 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64   0;   /* The ind
174a0 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  ex to be created
174b0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
174c0 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61  e = 0;     /* Na
174d0 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
174e0 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
174f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
17500 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
17510 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20  s in zName */.  
17520 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 44 62 46 69  int i, j;.  DbFi
17530 78 65 72 20 73 46 69 78 3b 20 20 20 20 20 20 20  xer sFix;       
17540 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e   /* For assignin
17550 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73  g database names
17560 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20   to pTable */.  
17570 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d 61 73  int sortOrderMas
17580 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e  k;   /* 1 to hon
17590 6f 72 20 44 45 53 43 20 69 6e 20 69 6e 64 65 78  or DESC in index
175a0 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20  .  0 to ignore. 
175b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
175c0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
175d0 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20   Db *pDb;       
175e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65        /* The spe
175f0 63 69 66 69 63 20 74 61 62 6c 65 20 63 6f 6e 74  cific table cont
17600 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78  aining the index
17610 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ed database */. 
17620 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
17630 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
17640 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
17650 68 61 74 20 69 73 20 62 65 69 6e 67 20 77 72 69  hat is being wri
17660 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tten */.  Token 
17670 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f  *pName = 0;    /
17680 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61  * Unqualified na
17690 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
176a0 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20 73  to create */.  s
176b0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
176c0 74 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20  tem *pListItem; 
176d0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
176e0 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20 63  ver pList */.  c
176f0 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61  onst Column *pTa
17700 62 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  bCol;           
17710 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  /* A column in t
17720 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
17730 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 20 20 20  t nExtra = 0;   
17740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17750 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  * Space allocate
17760 64 20 66 6f 72 20 7a 45 78 74 72 61 5b 5d 20 2a  d for zExtra[] *
17770 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 43 6f  /.  int nExtraCo
17780 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
17790 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
177a0 66 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  f extra columns 
177b0 6e 65 65 64 65 64 20 2a 2f 0a 20 20 63 68 61 72  needed */.  char
177c0 20 2a 7a 45 78 74 72 61 20 3d 20 30 3b 20 20 20   *zExtra = 0;   
177d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
177e0 45 78 74 72 61 20 73 70 61 63 65 20 61 66 74 65  Extra space afte
177f0 72 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65  r the Index obje
17800 63 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ct */.  Index *p
17810 50 6b 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  Pk = 0;      /* 
17820 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
17830 78 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f  x for WITHOUT RO
17840 57 49 44 20 74 61 62 6c 65 73 20 2a 2f 0a 0a 20  WID tables */.. 
17850 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
17860 61 69 6c 65 64 20 7c 7c 20 49 4e 5f 44 45 43 4c  ailed || IN_DECL
17870 41 52 45 5f 56 54 41 42 20 7c 7c 20 70 50 61 72  ARE_VTAB || pPar
17880 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20  se->nErr>0 ){.  
17890 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
178a0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
178b0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
178c0 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
178d0 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
178e0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
178f0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  _index;.  }..  /
17900 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
17910 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
17920 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65   be indexed.  Re
17930 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f  turn early if no
17940 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
17950 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
17960 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74  ){..    /* Use t
17970 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65  he two-part inde
17980 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  x name to determ
17990 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ine the database
179a0 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72   .    ** to sear
179b0 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ch for the table
179c0 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c  . 'Fix' the tabl
179d0 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64  e name to this d
179e0 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  b.    ** before 
179f0 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74  looking up the t
17a00 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
17a10 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20   assert( pName1 
17a20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20  && pName2 );.   
17a30 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
17a40 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
17a50 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
17a60 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  , &pName);.    i
17a70 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20  f( iDb<0 ) goto 
17a80 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
17a90 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  x;.    assert( p
17aa0 4e 61 6d 65 20 26 26 20 70 4e 61 6d 65 2d 3e 7a  Name && pName->z
17ab0 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
17ac0 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a  ITE_OMIT_TEMPDB.
17ad0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e      /* If the in
17ae0 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71  dex name was unq
17af0 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20  ualified, check 
17b00 69 66 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  if the table.   
17b10 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61   ** is a temp ta
17b20 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20  ble. If so, set 
17b30 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
17b40 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69  1. Do not do thi
17b50 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e 69 74  s.    ** if init
17b60 69 61 6c 69 73 69 6e 67 20 61 20 64 61 74 61 62  ialising a datab
17b70 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20  ase schema..    
17b80 2a 2f 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  */.    if( !db->
17b90 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
17ba0 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
17bb0 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70  3SrcListLookup(p
17bc0 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29  Parse, pTblName)
17bd0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d  ;.      if( pNam
17be0 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62  e2->n==0 && pTab
17bf0 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d   && pTab->pSchem
17c00 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  a==db->aDb[1].pS
17c10 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20  chema ){.       
17c20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20   iDb = 1;.      
17c30 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
17c40 20 20 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e      sqlite3FixIn
17c50 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
17c60 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20  , iDb, "index", 
17c70 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
17c80 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
17c90 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d  t(&sFix, pTblNam
17ca0 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42  e) ){.      /* B
17cb0 65 63 61 75 73 65 20 74 68 65 20 70 61 72 73 65  ecause the parse
17cc0 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62  r constructs pTb
17cd0 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e  lName from a sin
17ce0 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a  gle identifier,.
17cf0 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
17d00 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e  FixSrcList can n
17d10 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20  ever fail. */.  
17d20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20      assert(0);. 
17d30 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20     }.    pTab = 
17d40 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
17d50 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30  leItem(pParse, 0
17d60 2c 20 26 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30  , &pTblName->a[0
17d70 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
17d80 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
17d90 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 30 20 29  ==0 || pTab==0 )
17da0 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d  ;.    if( pTab==
17db0 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
17dc0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
17dd0 69 66 28 20 69 44 62 3d 3d 31 20 26 26 20 64 62  if( iDb==1 && db
17de0 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
17df0 6d 61 21 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma!=pTab->pSchem
17e00 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  a ){.      sqlit
17e10 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
17e20 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 22  e, .           "
17e30 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 61 20  cannot create a 
17e40 54 45 4d 50 20 69 6e 64 65 78 20 6f 6e 20 6e 6f  TEMP index on no
17e50 6e 2d 54 45 4d 50 20 74 61 62 6c 65 20 5c 22 25  n-TEMP table \"%
17e60 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\"",.          
17e70 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
17e80 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
17e90 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
17ea0 20 7d 0a 20 20 20 20 69 66 28 20 21 48 61 73 52   }.    if( !HasR
17eb0 6f 77 69 64 28 70 54 61 62 29 20 29 20 70 50 6b  owid(pTab) ) pPk
17ec0 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
17ed0 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
17ee0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
17ef0 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29  sert( pName==0 )
17f00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ;.    assert( pS
17f10 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70  tart==0 );.    p
17f20 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
17f30 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28  ewTable;.    if(
17f40 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78   !pTab ) goto ex
17f50 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
17f60 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
17f70 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
17f80 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
17f90 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20  a);.  }.  pDb = 
17fa0 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a  &db->aDb[iDb];..
17fb0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
17fc0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
17fd0 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
17fe0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
17ff0 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e  trNICmp(pTab->zN
18000 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
18010 37 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26  7)==0 .       &&
18020 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
18030 30 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  0.#if SQLITE_USE
18040 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
18050 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
18060 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28  e3UserAuthTable(
18070 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 0a  pTab->zName)==0.
18080 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 26 26  #endif.       &&
18090 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
180a0 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d  (&pTab->zName[7]
180b0 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c 39 29 21  ,"altertab_",9)!
180c0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
180d0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
180e0 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
180f0 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c  not be indexed",
18100 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
18110 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
18120 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
18130 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18140 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54  IT_VIEW.  if( pT
18150 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
18160 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
18170 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77  sg(pParse, "view
18180 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
18190 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f  exed");.    goto
181a0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
181b0 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ex;.  }.#endif.#
181c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
181d0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
181e0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
181f0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
18200 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
18210 72 73 65 2c 20 22 76 69 72 74 75 61 6c 20 74 61  rse, "virtual ta
18220 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  bles may not be 
18230 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67  indexed");.    g
18240 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18250 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69  index;.  }.#endi
18260 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  f..  /*.  ** Fin
18270 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  d the name of th
18280 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73  e index.  Make s
18290 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74  ure there is not
182a0 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72   already another
182b0 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74  .  ** index or t
182c0 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61  able with the sa
182d0 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a  me name.  .  **.
182e0 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20    ** Exception: 
182f0 20 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69   If we are readi
18300 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ng the names of 
18310 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65  permanent indice
18320 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20  s from the.  ** 
18330 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
18340 62 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d  ble (because som
18350 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
18360 63 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65  changed the sche
18370 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65  ma) and.  ** one
18380 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61   of the index na
18390 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74  mes collides wit
183a0 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  h the name of a 
183b0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
183c0 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74  or.  ** index, t
183d0 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74  hen we will cont
183e0 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20  inue to process 
183f0 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a  this index..  **
18400 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d  .  ** If pName==
18410 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  0 it means that 
18420 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c  we are.  ** deal
18430 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61  ing with a prima
18440 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45  ry key or UNIQUE
18450 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65   constraint.  We
18460 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20   have to invent 
18470 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d  our.  ** own nam
18480 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e  e..  */.  if( pN
18490 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  ame ){.    zName
184a0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
184b0 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
184c0 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  e);.    if( zNam
184d0 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  e==0 ) goto exit
184e0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
184f0 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
18500 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  ->z!=0 );.    if
18510 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
18520 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
18530 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  ame(pParse, zNam
18540 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  e) ){.      goto
18550 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18560 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
18570 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
18580 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
18590 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
185a0 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20  b, zName, 0)!=0 
185b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
185c0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
185d0 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
185e0 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d  eady a table nam
185f0 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ed %s", zName);.
18600 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
18610 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
18620 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18630 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
18640 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
18650 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30  , pDb->zName)!=0
18660 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69   ){.      if( !i
18670 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20 20 20  fNotExist ){.   
18680 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
18690 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
186a0 64 65 78 20 25 73 20 61 6c 72 65 61 64 79 20 65  dex %s already e
186b0 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  xists", zName);.
186c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
186d0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62       assert( !db
186e0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
186f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
18700 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
18710 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
18720 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
18730 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18740 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  x;.    }.  }else
18750 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
18760 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20   Index *pLoop;. 
18770 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61     for(pLoop=pTa
18780 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20  b->pIndex, n=1; 
18790 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
187a0 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b  op->pNext, n++){
187b0 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  }.    zName = sq
187c0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
187d0 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64   "sqlite_autoind
187e0 65 78 5f 25 73 5f 25 64 22 2c 20 70 54 61 62 2d  ex_%s_%d", pTab-
187f0 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20  >zName, n);.    
18800 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  if( zName==0 ){.
18810 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
18820 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18830 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68    }.  }..  /* Ch
18840 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a  eck for authoriz
18850 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20  ation to create 
18860 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23  an index..  */.#
18870 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18880 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
18890 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  .  {.    const c
188a0 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e  har *zDb = pDb->
188b0 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73  zName;.    if( s
188c0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
188d0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49  pParse, SQLITE_I
188e0 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41  NSERT, SCHEMA_TA
188f0 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62  BLE(iDb), 0, zDb
18900 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
18910 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18920 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d  x;.    }.    i =
18930 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49   SQLITE_CREATE_I
18940 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f  NDEX;.    if( !O
18950 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
18960 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54  b==1 ) i = SQLIT
18970 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e  E_CREATE_TEMP_IN
18980 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
18990 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
189a0 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  arse, i, zName, 
189b0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  pTab->zName, zDb
189c0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
189d0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
189e0 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  x;.    }.  }.#en
189f0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69  dif..  /* If pLi
18a00 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20  st==0, it means 
18a10 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
18a20 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20   called to make 
18a30 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b  a primary.  ** k
18a40 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61  ey out of the la
18a50 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20  st column added 
18a60 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  to the table und
18a70 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
18a80 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20  .  ** So create 
18a90 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73  a fake list to s
18aa0 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20  imulate this..  
18ab0 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  */.  if( pList==
18ac0 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
18ad0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
18ae0 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
18af0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  , 0);.    if( pL
18b00 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ist==0 ) goto ex
18b10 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18b20 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  .    pList->a[0]
18b30 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  .zName = sqlite3
18b40 44 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d  DbStrDup(pParse-
18b50 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
18b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b70 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
18b80 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
18b90 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol-1].zName);.  
18ba0 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f    pList->a[0].so
18bb0 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29 73 6f  rtOrder = (u8)so
18bc0 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  rtOrder;.  }..  
18bd0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
18be0 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  w many bytes of 
18bf0 73 70 61 63 65 20 61 72 65 20 72 65 71 75 69 72  space are requir
18c00 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c  ed to store expl
18c10 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63  icitly.  ** spec
18c20 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ified collation 
18c30 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a  sequence names..
18c40 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
18c50 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
18c60 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
18c70 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
18c80 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
18c90 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20  f( pExpr ){.    
18ca0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
18cb0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
18cc0 29 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20  );.      nExtra 
18cd0 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74 65 33 53  += (1 + sqlite3S
18ce0 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75  trlen30(pExpr->u
18cf0 2e 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 7d  .zToken));.    }
18d00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  .  }..  /* .  **
18d10 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e   Allocate the in
18d20 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a  dex structure. .
18d30 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73    */.  nName = s
18d40 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
18d50 4e 61 6d 65 29 3b 0a 20 20 6e 45 78 74 72 61 43  Name);.  nExtraC
18d60 6f 6c 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e  ol = pPk ? pPk->
18d70 6e 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a 20 20 70  nKeyCol : 1;.  p
18d80 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 41  Index = sqlite3A
18d90 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65  llocateIndexObje
18da0 63 74 28 64 62 2c 20 70 4c 69 73 74 2d 3e 6e 45  ct(db, pList->nE
18db0 78 70 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c 2c  xpr + nExtraCol,
18dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18de0 20 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 6e         nName + n
18df0 45 78 74 72 61 20 2b 20 31 2c 20 26 7a 45 78 74  Extra + 1, &zExt
18e00 72 61 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ra);.  if( db->m
18e10 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
18e20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
18e30 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
18e40 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
18e50 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49  YTE_ALIGNMENT(pI
18e60 6e 64 65 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  ndex->aiRowLogEs
18e70 74 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  t) );.  assert( 
18e80 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
18e90 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 7a 43  MENT(pIndex->azC
18ea0 6f 6c 6c 29 20 29 3b 0a 20 20 70 49 6e 64 65 78  oll) );.  pIndex
18eb0 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 45 78 74 72 61  ->zName = zExtra
18ec0 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 4e  ;.  zExtra += nN
18ed0 61 6d 65 20 2b 20 31 3b 0a 20 20 6d 65 6d 63 70  ame + 1;.  memcp
18ee0 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  y(pIndex->zName,
18ef0 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29   zName, nName+1)
18f00 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  ;.  pIndex->pTab
18f10 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e  le = pTab;.  pIn
18f20 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28  dex->onError = (
18f30 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49  u8)onError;.  pI
18f40 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  ndex->uniqNotNul
18f50 6c 20 3d 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  l = onError!=OE_
18f60 4e 6f 6e 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  None;.  pIndex->
18f70 69 64 78 54 79 70 65 20 3d 20 70 4e 61 6d 65 20  idxType = pName 
18f80 3f 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  ? SQLITE_IDXTYPE
18f90 5f 41 50 50 44 45 46 20 3a 20 53 51 4c 49 54 45  _APPDEF : SQLITE
18fa0 5f 49 44 58 54 59 50 45 5f 55 4e 49 51 55 45 3b  _IDXTYPE_UNIQUE;
18fb0 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  .  pIndex->pSche
18fc0 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ma = db->aDb[iDb
18fd0 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 49 6e  ].pSchema;.  pIn
18fe0 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 70  dex->nKeyCol = p
18ff0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69  List->nExpr;.  i
19000 66 28 20 70 50 49 57 68 65 72 65 20 29 7b 0a 20  f( pPIWhere ){. 
19010 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
19020 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70  eSelfReference(p
19030 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f  Parse, pTab, NC_
19040 50 61 72 74 49 64 78 2c 20 70 50 49 57 68 65 72  PartIdx, pPIWher
19050 65 2c 20 30 29 3b 0a 20 20 20 20 70 49 6e 64 65  e, 0);.    pInde
19060 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
19070 20 3d 20 70 50 49 57 68 65 72 65 3b 0a 20 20 20   = pPIWhere;.   
19080 20 70 50 49 57 68 65 72 65 20 3d 20 30 3b 0a 20   pPIWhere = 0;. 
19090 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c   }.  assert( sql
190a0 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
190b0 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
190c0 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
190d0 6f 20 73 65 65 20 69 66 20 77 65 20 73 68 6f 75  o see if we shou
190e0 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65  ld honor DESC re
190f0 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20  quests on index 
19100 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69  columns.  */.  i
19110 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  f( pDb->pSchema-
19120 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20  >file_format>=4 
19130 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72  ){.    sortOrder
19140 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20  Mask = -1;   /* 
19150 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20  Honor DESC */.  
19160 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f  }else{.    sortO
19170 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20  rderMask = 0;   
19180 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20   /* Ignore DESC 
19190 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61  */.  }..  /* Sca
191a0 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  n the names of t
191b0 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
191c0 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
191d0 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c  dexed and.  ** l
191e0 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  oad the column i
191f0 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20  ndices into the 
19200 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  Index structure.
19210 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f    Report an erro
19220 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f  r.  ** if any co
19230 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e  lumn is not foun
19240 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44  d..  **.  ** TOD
19250 4f 3a 20 20 41 64 64 20 61 20 74 65 73 74 20 74  O:  Add a test t
19260 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
19270 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e   the same column
19280 20 69 73 20 6e 6f 74 20 6e 61 6d 65 64 0a 20 20   is not named.  
19290 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63  ** more than onc
192a0 65 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  e within the sam
192b0 65 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74  e index.  Only t
192c0 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63  he first instanc
192d0 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f  e of.  ** the co
192e0 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65 72 20 62  lumn will ever b
192f0 65 20 75 73 65 64 20 62 79 20 74 68 65 20 6f 70  e used by the op
19300 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74 65 20 74  timizer.  Note t
19310 68 61 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20  hat using the.  
19320 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 6d  ** same column m
19330 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 63 61  ore than once ca
19340 6e 6e 6f 74 20 62 65 20 61 6e 20 65 72 72 6f 72  nnot be an error
19350 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
19360 75 6c 64 20 0a 20 20 2a 2a 20 62 72 65 61 6b 20  uld .  ** break 
19370 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
19380 69 62 69 6c 69 74 79 20 2d 20 69 74 20 6e 65 65  ibility - it nee
19390 64 73 20 74 6f 20 62 65 20 61 20 77 61 72 6e 69  ds to be a warni
193a0 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ng..  */.  for(i
193b0 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c  =0, pListItem=pL
193c0 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d  ist->a; i<pList-
193d0 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69  >nExpr; i++, pLi
193e0 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 63  stItem++){.    c
193f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 4e  onst char *zColN
19400 61 6d 65 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d  ame = pListItem-
19410 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20  >zName;.    int 
19420 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
19430 65 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43  er;.    char *zC
19440 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
19450 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
19460 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
19470 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 6a 3d  e */..    for(j=
19480 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d  0, pTabCol=pTab-
19490 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e  >aCol; j<pTab->n
194a0 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62 43 6f  Col; j++, pTabCo
194b0 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l++){.      if( 
194c0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
194d0 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62 43 6f 6c  ColName, pTabCol
194e0 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ->zName)==0 ) br
194f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
19500 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c  f( j>=pTab->nCol
19510 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
19520 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
19530 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20  , "table %s has 
19540 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20  no column named 
19550 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61  %s",.        pTa
19560 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61  b->zName, zColNa
19570 6d 65 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  me);.      pPars
19580 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
19590 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   1;.      goto e
195a0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
195b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
195c0 72 74 28 20 6a 3c 3d 30 78 37 66 66 66 20 29 3b  rt( j<=0x7fff );
195d0 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  .    pIndex->aiC
195e0 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 28 69 31 36 29  olumn[i] = (i16)
195f0 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  j;.    if( pList
19600 49 74 65 6d 2d 3e 70 45 78 70 72 20 29 7b 0a 20  Item->pExpr ){. 
19610 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a       int nColl;.
19620 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
19630 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  istItem->pExpr->
19640 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29  op==TK_COLLATE )
19650 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  ;.      zColl = 
19660 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
19670 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
19680 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    nColl = sqlite
19690 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29  3Strlen30(zColl)
196a0 20 2b 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65   + 1;.      asse
196b0 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c  rt( nExtra>=nCol
196c0 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  l );.      memcp
196d0 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c  y(zExtra, zColl,
196e0 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7a   nColl);.      z
196f0 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20  Coll = zExtra;. 
19700 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e       zExtra += n
19710 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78 74  Coll;.      nExt
19720 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20  ra -= nColl;.   
19730 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43   }else{.      zC
19740 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  oll = pTab->aCol
19750 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [j].zColl;.     
19760 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 7a 43   if( !zColl ) zC
19770 6f 6c 6c 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a  oll = "BINARY";.
19780 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64      }.    if( !d
19790 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
197a0 21 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f  !sqlite3LocateCo
197b0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43  llSeq(pParse, zC
197c0 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  oll) ){.      go
197d0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
197e0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
197f0 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
19800 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72  ] = zColl;.    r
19810 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
19820 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73  r = pListItem->s
19830 6f 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74 4f  ortOrder & sortO
19840 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49  rderMask;.    pI
19850 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
19860 5b 69 5d 20 3d 20 28 75 38 29 72 65 71 75 65 73  [i] = (u8)reques
19870 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  tedSortOrder;.  
19880 20 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c    if( pTab->aCol
19890 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29  [j].notNull==0 )
198a0 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74   pIndex->uniqNot
198b0 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Null = 0;.  }.  
198c0 69 66 28 20 70 50 6b 20 29 7b 0a 20 20 20 20 66  if( pPk ){.    f
198d0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e  or(j=0; j<pPk->n
198e0 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  KeyCol; j++){.  
198f0 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50 6b 2d      int x = pPk-
19900 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
19910 20 20 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d      if( hasColum
19920 6e 28 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  n(pIndex->aiColu
19930 6d 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79  mn, pIndex->nKey
19940 43 6f 6c 2c 20 78 29 20 29 7b 0a 20 20 20 20 20  Col, x) ){.     
19950 20 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75     pIndex->nColu
19960 6d 6e 2d 2d 3b 20 0a 20 20 20 20 20 20 7d 65 6c  mn--; .      }el
19970 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64  se{.        pInd
19980 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
19990 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  = x;.        pIn
199a0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d  dex->azColl[i] =
199b0 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b   pPk->azColl[j];
199c0 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
199d0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
199e0 20 70 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72   pPk->aSortOrder
199f0 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b  [j];.        i++
19a00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19a10 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70      assert( i==p
19a20 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Index->nColumn )
19a30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
19a40 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
19a50 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 70 49 6e  i] = -1;.    pIn
19a60 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d  dex->azColl[i] =
19a70 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a 20   "BINARY";.  }. 
19a80 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52   sqlite3DefaultR
19a90 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 20  owEst(pIndex);. 
19aa0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65   if( pParse->pNe
19ab0 77 54 61 62 6c 65 3d 3d 30 20 29 20 65 73 74 69  wTable==0 ) esti
19ac0 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 70  mateIndexWidth(p
19ad0 49 6e 64 65 78 29 3b 0a 0a 20 20 69 66 28 20 70  Index);..  if( p
19ae0 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65  Tab==pParse->pNe
19af0 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a  wTable ){.    /*
19b00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   This routine ha
19b10 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f  s been called to
19b20 20 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d   create an autom
19b30 61 74 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a  atic index as a.
19b40 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66      ** result of
19b50 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
19b60 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20  r UNIQUE clause 
19b70 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69  on a column defi
19b80 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a  nition, or.    *
19b90 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  * a PRIMARY KEY 
19ba0 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65  or UNIQUE clause
19bb0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63   following the c
19bc0 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e  olumn definition
19bd0 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f  s..    ** i.e. o
19be0 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20  ne of:.    **.  
19bf0 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
19c00 45 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45  E t(x PRIMARY KE
19c10 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52  Y, y);.    ** CR
19c20 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20  EATE TABLE t(x, 
19c30 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29  y, UNIQUE(x, y))
19c40 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
19c50 45 69 74 68 65 72 20 77 61 79 2c 20 63 68 65 63  Either way, chec
19c60 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
19c70 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61  table already ha
19c80 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e  s such an index.
19c90 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64   If.    ** so, d
19ca0 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65 61  on't bother crea
19cb0 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54  ting this one. T
19cc0 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73  his only applies
19cd0 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d   to.    ** autom
19ce0 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64  atically created
19cf0 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20   indices. Users 
19d00 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77  can do as they w
19d10 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  ish with.    ** 
19d20 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73  explicit indices
19d30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
19d40 54 77 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52  Two UNIQUE or PR
19d50 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
19d60 61 69 6e 74 73 20 61 72 65 20 63 6f 6e 73 69 64  aints are consid
19d70 65 72 65 64 20 65 71 75 69 76 61 6c 65 6e 74 0a  ered equivalent.
19d80 20 20 20 20 2a 2a 20 28 61 6e 64 20 74 68 75 73      ** (and thus
19d90 20 73 75 70 70 72 65 73 73 69 6e 67 20 74 68 65   suppressing the
19da0 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65   second one) eve
19db0 6e 20 69 66 20 74 68 65 79 20 68 61 76 65 20 64  n if they have d
19dc0 69 66 66 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20  ifferent.    ** 
19dd0 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a 20 20 20  sort orders..   
19de0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
19df0 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  ere are differen
19e00 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
19e10 65 6e 63 65 73 20 6f 72 20 69 66 20 74 68 65 20  ences or if the 
19e20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a  columns of.    *
19e30 2a 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  * the constraint
19e40 20 6f 63 63 75 72 20 69 6e 20 64 69 66 66 65 72   occur in differ
19e50 65 6e 74 20 6f 72 64 65 72 73 2c 20 74 68 65 6e  ent orders, then
19e60 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73   the constraints
19e70 20 61 72 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73   are.    ** cons
19e80 69 64 65 72 65 64 20 64 69 73 74 69 6e 63 74 20  idered distinct 
19e90 61 6e 64 20 62 6f 74 68 20 72 65 73 75 6c 74 20  and both result 
19ea0 69 6e 20 73 65 70 61 72 61 74 65 20 69 6e 64 69  in separate indi
19eb0 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ces..    */.    
19ec0 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
19ed0 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
19ee0 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
19ef0 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
19f00 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20  .      int k;.  
19f10 20 20 20 20 61 73 73 65 72 74 28 20 49 73 55 6e      assert( IsUn
19f20 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20  iqueIndex(pIdx) 
19f30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
19f40 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65 21 3d   pIdx->idxType!=
19f50 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41  SQLITE_IDXTYPE_A
19f60 50 50 44 45 46 20 29 3b 0a 20 20 20 20 20 20 61  PPDEF );.      a
19f70 73 73 65 72 74 28 20 49 73 55 6e 69 71 75 65 49  ssert( IsUniqueI
19f80 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29 3b 0a  ndex(pIndex) );.
19f90 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
19fa0 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e 64 65 78  >nKeyCol!=pIndex
19fb0 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74  ->nKeyCol ) cont
19fc0 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
19fd0 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65  k=0; k<pIdx->nKe
19fe0 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  yCol; k++){.    
19ff0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1a000 7a 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  z1;.        cons
1a010 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20  t char *z2;.    
1a020 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
1a030 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65  Column[k]!=pInde
1a040 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29  x->aiColumn[k] )
1a050 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1a060 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  z1 = pIdx->azCol
1a070 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32  l[k];.        z2
1a080 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c   = pIndex->azCol
1a090 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[k];.        if
1a0a0 28 20 7a 31 21 3d 7a 32 20 26 26 20 73 71 6c 69  ( z1!=z2 && sqli
1a0b0 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a  te3StrICmp(z1, z
1a0c0 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  2) ) break;.    
1a0d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d    }.      if( k=
1a0e0 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29  =pIdx->nKeyCol )
1a0f0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
1a100 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e  dx->onError!=pIn
1a110 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a  dex->onError ){.
1a120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
1a130 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65  s constraint cre
1a140 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e  ates the same in
1a150 64 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75  dex as a previou
1a160 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  s.          ** c
1a170 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66  onstraint specif
1a180 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e  ied somewhere in
1a190 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
1a1a0 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  E statement..   
1a1b0 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65         ** Howeve
1a1c0 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43  r the ON CONFLIC
1a1d0 54 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69  T clauses are di
1a1e0 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68  fferent. If both
1a1f0 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20   this .         
1a200 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61   ** constraint a
1a210 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  nd the previous 
1a220 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74  equivalent const
1a230 72 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69  raint have expli
1a240 63 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  cit.          **
1a250 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
1a260 75 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20  uses this is an 
1a270 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65  error. Otherwise
1a280 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  , use the.      
1a290 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c      ** explicitl
1a2a0 79 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61  y specified beha
1a2b0 76 69 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64  vior for the ind
1a2c0 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ex..          */
1a2d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
1a2e0 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  (pIdx->onError==
1a2f0 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49  OE_Default || pI
1a300 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
1a310 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20  E_Default) ){.  
1a320 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1a330 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1a340 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1a350 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20     "conflicting 
1a360 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
1a370 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20  ses specified", 
1a380 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
1a390 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
1a3a0 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
1a3b0 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
1a3c0 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45         pIdx->onE
1a3d0 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f  rror = pIndex->o
1a3e0 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  nError;.        
1a3f0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1a400 20 20 20 20 20 20 70 52 65 74 20 3d 20 70 49 64        pRet = pId
1a410 78 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  x;.        goto 
1a420 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1a430 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
1a440 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  .  }..  /* Link 
1a450 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74  the new Index st
1a460 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74  ructure to its t
1a470 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20  able and to the 
1a480 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65  other.  ** in-me
1a490 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74  mory database st
1a4a0 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a  ructures. .  */.
1a4b0 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
1a4c0 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  usy ){.    Index
1a4d0 20 2a 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28   *p;.    assert(
1a4e0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
1a4f0 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
1a500 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20  Index->pSchema) 
1a510 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  );.    p = sqlit
1a520 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 49  e3HashInsert(&pI
1a530 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69  ndex->pSchema->i
1a540 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20  dxHash, .       
1a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a560 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
1a570 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69  , pIndex);.    i
1a580 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73  f( p ){.      as
1a590 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20  sert( p==pIndex 
1a5a0 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75  );  /* Malloc mu
1a5b0 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a  st have failed *
1a5c0 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c  /.      db->mall
1a5d0 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
1a5e0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1a5f0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1a600 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  }.    db->flags 
1a610 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
1a620 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69 66 28  Changes;.    if(
1a630 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
1a640 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e        pIndex->tn
1a650 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
1a660 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d  wTnum;.    }.  }
1a670 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1a680 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 43 52  s the initial CR
1a690 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
1a6a0 6d 65 6e 74 20 28 6f 72 20 43 52 45 41 54 45 20  ment (or CREATE 
1a6b0 54 41 42 4c 45 20 69 66 20 74 68 65 0a 20 20 2a  TABLE if the.  *
1a6c0 2a 20 69 6e 64 65 78 20 69 73 20 61 6e 20 69 6d  * index is an im
1a6d0 70 6c 69 65 64 20 69 6e 64 65 78 20 66 6f 72 20  plied index for 
1a6e0 61 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d  a UNIQUE or PRIM
1a6f0 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
1a700 6e 74 29 20 74 68 65 6e 0a 20 20 2a 2a 20 65 6d  nt) then.  ** em
1a710 69 74 20 63 6f 64 65 20 74 6f 20 61 6c 6c 6f 63  it code to alloc
1a720 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 72 6f  ate the index ro
1a730 6f 74 70 61 67 65 20 6f 6e 20 64 69 73 6b 20 61  otpage on disk a
1a740 6e 64 20 6d 61 6b 65 20 61 6e 20 65 6e 74 72 79  nd make an entry
1a750 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 69 6e   for.  ** the in
1a760 64 65 78 20 69 6e 20 74 68 65 20 73 71 6c 69 74  dex in the sqlit
1a770 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e_master table a
1a780 6e 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  nd populate the 
1a790 69 6e 64 65 78 20 77 69 74 68 0a 20 20 2a 2a 20  index with.  ** 
1a7a0 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74 2c 20 64  content.  But, d
1a7b0 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 69 66  o not do this if
1a7c0 20 77 65 20 61 72 65 20 73 69 6d 70 6c 79 20 72   we are simply r
1a7d0 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74  eading the sqlit
1a7e0 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61  e_master.  ** ta
1a7f0 62 6c 65 20 74 6f 20 70 61 72 73 65 20 74 68 65  ble to parse the
1a800 20 73 63 68 65 6d 61 2c 20 6f 72 20 69 66 20 74   schema, or if t
1a810 68 69 73 20 69 6e 64 65 78 20 69 73 20 74 68 65  his index is the
1a820 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
1a830 65 78 0a 20 20 2a 2a 20 6f 66 20 61 20 57 49 54  ex.  ** of a WIT
1a840 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
1a850 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
1a860 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  TblName==0 it me
1a870 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69  ans this index i
1a880 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61  s generated as a
1a890 6e 20 69 6d 70 6c 69 65 64 20 50 52 49 4d 41 52  n implied PRIMAR
1a8a0 59 20 4b 45 59 0a 20 20 2a 2a 20 6f 72 20 55 4e  Y KEY.  ** or UN
1a8b0 49 51 55 45 20 69 6e 64 65 78 20 69 6e 20 61 20  IQUE index in a 
1a8c0 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
1a8d0 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74  tement.  Since t
1a8e0 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61  he table.  ** ha
1a8f0 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61  s just been crea
1a900 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ted, it contains
1a910 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65   no data and the
1a920 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a   index initializ
1a930 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20  ation.  ** step 
1a940 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a  can be skipped..
1a950 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20    */.  else if( 
1a960 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
1a970 26 26 20 28 48 61 73 52 6f 77 69 64 28 70 54 61  && (HasRowid(pTa
1a980 62 29 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 21 3d  b) || pTblName!=
1a990 30 29 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  0) ){.    Vdbe *
1a9a0 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  v;.    char *zSt
1a9b0 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d  mt;.    int iMem
1a9c0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1a9d0 6d 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  m;..    v = sqli
1a9e0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1a9f0 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
1aa00 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
1aa10 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20  ate_index;..    
1aa20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
1aa30 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
1aa40 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 20 20 20  e, 1, iDb);..   
1aa50 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 72   /* Create the r
1aa60 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65 20  ootpage for the 
1aa70 69 6e 64 65 78 20 75 73 69 6e 67 20 43 72 65 61  index using Crea
1aa80 74 65 49 6e 64 65 78 2e 20 42 75 74 20 62 65 66  teIndex. But bef
1aa90 6f 72 65 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67  ore.    ** doing
1aaa0 20 73 6f 2c 20 63 6f 64 65 20 61 20 4e 6f 6f 70   so, code a Noop
1aab0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64   instruction and
1aac0 20 73 74 6f 72 65 20 69 74 73 20 61 64 64 72 65   store its addre
1aad0 73 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 49 6e  ss in .    ** In
1aae0 64 65 78 2e 74 6e 75 6d 2e 20 54 68 69 73 20 69  dex.tnum. This i
1aaf0 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 63 61  s required in ca
1ab00 73 65 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  se this index is
1ab10 20 61 63 74 75 61 6c 6c 79 20 61 20 0a 20 20 20   actually a .   
1ab20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
1ab30 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 69 73  and the table is
1ab40 20 61 63 74 75 61 6c 6c 79 20 61 20 57 49 54 48   actually a WITH
1ab50 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e  OUT ROWID table.
1ab60 20 49 6e 20 0a 20 20 20 20 2a 2a 20 74 68 61 74   In .    ** that
1ab70 20 63 61 73 65 20 74 68 65 20 63 6f 6e 76 65 72   case the conver
1ab80 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54  tToWithoutRowidT
1ab90 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 20 77  able() routine w
1aba0 69 6c 6c 20 72 65 70 6c 61 63 65 0a 20 20 20 20  ill replace.    
1abb0 2a 2a 20 74 68 65 20 4e 6f 6f 70 20 77 69 74 68  ** the Noop with
1abc0 20 61 20 47 6f 74 6f 20 74 6f 20 6a 75 6d 70 20   a Goto to jump 
1abd0 6f 76 65 72 20 74 68 65 20 56 44 42 45 20 63 6f  over the VDBE co
1abe0 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 65 6c  de generated bel
1abf0 6f 77 2e 20 2a 2f 0a 20 20 20 20 70 49 6e 64 65  ow. */.    pInde
1ac00 78 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c 69 74 65  x->tnum = sqlite
1ac10 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
1ac20 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 73 71 6c  P_Noop);.    sql
1ac30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ac40 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78  , OP_CreateIndex
1ac50 2c 20 69 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a 20  , iDb, iMem);.. 
1ac60 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65     /* Gather the
1ac70 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   complete text o
1ac80 66 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44  f the CREATE IND
1ac90 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74  EX statement int
1aca0 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74  o.    ** the zSt
1acb0 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  mt variable.    
1acc0 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61 72  */.    if( pStar
1acd0 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  t ){.      int n
1ace0 20 3d 20 28 69 6e 74 29 28 70 50 61 72 73 65 2d   = (int)(pParse-
1acf0 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20  >sLastToken.z - 
1ad00 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61 72  pName->z) + pPar
1ad10 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e  se->sLastToken.n
1ad20 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d  ;.      if( pNam
1ad30 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29  e->z[n-1]==';' )
1ad40 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 2f 2a 20 41   n--;.      /* A
1ad50 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74   named index wit
1ad60 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52  h an explicit CR
1ad70 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
1ad80 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53  ment */.      zS
1ad90 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
1ada0 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54 45  intf(db, "CREATE
1adb0 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a  %s INDEX %.*s",.
1adc0 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d          onError=
1add0 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20  =OE_None ? "" : 
1ade0 22 20 55 4e 49 51 55 45 22 2c 20 6e 2c 20 70 4e  " UNIQUE", n, pN
1adf0 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c  ame->z);.    }el
1ae00 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
1ae10 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
1ae20 63 72 65 61 74 65 64 20 62 79 20 61 20 50 52 49  created by a PRI
1ae30 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
1ae40 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  UE constraint */
1ae50 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20  .      /* zStmt 
1ae60 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
1ae70 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a  (""); */.      z
1ae80 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Stmt = 0;.    }.
1ae90 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65  .    /* Add an e
1aea0 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d  ntry in sqlite_m
1aeb0 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20 69  aster for this i
1aec0 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ndex.    */.    
1aed0 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
1aee0 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
1aef0 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
1af00 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69   %Q.%s VALUES('i
1af10 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c  ndex',%Q,%Q,#%d,
1af20 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64  %Q);",.        d
1af30 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
1af40 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
1af50 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70 49  iDb),.        pI
1af60 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  ndex->zName,.   
1af70 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
1af80 2c 0a 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a  ,.        iMem,.
1af90 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20          zStmt.  
1afa0 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
1afb0 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74  DbFree(db, zStmt
1afc0 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20  );..    /* Fill 
1afd0 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 64  the index with d
1afe0 61 74 61 20 61 6e 64 20 72 65 70 61 72 73 65 20  ata and reparse 
1aff0 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65  the schema. Code
1b000 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20   an OP_Expire.  
1b010 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61    ** to invalida
1b020 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69  te all pre-compi
1b030 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
1b040 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1b050 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  TblName ){.     
1b060 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
1b070 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
1b080 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20  ex, iMem);.     
1b090 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
1b0a0 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
1b0b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b0c0 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65  VdbeAddParseSche
1b0d0 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20  maOp(v, iDb,.   
1b0e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
1b0f0 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27  intf(db, "name='
1b100 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69 6e  %q' AND type='in
1b110 64 65 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a  dex'", pIndex->z
1b120 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71  Name));.      sq
1b130 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
1b140 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 29  v, OP_Expire, 0)
1b150 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
1b160 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
1b170 28 76 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  (v, pIndex->tnum
1b180 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65  );.  }..  /* Whe
1b190 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65  n adding an inde
1b1a0 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  x to the list of
1b1b0 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74   indices for a t
1b1c0 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20  able, make.  ** 
1b1d0 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  sure all indices
1b1e0 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c   labeled OE_Repl
1b1f0 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61  ace come after a
1b200 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64  ll those labeled
1b210 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e  .  ** OE_Ignore.
1b220 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
1b230 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72  ary for the corr
1b240 65 63 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  ect constraint c
1b250 68 65 63 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73  heck.  ** proces
1b260 73 69 6e 67 20 28 69 6e 20 73 71 6c 69 74 65 33  sing (in sqlite3
1b270 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69  GenerateConstrai
1b280 6e 74 43 68 65 63 6b 73 28 29 29 20 61 73 20 70  ntChecks()) as p
1b290 61 72 74 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41  art of.  ** UPDA
1b2a0 54 45 20 61 6e 64 20 49 4e 53 45 52 54 20 73 74  TE and INSERT st
1b2b0 61 74 65 6d 65 6e 74 73 2e 20 20 0a 20 20 2a 2f  atements.  .  */
1b2c0 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
1b2d0 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65  busy || pTblName
1b2e0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f  ==0 ){.    if( o
1b2f0 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61  nError!=OE_Repla
1b300 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64  ce || pTab->pInd
1b310 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c  ex==0.         |
1b320 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e  | pTab->pIndex->
1b330 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c  onError==OE_Repl
1b340 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64  ace){.      pInd
1b350 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62  ex->pNext = pTab
1b360 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
1b370 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70  pTab->pIndex = p
1b380 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65  Index;.    }else
1b390 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
1b3a0 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49  Other = pTab->pI
1b3b0 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c  ndex;.      whil
1b3c0 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74  e( pOther->pNext
1b3d0 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78   && pOther->pNex
1b3e0 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52  t->onError!=OE_R
1b3f0 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20  eplace ){.      
1b400 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65    pOther = pOthe
1b410 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
1b420 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  }.      pIndex->
1b430 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e  pNext = pOther->
1b440 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74  pNext;.      pOt
1b450 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e  her->pNext = pIn
1b460 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
1b470 52 65 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  Ret = pIndex;.  
1b480 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20    pIndex = 0;.  
1b490 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70  }..  /* Clean up
1b4a0 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20   before exiting 
1b4b0 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69  */.exit_create_i
1b4c0 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64  ndex:.  if( pInd
1b4d0 65 78 20 29 20 66 72 65 65 49 6e 64 65 78 28 64  ex ) freeIndex(d
1b4e0 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 73 71  b, pIndex);.  sq
1b4f0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1b500 64 62 2c 20 70 50 49 57 68 65 72 65 29 3b 0a 20  db, pPIWhere);. 
1b510 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1b520 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
1b530 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  );.  sqlite3SrcL
1b540 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54  istDelete(db, pT
1b550 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  blName);.  sqlit
1b560 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
1b570 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  me);.  return pR
1b580 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c  et;.}../*.** Fil
1b590 6c 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52 6f  l the Index.aiRo
1b5a0 77 45 73 74 5b 5d 20 61 72 72 61 79 20 77 69 74  wEst[] array wit
1b5b0 68 20 64 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d  h default inform
1b5c0 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74  ation - informat
1b5d0 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65  ion.** to be use
1b5e0 64 20 77 68 65 6e 20 77 65 20 68 61 76 65 20 6e  d when we have n
1b5f0 6f 74 20 72 75 6e 20 74 68 65 20 41 4e 41 4c 59  ot run the ANALY
1b600 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  ZE command..**.*
1b610 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d 20 69 73  * aiRowEst[0] is
1b620 20 73 75 70 70 6f 73 65 64 20 74 6f 20 63 6f 6e   supposed to con
1b630 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  tain the number 
1b640 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  of elements in t
1b650 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e  he index..** Sin
1b660 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f  ce we do not kno
1b670 77 2c 20 67 75 65 73 73 20 31 20 6d 69 6c 6c 69  w, guess 1 milli
1b680 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b 31 5d  on.  aiRowEst[1]
1b690 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
1b6a0 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  of the.** number
1b6b0 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
1b6c0 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68  table that match
1b6d0 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20   any particular 
1b6e0 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20  value of the.** 
1b6f0 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  first column of 
1b700 74 68 65 20 69 6e 64 65 78 2e 20 20 61 69 52 6f  the index.  aiRo
1b710 77 45 73 74 5b 32 5d 20 69 73 20 61 6e 20 65 73  wEst[2] is an es
1b720 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
1b730 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20  mber.** of rows 
1b740 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70  that match any p
1b750 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e  articular combin
1b760 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72  ation of the fir
1b770 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  st 2 columns.** 
1b780 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 41  of the index.  A
1b790 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 74  nd so forth.  It
1b7a0 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20   must always be 
1b7b0 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 0a  the case that.*.
1b7c0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52  **           aiR
1b7d0 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45  owEst[N]<=aiRowE
1b7e0 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20  st[N-1].**      
1b7f0 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d       aiRowEst[N]
1b800 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20  >=1.**.** Apart 
1b810 66 72 6f 6d 20 74 68 61 74 2c 20 77 65 20 68 61  from that, we ha
1b820 76 65 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20  ve little to go 
1b830 6f 6e 20 62 65 73 69 64 65 73 20 69 6e 74 75 69  on besides intui
1b840 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f  tion as to.** ho
1b850 77 20 61 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f  w aiRowEst[] sho
1b860 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  uld be initializ
1b870 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 73  ed.  The numbers
1b880 20 67 65 6e 65 72 61 74 65 64 20 68 65 72 65 0a   generated here.
1b890 2a 2a 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20  ** are based on 
1b8a0 74 79 70 69 63 61 6c 20 76 61 6c 75 65 73 20 66  typical values f
1b8b0 6f 75 6e 64 20 69 6e 20 61 63 74 75 61 6c 20 69  ound in actual i
1b8c0 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ndices..*/.void 
1b8d0 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f  sqlite3DefaultRo
1b8e0 77 45 73 74 28 49 6e 64 65 78 20 2a 70 49 64 78  wEst(Index *pIdx
1b8f0 29 7b 0a 20 20 2f 2a 20 20 20 20 20 20 20 20 20  ){.  /*         
1b900 20 20 20 20 20 20 20 31 30 2c 20 20 39 2c 20 20         10,  9,  
1b910 38 2c 20 20 37 2c 20 20 36 20 2a 2f 0a 20 20 4c  8,  7,  6 */.  L
1b920 6f 67 45 73 74 20 61 56 61 6c 5b 5d 20 3d 20 7b  ogEst aVal[] = {
1b930 20 33 33 2c 20 33 32 2c 20 33 30 2c 20 32 38 2c   33, 32, 30, 28,
1b940 20 32 36 20 7d 3b 0a 20 20 4c 6f 67 45 73 74 20   26 };.  LogEst 
1b950 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77  *a = pIdx->aiRow
1b960 4c 6f 67 45 73 74 3b 0a 20 20 69 6e 74 20 6e 43  LogEst;.  int nC
1b970 6f 70 79 20 3d 20 4d 49 4e 28 41 72 72 61 79 53  opy = MIN(ArrayS
1b980 69 7a 65 28 61 56 61 6c 29 2c 20 70 49 64 78 2d  ize(aVal), pIdx-
1b990 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 69 6e 74  >nKeyCol);.  int
1b9a0 20 69 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   i;..  /* Set th
1b9b0 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 28 6e  e first entry (n
1b9c0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
1b9d0 20 74 68 65 20 69 6e 64 65 78 29 20 74 6f 20 74   the index) to t
1b9e0 68 65 20 65 73 74 69 6d 61 74 65 64 20 0a 20 20  he estimated .  
1b9f0 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
1ba00 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  s in the table. 
1ba10 4f 72 20 31 30 2c 20 69 66 20 74 68 65 20 65 73  Or 10, if the es
1ba20 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
1ba30 66 20 72 6f 77 73 20 0a 20 20 2a 2a 20 69 6e 20  f rows .  ** in 
1ba40 74 68 65 20 74 61 62 6c 65 20 69 73 20 6c 65 73  the table is les
1ba50 73 20 74 68 61 6e 20 74 68 61 74 2e 20 20 2a 2f  s than that.  */
1ba60 0a 20 20 61 5b 30 5d 20 3d 20 70 49 64 78 2d 3e  .  a[0] = pIdx->
1ba70 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45  pTable->nRowLogE
1ba80 73 74 3b 0a 20 20 69 66 28 20 61 5b 30 5d 3c 33  st;.  if( a[0]<3
1ba90 33 20 29 20 61 5b 30 5d 20 3d 20 33 33 3b 20 20  3 ) a[0] = 33;  
1baa0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 33 33        assert( 33
1bab0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
1bac0 31 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 73 74  10) );..  /* Est
1bad0 69 6d 61 74 65 20 74 68 61 74 20 61 5b 31 5d 20  imate that a[1] 
1bae0 69 73 20 31 30 2c 20 61 5b 32 5d 20 69 73 20 39  is 10, a[2] is 9
1baf0 2c 20 61 5b 33 5d 20 69 73 20 38 2c 20 61 5b 34  , a[3] is 8, a[4
1bb00 5d 20 69 73 20 37 2c 20 61 5b 35 5d 20 69 73 0a  ] is 7, a[5] is.
1bb10 20 20 2a 2a 20 36 20 61 6e 64 20 65 61 63 68 20    ** 6 and each 
1bb20 73 75 62 73 65 71 75 65 6e 74 20 76 61 6c 75 65  subsequent value
1bb30 20 28 69 66 20 61 6e 79 29 20 69 73 20 35 2e 20   (if any) is 5. 
1bb40 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26 61 5b   */.  memcpy(&a[
1bb50 31 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f 70 79 2a  1], aVal, nCopy*
1bb60 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 29 3b  sizeof(LogEst));
1bb70 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 70 79 2b 31  .  for(i=nCopy+1
1bb80 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  ; i<=pIdx->nKeyC
1bb90 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 5b  ol; i++){.    a[
1bba0 69 5d 20 3d 20 32 33 3b 20 20 20 20 20 20 20 20  i] = 23;        
1bbb0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1bbc0 72 74 28 20 32 33 3d 3d 73 71 6c 69 74 65 33 4c  rt( 23==sqlite3L
1bbd0 6f 67 45 73 74 28 35 29 20 29 3b 0a 20 20 7d 0a  ogEst(5) );.  }.
1bbe0 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71  .  assert( 0==sq
1bbf0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20 29  lite3LogEst(1) )
1bc00 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75 65  ;.  if( IsUnique
1bc10 49 6e 64 65 78 28 70 49 64 78 29 20 29 20 61 5b  Index(pIdx) ) a[
1bc20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d 20 3d  pIdx->nKeyCol] =
1bc30 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
1bc40 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  s routine will d
1bc50 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20  rop an existing 
1bc60 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68  named index.  Th
1bc70 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d  is routine.** im
1bc80 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f  plements the DRO
1bc90 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  P INDEX statemen
1bca0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1bcb0 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73  e3DropIndex(Pars
1bcc0 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
1bcd0 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  st *pName, int i
1bce0 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65  fExists){.  Inde
1bcf0 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62  x *pIndex;.  Vdb
1bd00 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
1bd10 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1bd20 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
1bd30 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1bd40 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20  nErr==0 );   /* 
1bd50 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74  Never called wit
1bd60 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a  h prior errors *
1bd70 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  /.  if( db->mall
1bd80 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
1bd90 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
1bda0 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ndex;.  }.  asse
1bdb0 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d  rt( pName->nSrc=
1bdc0 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  =1 );.  if( SQLI
1bdd0 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
1bde0 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
1bdf0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
1be00 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1be10 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  }.  pIndex = sql
1be20 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
1be30 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  , pName->a[0].zN
1be40 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ame, pName->a[0]
1be50 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69  .zDatabase);.  i
1be60 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a  f( pIndex==0 ){.
1be70 20 20 20 20 69 66 28 20 21 69 66 45 78 69 73 74      if( !ifExist
1be80 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
1be90 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1bea0 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
1beb0 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30  x: %S", pName, 0
1bec0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1bed0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
1bee0 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61  erifyNamedSchema
1bef0 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e  (pParse, pName->
1bf00 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
1bf10 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
1bf20 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
1bf30 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   1;.    goto exi
1bf40 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1bf50 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  }.  if( pIndex->
1bf60 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  idxType!=SQLITE_
1bf70 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 20 29  IDXTYPE_APPDEF )
1bf80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
1bf90 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69  orMsg(pParse, "i
1bfa0 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
1bfb0 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20  with UNIQUE ".  
1bfc0 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20      "or PRIMARY 
1bfd0 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  KEY constraint c
1bfe0 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  annot be dropped
1bff0 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ", 0);.    goto 
1c000 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1c010 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
1c020 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
1c030 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53  x(db, pIndex->pS
1c040 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20  chema);.#ifndef 
1c050 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
1c060 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
1c070 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c    int code = SQL
1c080 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a  ITE_DROP_INDEX;.
1c090 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
1c0a0 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
1c0b0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
1c0c0 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
1c0d0 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
1c0e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
1c0f0 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
1c100 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71  iDb);.    if( sq
1c110 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1c120 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
1c130 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a  LETE, zTab, 0, z
1c140 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
1c150 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1c160 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
1c170 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
1c180 20 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51   iDb ) code = SQ
1c190 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49  LITE_DROP_TEMP_I
1c1a0 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71  NDEX;.    if( sq
1c1b0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1c1c0 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e  Parse, code, pIn
1c1d0 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62  dex->zName, pTab
1c1e0 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b  ->zName, zDb) ){
1c1f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
1c200 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20  _drop_index;.   
1c210 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1c220 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1c230 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
1c240 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74  index and from t
1c250 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
1c260 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
1c270 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1c280 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
1c290 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
1c2a0 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
1c2b0 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 1, iDb);.    
1c2c0 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
1c2d0 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
1c2e0 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
1c2f0 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d  Q.%s WHERE name=
1c300 25 51 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64  %Q AND type='ind
1c310 65 78 27 22 2c 0a 20 20 20 20 20 20 20 64 62 2d  ex'",.       db-
1c320 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
1c330 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
1c340 62 29 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  b), pIndex->zNam
1c350 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  e.    );.    sql
1c360 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62  ite3ClearStatTab
1c370 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c  les(pParse, iDb,
1c380 20 22 69 64 78 22 2c 20 70 49 6e 64 65 78 2d 3e   "idx", pIndex->
1c390 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
1c3a0 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
1c3b0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
1c3c0 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
1c3d0 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  e(pParse, pIndex
1c3e0 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
1c3f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c400 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e  Op4(v, OP_DropIn
1c410 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  dex, iDb, 0, 0, 
1c420 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
1c430 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f  );.  }..exit_dro
1c440 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74  p_index:.  sqlit
1c450 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
1c460 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  db, pName);.}../
1c470 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69 73 20 61  *.** pArray is a
1c480 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 61   pointer to an a
1c490 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e  rray of objects.
1c4a0 20 45 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20   Each object in 
1c4b0 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 69 73 20  the.** array is 
1c4c0 73 7a 45 6e 74 72 79 20 62 79 74 65 73 20 69 6e  szEntry bytes in
1c4d0 20 73 69 7a 65 2e 20 54 68 69 73 20 72 6f 75 74   size. This rout
1c4e0 69 6e 65 20 75 73 65 73 20 73 71 6c 69 74 65 33  ine uses sqlite3
1c4f0 44 62 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20 74  DbRealloc().** t
1c500 6f 20 65 78 74 65 6e 64 20 74 68 65 20 61 72 72  o extend the arr
1c510 61 79 20 73 6f 20 74 68 61 74 20 74 68 65 72 65  ay so that there
1c520 20 69 73 20 73 70 61 63 65 20 66 6f 72 20 61 20   is space for a 
1c530 6e 65 77 20 6f 62 6a 65 63 74 20 61 74 20 74 68  new object at th
1c540 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  e end..**.** Whe
1c550 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1c560 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 45 6e  is called, *pnEn
1c570 74 72 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  try contains the
1c580 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
1c590 0a 2a 2a 20 74 68 65 20 61 72 72 61 79 20 28 69  .** the array (i
1c5a0 6e 20 65 6e 74 72 69 65 73 20 2d 20 73 6f 20 74  n entries - so t
1c5b0 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  he allocation is
1c5c0 20 28 28 2a 70 6e 45 6e 74 72 79 29 20 2a 20 73   ((*pnEntry) * s
1c5d0 7a 45 6e 74 72 79 29 20 62 79 74 65 73 0a 2a 2a  zEntry) bytes.**
1c5e0 20 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a   in total)..**.*
1c5f0 2a 20 49 66 20 74 68 65 20 72 65 61 6c 6c 6f 63  * If the realloc
1c600 28 29 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  () is successful
1c610 20 28 69 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f 4d   (i.e. if no OOM
1c620 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75 72   condition occur
1c630 73 29 2c 20 74 68 65 0a 2a 2a 20 73 70 61 63 65  s), the.** space
1c640 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
1c650 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 73  he new object is
1c660 20 7a 65 72 6f 65 64 2c 20 2a 70 6e 45 6e 74 72   zeroed, *pnEntr
1c670 79 20 75 70 64 61 74 65 64 20 74 6f 0a 2a 2a 20  y updated to.** 
1c680 72 65 66 6c 65 63 74 20 74 68 65 20 6e 65 77 20  reflect the new 
1c690 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61  size of the arra
1c6a0 79 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20  y and a pointer 
1c6b0 74 6f 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63  to the new alloc
1c6c0 61 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 65  ation.** returne
1c6d0 64 2e 20 2a 70 49 64 78 20 69 73 20 73 65 74 20  d. *pIdx is set 
1c6e0 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
1c6f0 74 68 65 20 6e 65 77 20 61 72 72 61 79 20 65 6e  the new array en
1c700 74 72 79 20 69 6e 20 74 68 69 73 20 63 61 73 65  try in this case
1c710 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
1c720 65 2c 20 69 66 20 74 68 65 20 72 65 61 6c 6c 6f  e, if the reallo
1c730 63 28 29 20 66 61 69 6c 73 2c 20 2a 70 49 64 78  c() fails, *pIdx
1c740 20 69 73 20 73 65 74 20 74 6f 20 2d 31 2c 20 2a   is set to -1, *
1c750 70 6e 45 6e 74 72 79 20 72 65 6d 61 69 6e 73 0a  pnEntry remains.
1c760 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ** unchanged and
1c770 20 61 20 63 6f 70 79 20 6f 66 20 70 41 72 72 61   a copy of pArra
1c780 79 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 76  y returned..*/.v
1c790 6f 69 64 20 2a 73 71 6c 69 74 65 33 41 72 72 61  oid *sqlite3Arra
1c7a0 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c  yAllocate(.  sql
1c7b0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 2f  ite3 *db,      /
1c7c0 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  * Connection to 
1c7d0 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63  notify of malloc
1c7e0 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76   failures */.  v
1c7f0 6f 69 64 20 2a 70 41 72 72 61 79 2c 20 20 20 20  oid *pArray,    
1c800 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 62 6a   /* Array of obj
1c810 65 63 74 73 2e 20 20 4d 69 67 68 74 20 62 65 20  ects.  Might be 
1c820 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  reallocated */. 
1c830 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20 20   int szEntry,   
1c840 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61     /* Size of ea
1c850 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  ch object in the
1c860 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
1c870 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a  *pnEntry,     /*
1c880 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63   Number of objec
1c890 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  ts currently in 
1c8a0 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49  use */.  int *pI
1c8b0 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  dx         /* Wr
1c8c0 69 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66  ite the index of
1c8d0 20 61 20 6e 65 77 20 73 6c 6f 74 20 68 65 72 65   a new slot here
1c8e0 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
1c8f0 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 2a 70 6e 45  ;.  int n = *pnE
1c900 6e 74 72 79 3b 0a 20 20 69 66 28 20 28 6e 20 26  ntry;.  if( (n &
1c910 20 28 6e 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20   (n-1))==0 ){.  
1c920 20 20 69 6e 74 20 73 7a 20 3d 20 28 6e 3d 3d 30    int sz = (n==0
1c930 29 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a 20 20 20  ) ? 1 : 2*n;.   
1c940 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 73 71   void *pNew = sq
1c950 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
1c960 62 2c 20 70 41 72 72 61 79 2c 20 73 7a 2a 73 7a  b, pArray, sz*sz
1c970 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66 28 20  Entry);.    if( 
1c980 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
1c990 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20   *pIdx = -1;.   
1c9a0 20 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79     return pArray
1c9b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72 72  ;.    }.    pArr
1c9c0 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  ay = pNew;.  }. 
1c9d0 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 41 72 72   z = (char*)pArr
1c9e0 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b  ay;.  memset(&z[
1c9f0 6e 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c  n * szEntry], 0,
1ca00 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49   szEntry);.  *pI
1ca10 64 78 20 3d 20 6e 3b 0a 20 20 2b 2b 2a 70 6e 45  dx = n;.  ++*pnE
1ca20 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e 20 70  ntry;.  return p
1ca30 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Array;.}../*.** 
1ca40 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65  Append a new ele
1ca50 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65  ment to the give
1ca60 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74  n IdList.  Creat
1ca70 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69  e a new IdList i
1ca80 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a  f.** need be..**
1ca90 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74  .** A new IdList
1caa0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
1cab0 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
1cac0 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69  ) fails..*/.IdLi
1cad0 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73  st *sqlite3IdLis
1cae0 74 41 70 70 65 6e 64 28 73 71 6c 69 74 65 33 20  tAppend(sqlite3 
1caf0 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69  *db, IdList *pLi
1cb00 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
1cb10 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  n){.  int i;.  i
1cb20 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
1cb30 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
1cb40 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
1cb50 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74  b, sizeof(IdList
1cb60 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
1cb70 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
1cb80 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61  ;.  }.  pList->a
1cb90 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
1cba0 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 64  llocate(.      d
1cbb0 62 2c 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  b,.      pList->
1cbc0 61 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  a,.      sizeof(
1cbd0 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20  pList->a[0]),.  
1cbe0 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c      &pList->nId,
1cbf0 0a 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20  .      &i.  );. 
1cc00 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
1cc10 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
1cc20 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
1cc30 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1cc40 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  }.  pList->a[i].
1cc50 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
1cc60 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
1cc70 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75   pToken);.  retu
1cc80 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
1cc90 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c  ** Delete an IdL
1cca0 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
1ccb0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
1ccc0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64  (sqlite3 *db, Id
1ccd0 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
1cce0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1ccf0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
1cd00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
1cd10 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
1cd20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1cd30 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  (db, pList->a[i]
1cd40 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  .zName);.  }.  s
1cd50 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1cd60 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71   pList->a);.  sq
1cd70 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1cd80 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
1cd90 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
1cda0 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68  x in pList of th
1cdb0 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d  e identifier nam
1cdc0 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20  ed zId.  Return 
1cdd0 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75  -1.** if not fou
1cde0 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
1cdf0 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64  e3IdListIndex(Id
1ce00 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e  List *pList, con
1ce10 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
1ce20 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1ce30 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1ce40 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  n -1;.  for(i=0;
1ce50 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
1ce60 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
1ce70 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73  ite3StrICmp(pLis
1ce80 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  t->a[i].zName, z
1ce90 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
1cea0 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
1ceb0 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n -1;.}../*.** E
1cec0 78 70 61 6e 64 20 74 68 65 20 73 70 61 63 65 20  xpand the space 
1ced0 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
1cee0 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 20  e given SrcList 
1cef0 6f 62 6a 65 63 74 20 62 79 0a 2a 2a 20 63 72 65  object by.** cre
1cf00 61 74 69 6e 67 20 6e 45 78 74 72 61 20 6e 65 77  ating nExtra new
1cf10 20 73 6c 6f 74 73 20 62 65 67 69 6e 6e 69 6e 67   slots beginning
1cf20 20 61 74 20 69 53 74 61 72 74 2e 20 20 69 53 74   at iStart.  iSt
1cf30 61 72 74 20 69 73 20 7a 65 72 6f 20 62 61 73 65  art is zero base
1cf40 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74 73 20  d..** New slots 
1cf50 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a  are zeroed..**.*
1cf60 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73  * For example, s
1cf70 75 70 70 6f 73 65 20 61 20 53 72 63 4c 69 73 74  uppose a SrcList
1cf80 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f 6e 74 61   initially conta
1cf90 69 6e 73 20 74 77 6f 20 65 6e 74 72 69 65 73 3a  ins two entries:
1cfa0 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70 70 65   A,B..** To appe
1cfb0 6e 64 20 33 20 6e 65 77 20 65 6e 74 72 69 65 73  nd 3 new entries
1cfc0 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 2c 20 64   onto the end, d
1cfd0 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  o this:.**.**   
1cfe0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
1cff0 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 6c  nlarge(db, pSrcl
1d000 69 73 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a  ist, 3, 2);.**.*
1d010 2a 20 41 66 74 65 72 20 74 68 65 20 63 61 6c 6c  * After the call
1d020 20 61 62 6f 76 65 20 69 74 20 77 6f 75 6c 64 20   above it would 
1d030 63 6f 6e 74 61 69 6e 3a 20 20 41 2c 20 42 2c 20  contain:  A, B, 
1d040 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a  nil, nil, nil..*
1d050 2a 20 49 66 20 74 68 65 20 69 53 74 61 72 74 20  * If the iStart 
1d060 61 72 67 75 6d 65 6e 74 20 68 61 64 20 62 65 65  argument had bee
1d070 6e 20 31 20 69 6e 73 74 65 61 64 20 6f 66 20 32  n 1 instead of 2
1d080 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
1d090 74 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20  t.** would have 
1d0a0 62 65 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e  been:  A, nil, n
1d0b0 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20 54 6f 20  il, nil, B.  To 
1d0c0 70 72 65 70 65 6e 64 20 74 68 65 20 6e 65 77 20  prepend the new 
1d0d0 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65 20 69 53  slots,.** the iS
1d0e0 74 61 72 74 20 76 61 6c 75 65 20 77 6f 75 6c 64  tart value would
1d0f0 20 62 65 20 30 2e 20 20 54 68 65 20 72 65 73 75   be 0.  The resu
1d100 6c 74 20 74 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a  lt then would.**
1d110 20 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e   be: nil, nil, n
1d120 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20  il, A, B..**.** 
1d130 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
1d140 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 74 68 65  cation fails the
1d150 20 53 72 63 4c 69 73 74 20 69 73 20 75 6e 63 68   SrcList is unch
1d160 61 6e 67 65 64 2e 20 20 54 68 65 0a 2a 2a 20 64  anged.  The.** d
1d170 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1d180 66 6c 61 67 20 77 69 6c 6c 20 62 65 20 73 65 74  flag will be set
1d190 20 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a 53 72 63   to true..*/.Src
1d1a0 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
1d1b0 4c 69 73 74 45 6e 6c 61 72 67 65 28 0a 20 20 73  ListEnlarge(.  s
1d1c0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1d1d0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
1d1e0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69  nnection to noti
1d1f0 66 79 20 6f 66 20 4f 4f 4d 20 65 72 72 6f 72 73  fy of OOM errors
1d200 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1d210 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  Src,     /* The 
1d220 53 72 63 4c 69 73 74 20 74 6f 20 62 65 20 65 6e  SrcList to be en
1d230 6c 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20  larged */.  int 
1d240 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 2f  nExtra,        /
1d250 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 77 20  * Number of new 
1d260 73 6c 6f 74 73 20 74 6f 20 61 64 64 20 74 6f 20  slots to add to 
1d270 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69  pSrc->a[] */.  i
1d280 6e 74 20 69 53 74 61 72 74 20 20 20 20 20 20 20  nt iStart       
1d290 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 53    /* Index in pS
1d2a0 72 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72 73 74  rc->a[] of first
1d2b0 20 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a   new slot */.){.
1d2c0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53    int i;..  /* S
1d2d0 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
1d2e0 6e 20 63 61 6c 6c 69 6e 67 20 70 61 72 61 6d 65  n calling parame
1d2f0 74 65 72 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  ters */.  assert
1d300 28 20 69 53 74 61 72 74 3e 3d 30 20 29 3b 0a 20  ( iStart>=0 );. 
1d310 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e   assert( nExtra>
1d320 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
1d330 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 61 73 73  pSrc!=0 );.  ass
1d340 65 72 74 28 20 69 53 74 61 72 74 3c 3d 70 53 72  ert( iStart<=pSr
1d350 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20 20 2f 2a  c->nSrc );..  /*
1d360 20 41 6c 6c 6f 63 61 74 65 20 61 64 64 69 74 69   Allocate additi
1d370 6f 6e 61 6c 20 73 70 61 63 65 20 69 66 20 6e 65  onal space if ne
1d380 65 64 65 64 20 2a 2f 0a 20 20 69 66 28 20 28 75  eded */.  if( (u
1d390 33 32 29 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45  32)pSrc->nSrc+nE
1d3a0 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c 6f  xtra>pSrc->nAllo
1d3b0 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74  c ){.    SrcList
1d3c0 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20   *pNew;.    int 
1d3d0 6e 41 6c 6c 6f 63 20 3d 20 70 53 72 63 2d 3e 6e  nAlloc = pSrc->n
1d3e0 53 72 63 2b 6e 45 78 74 72 61 3b 0a 20 20 20 20  Src+nExtra;.    
1d3f0 69 6e 74 20 6e 47 6f 74 3b 0a 20 20 20 20 70 4e  int nGot;.    pN
1d400 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
1d410 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63 2c 0a  alloc(db, pSrc,.
1d420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1d430 69 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b 20 28  izeof(*pSrc) + (
1d440 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66  nAlloc-1)*sizeof
1d450 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a  (pSrc->a[0]) );.
1d460 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
1d470 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1d480 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1d490 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d );.      retur
1d4a0 6e 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a 20 20  n pSrc;.    }.  
1d4b0 20 20 70 53 72 63 20 3d 20 70 4e 65 77 3b 0a 20    pSrc = pNew;. 
1d4c0 20 20 20 6e 47 6f 74 20 3d 20 28 73 71 6c 69 74     nGot = (sqlit
1d4d0 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64  e3DbMallocSize(d
1d4e0 62 2c 20 70 4e 65 77 29 20 2d 20 73 69 7a 65 6f  b, pNew) - sizeo
1d4f0 66 28 2a 70 53 72 63 29 29 2f 73 69 7a 65 6f 66  f(*pSrc))/sizeof
1d500 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2b 31 3b 0a  (pSrc->a[0])+1;.
1d510 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63      pSrc->nAlloc
1d520 20 3d 20 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20 20   = nGot;.  }..  
1d530 2f 2a 20 4d 6f 76 65 20 65 78 69 73 74 69 6e 67  /* Move existing
1d540 20 73 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d 65   slots that come
1d550 20 61 66 74 65 72 20 74 68 65 20 6e 65 77 6c 79   after the newly
1d560 20 69 6e 73 65 72 74 65 64 20 73 6c 6f 74 73 0a   inserted slots.
1d570 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20    ** out of the 
1d580 77 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70  way */.  for(i=p
1d590 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d  Src->nSrc-1; i>=
1d5a0 69 53 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20 20  iStart; i--){.  
1d5b0 20 20 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78 74    pSrc->a[i+nExt
1d5c0 72 61 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d  ra] = pSrc->a[i]
1d5d0 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e 53  ;.  }.  pSrc->nS
1d5e0 72 63 20 2b 3d 20 6e 45 78 74 72 61 3b 0a 0a 20  rc += nExtra;.. 
1d5f0 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65 77   /* Zero the new
1d600 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f  ly allocated slo
1d610 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ts */.  memset(&
1d620 70 53 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c  pSrc->a[iStart],
1d630 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 72 63 2d   0, sizeof(pSrc-
1d640 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a  >a[0])*nExtra);.
1d650 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 3b 20    for(i=iStart; 
1d660 69 3c 69 53 74 61 72 74 2b 6e 45 78 74 72 61 3b  i<iStart+nExtra;
1d670 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d   i++){.    pSrc-
1d680 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20  >a[i].iCursor = 
1d690 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  -1;.  }..  /* Re
1d6a0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1d6b0 6f 20 74 68 65 20 65 6e 6c 61 72 67 65 64 20 53  o the enlarged S
1d6c0 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74 75  rcList */.  retu
1d6d0 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  rn pSrc;.}.../*.
1d6e0 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
1d6f0 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
1d700 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e  e given SrcList.
1d710 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53    Create a new S
1d720 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  rcList if.** nee
1d730 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74  d be.  A new ent
1d740 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  ry is created in
1d750 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65   the SrcList eve
1d760 6e 20 69 66 20 70 54 61 62 6c 65 20 69 73 20 4e  n if pTable is N
1d770 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63  ULL..**.** A Src
1d780 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
1d790 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65  , or NULL if the
1d7a0 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72  re is an OOM err
1d7b0 6f 72 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65  or.  The returne
1d7c0 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69 67  d.** SrcList mig
1d7d0 68 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ht be the same a
1d7e0 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68  s the SrcList th
1d7f0 61 74 20 77 61 73 20 69 6e 70 75 74 20 6f 72 20  at was input or 
1d800 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61  it might be.** a
1d810 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e   new one.  If an
1d820 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73 20   OOM error does 
1d830 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
1d840 20 70 72 69 6f 72 20 76 61 6c 75 65 20 6f 66 20   prior value of 
1d850 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20 69 73  pList.** that is
1d860 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72   input to this r
1d870 6f 75 74 69 6e 65 20 69 73 20 61 75 74 6f 6d 61  outine is automa
1d880 74 69 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a  tically freed..*
1d890 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73  *.** If pDatabas
1d8a0 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69  e is not null, i
1d8b0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
1d8c0 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70   table has an op
1d8d0 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61  tional.** databa
1d8e0 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20  se name prefix. 
1d8f0 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61   Like this:  "da
1d900 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20  tabase.table".  
1d910 54 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a  The pDatabase.**
1d920 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74   points to the t
1d930 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
1d940 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20  e pTable points 
1d950 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1d960 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63  name..** The Src
1d970 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66  List.a[].zName f
1d980 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77  ield is filled w
1d990 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ith the table na
1d9a0 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a  me which might.*
1d9b0 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62  * come from pTab
1d9c0 6c 65 20 28 69 66 20 70 44 61 74 61 62 61 73 65  le (if pDatabase
1d9d0 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f   is NULL) or fro
1d9e0 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a  m pDatabase.  .*
1d9f0 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44  * SrcList.a[].zD
1da00 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65  atabase is fille
1da10 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
1da20 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54  ase name from pT
1da30 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68  able,.** or with
1da40 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61   NULL if no data
1da50 62 61 73 65 20 69 73 20 73 70 65 63 69 66 69 65  base is specifie
1da60 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65  d..**.** In othe
1da70 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c  r words, if call
1da80 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
1da90 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
1daa0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44  3SrcListAppend(D
1dab0 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54  ,A,B,0);.**.** T
1dac0 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65  hen B is a table
1dad0 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61   name and the da
1dae0 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75  tabase name is u
1daf0 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20  nspecified.  If 
1db00 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74  called.** like t
1db10 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
1db20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1db30 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29  tAppend(D,A,B,C)
1db40 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69  ;.**.** Then C i
1db50 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  s the table name
1db60 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61   and B is the da
1db70 74 61 62 61 73 65 20 6e 61 6d 65 2e 20 20 49 66  tabase name.  If
1db80 20 43 20 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a   C is defined.**
1db90 20 74 68 65 6e 20 73 6f 20 69 73 20 42 2e 20 20   then so is B.  
1dba0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1dbb0 77 65 20 6e 65 76 65 72 20 68 61 76 65 20 61 20  we never have a 
1dbc0 63 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a  case where:.**.*
1dbd0 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
1dbe0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44  3SrcListAppend(D
1dbf0 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42  ,A,0,C);.**.** B
1dc00 6f 74 68 20 70 54 61 62 6c 65 20 61 6e 64 20 70  oth pTable and p
1dc10 44 61 74 61 62 61 73 65 20 61 72 65 20 61 73 73  Database are ass
1dc20 75 6d 65 64 20 74 6f 20 62 65 20 71 75 6f 74 65  umed to be quote
1dc30 64 2e 20 20 54 68 65 79 20 61 72 65 20 64 65 71  d.  They are deq
1dc40 75 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20  uoted.** before 
1dc50 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74  being added to t
1dc60 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53  he SrcList..*/.S
1dc70 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
1dc80 72 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20  rcListAppend(.  
1dc90 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1dca0 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
1dcb0 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d  n to notify of m
1dcc0 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a  alloc failures *
1dcd0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4c 69  /.  SrcList *pLi
1dce0 73 74 2c 20 20 20 20 20 2f 2a 20 41 70 70 65 6e  st,     /* Appen
1dcf0 64 20 74 6f 20 74 68 69 73 20 53 72 63 4c 69 73  d to this SrcLis
1dd00 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65 73 20  t. NULL creates 
1dd10 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 2a 2f  a new SrcList */
1dd20 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  .  Token *pTable
1dd30 2c 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  ,      /* Table 
1dd40 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54  to append */.  T
1dd50 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 20  oken *pDatabase 
1dd60 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f     /* Database o
1dd70 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29  f the table */.)
1dd80 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  {.  struct SrcLi
1dd90 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1dda0 20 20 61 73 73 65 72 74 28 20 70 44 61 74 61 62    assert( pDatab
1ddb0 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65  ase==0 || pTable
1ddc0 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f  !=0 );  /* Canno
1ddd0 74 20 68 61 76 65 20 43 20 77 69 74 68 6f 75 74  t have C without
1dde0 20 42 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73   B */.  if( pLis
1ddf0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
1de00 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
1de10 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
1de20 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20  of(SrcList) );. 
1de30 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
1de40 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1de50 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
1de60 31 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d  1;.  }.  pList =
1de70 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
1de80 6e 6c 61 72 67 65 28 64 62 2c 20 70 4c 69 73 74  nlarge(db, pList
1de90 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63  , 1, pList->nSrc
1dea0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
1deb0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1dec0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
1ded0 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
1dee0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1def0 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70    }.  pItem = &p
1df00 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
1df10 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44  Src-1];.  if( pD
1df20 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74 61  atabase && pData
1df30 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  base->z==0 ){.  
1df40 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b    pDatabase = 0;
1df50 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61  .  }.  if( pData
1df60 62 61 73 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65  base ){.    Toke
1df70 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61  n *pTemp = pData
1df80 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62  base;.    pDatab
1df90 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  ase = pTable;.  
1dfa0 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70    pTable = pTemp
1dfb0 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a  ;.  }.  pItem->z
1dfc0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
1dfd0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
1dfe0 70 54 61 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d  pTable);.  pItem
1dff0 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71  ->zDatabase = sq
1e000 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1e010 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61 73 65  en(db, pDatabase
1e020 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  );.  return pLis
1e030 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  t;.}../*.** Assi
1e040 67 6e 20 56 64 62 65 43 75 72 73 6f 72 20 69 6e  gn VdbeCursor in
1e050 64 65 78 20 6e 75 6d 62 65 72 73 20 74 6f 20 61  dex numbers to a
1e060 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53  ll tables in a S
1e070 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73  rcList.*/.void s
1e080 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
1e090 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65  ignCursors(Parse
1e0a0 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
1e0b0 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
1e0c0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63   i;.  struct Src
1e0d0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1e0e0 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69 73 74  ;.  assert(pList
1e0f0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
1e100 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1e110 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
1e120 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
1e130 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c  m=pList->a; i<pL
1e140 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
1e150 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
1e160 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  if( pItem->iCurs
1e170 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  or>=0 ) break;. 
1e180 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72       pItem->iCur
1e190 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
1e1a0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ab++;.      if( 
1e1b0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
1e1c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1e1d0 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
1e1e0 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49  rsors(pParse, pI
1e1f0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53  tem->pSelect->pS
1e200 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc);.      }.   
1e210 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1e220 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
1e230 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69   SrcList includi
1e240 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74  ng all its subst
1e250 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64  ructure..*/.void
1e260 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
1e270 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
1e280 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  b, SrcList *pLis
1e290 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  t){.  int i;.  s
1e2a0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1e2b0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
1e2c0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1e2d0 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d  rn;.  for(pItem=
1e2e0 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
1e2f0 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
1e300 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
1e310 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1e320 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  b, pItem->zDatab
1e330 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ase);.    sqlite
1e340 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
1e350 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  m->zName);.    s
1e360 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1e370 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b   pItem->zAlias);
1e380 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1e390 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 49  ee(db, pItem->zI
1e3a0 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 73  ndexedBy);.    s
1e3b0 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
1e3c0 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 54 61  e(db, pItem->pTa
1e3d0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  b);.    sqlite3S
1e3e0 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
1e3f0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pItem->pSelect);
1e400 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1e410 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
1e420 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ->pOn);.    sqli
1e430 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
1e440 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e  db, pItem->pUsin
1e450 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  g);.  }.  sqlite
1e460 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
1e470 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  t);.}../*.** Thi
1e480 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1e490 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
1e4a0 72 20 74 6f 20 61 64 64 20 61 20 6e 65 77 20 74  r to add a new t
1e4b0 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  erm to the.** en
1e4c0 64 20 6f 66 20 61 20 67 72 6f 77 69 6e 67 20 46  d of a growing F
1e4d0 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ROM clause.  The
1e4e0 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
1e4f0 73 20 74 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a  s the part of.**
1e500 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1e510 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
1e520 79 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74  y been construct
1e530 65 64 2e 20 20 22 70 22 20 69 73 20 4e 55 4c 4c  ed.  "p" is NULL
1e540 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 74  .** if this is t
1e550 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66  he first term of
1e560 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1e570 2e 20 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44  .  pTable and pD
1e580 61 74 61 62 61 73 65 0a 2a 2a 20 61 72 65 20 74  atabase.** are t
1e590 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
1e5a0 61 62 6c 65 20 61 6e 64 20 64 61 74 61 62 61 73  able and databas
1e5b0 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
1e5c0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ROM clause term.
1e5d0 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 69 73  .** pDatabase is
1e5e0 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 64 61 74   NULL if the dat
1e5f0 61 62 61 73 65 20 6e 61 6d 65 20 71 75 61 6c 69  abase name quali
1e600 66 69 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20  fier is missing 
1e610 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63  - the.** usual c
1e620 61 73 65 2e 20 20 49 66 20 74 68 65 20 74 65 72  ase.  If the ter
1e630 6d 20 68 61 73 20 61 6e 20 61 6c 69 61 73 2c 20  m has an alias, 
1e640 74 68 65 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e  then pAlias poin
1e650 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69  ts to the.** ali
1e660 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68  as token.  If th
1e670 65 20 74 65 72 6d 20 69 73 20 61 20 73 75 62 71  e term is a subq
1e680 75 65 72 79 2c 20 74 68 65 6e 20 70 53 75 62 71  uery, then pSubq
1e690 75 65 72 79 20 69 73 20 74 68 65 0a 2a 2a 20 53  uery is the.** S
1e6a0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1e6b0 74 68 61 74 20 74 68 65 20 73 75 62 71 75 65 72  that the subquer
1e6c0 79 20 65 6e 63 6f 64 65 73 2e 20 20 54 68 65 20  y encodes.  The 
1e6d0 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44  pTable and.** pD
1e6e0 61 74 61 62 61 73 65 20 70 61 72 61 6d 65 74 65  atabase paramete
1e6f0 72 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20  rs are NULL for 
1e700 73 75 62 71 75 65 72 69 65 73 2e 20 20 54 68 65  subqueries.  The
1e710 20 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a   pOn and pUsing.
1e720 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  ** parameters ar
1e730 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
1e740 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e   the ON and USIN
1e750 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  G clauses..**.**
1e760 20 52 65 74 75 72 6e 20 61 20 6e 65 77 20 53 72   Return a new Sr
1e770 63 4c 69 73 74 20 77 68 69 63 68 20 65 6e 63 6f  cList which enco
1e780 64 65 73 20 69 73 20 74 68 65 20 46 52 4f 4d 20  des is the FROM 
1e790 77 69 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20  with the new.** 
1e7a0 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53  term added..*/.S
1e7b0 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
1e7c0 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d  rcListAppendFrom
1e7d0 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Term(.  Parse *p
1e7e0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
1e7f0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1e800 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
1e810 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1e820 2f 2a 20 54 68 65 20 6c 65 66 74 20 70 61 72 74  /* The left part
1e830 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1e840 75 73 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e  use already seen
1e850 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
1e860 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
1e870 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
1e880 6c 65 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65  le to add to the
1e890 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
1e8a0 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61    Token *pDataba
1e8b0 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  se,       /* Nam
1e8c0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1e8d0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61  e containing pTa
1e8e0 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ble */.  Token *
1e8f0 70 41 6c 69 61 73 2c 20 20 20 20 20 20 20 20 20  pAlias,         
1e900 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61   /* The right-ha
1e910 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 41  nd side of the A
1e920 53 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  S subexpression 
1e930 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  */.  Select *pSu
1e940 62 71 75 65 72 79 2c 20 20 20 20 20 20 2f 2a 20  bquery,      /* 
1e950 41 20 73 75 62 71 75 65 72 79 20 75 73 65 64 20  A subquery used 
1e960 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61  in place of a ta
1e970 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78  ble name */.  Ex
1e980 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20  pr *pOn,        
1e990 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20        /* The ON 
1e9a0 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e  clause of a join
1e9b0 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 55   */.  IdList *pU
1e9c0 73 69 6e 67 20 20 20 20 20 20 20 20 20 20 2f 2a  sing          /*
1e9d0 20 54 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   The USING claus
1e9e0 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29  e of a join */.)
1e9f0 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  {.  struct SrcLi
1ea00 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1ea10 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1ea20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
1ea30 28 20 21 70 20 26 26 20 28 70 4f 6e 20 7c 7c 20  ( !p && (pOn || 
1ea40 70 55 73 69 6e 67 29 20 29 7b 0a 20 20 20 20 73  pUsing) ){.    s
1ea50 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1ea60 50 61 72 73 65 2c 20 22 61 20 4a 4f 49 4e 20 63  Parse, "a JOIN c
1ea70 6c 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65  lause is require
1ea80 64 20 62 65 66 6f 72 65 20 25 73 22 2c 20 0a 20  d before %s", . 
1ea90 20 20 20 20 20 28 70 4f 6e 20 3f 20 22 4f 4e 22       (pOn ? "ON"
1eaa0 20 3a 20 22 55 53 49 4e 47 22 29 0a 20 20 20 20   : "USING").    
1eab0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65  );.    goto appe
1eac0 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20  nd_from_error;. 
1ead0 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33   }.  p = sqlite3
1eae0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62  SrcListAppend(db
1eaf0 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20 70 44 61  , p, pTable, pDa
1eb00 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  tabase);.  if( p
1eb10 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e  ==0 || NEVER(p->
1eb20 6e 53 72 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nSrc==0) ){.    
1eb30 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d  goto append_from
1eb40 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 49  _error;.  }.  pI
1eb50 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e  tem = &p->a[p->n
1eb60 53 72 63 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74  Src-1];.  assert
1eb70 28 20 70 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20  ( pAlias!=0 );. 
1eb80 20 69 66 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29   if( pAlias->n )
1eb90 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c  {.    pItem->zAl
1eba0 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ias = sqlite3Nam
1ebb0 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
1ebc0 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49  Alias);.  }.  pI
1ebd0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70  tem->pSelect = p
1ebe0 53 75 62 71 75 65 72 79 3b 0a 20 20 70 49 74 65  Subquery;.  pIte
1ebf0 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20  m->pOn = pOn;.  
1ec00 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20  pItem->pUsing = 
1ec10 70 55 73 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e  pUsing;.  return
1ec20 20 70 3b 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f   p;.. append_fro
1ec30 6d 5f 65 72 72 6f 72 3a 0a 20 20 61 73 73 65 72  m_error:.  asser
1ec40 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c  t( p==0 );.  sql
1ec50 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1ec60 62 2c 20 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74  b, pOn);.  sqlit
1ec70 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
1ec80 62 2c 20 70 55 73 69 6e 67 29 3b 0a 20 20 73 71  b, pUsing);.  sq
1ec90 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
1eca0 65 28 64 62 2c 20 70 53 75 62 71 75 65 72 79 29  e(db, pSubquery)
1ecb0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1ecc0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e  ./*.** Add an IN
1ecd0 44 45 58 45 44 20 42 59 20 6f 72 20 4e 4f 54 20  DEXED BY or NOT 
1ece0 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 74  INDEXED clause t
1ecf0 6f 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  o the most recen
1ed00 74 6c 79 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c  tly added .** el
1ed10 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 73 6f 75  ement of the sou
1ed20 72 63 65 2d 6c 69 73 74 20 70 61 73 73 65 64 20  rce-list passed 
1ed30 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
1ed40 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  gument..*/.void 
1ed50 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e  sqlite3SrcListIn
1ed60 64 65 78 65 64 42 79 28 50 61 72 73 65 20 2a 70  dexedBy(Parse *p
1ed70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
1ed80 70 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78  p, Token *pIndex
1ed90 65 64 42 79 29 7b 0a 20 20 61 73 73 65 72 74 28  edBy){.  assert(
1eda0 20 70 49 6e 64 65 78 65 64 42 79 21 3d 30 20 29   pIndexedBy!=0 )
1edb0 3b 0a 20 20 69 66 28 20 70 20 26 26 20 41 4c 57  ;.  if( p && ALW
1edc0 41 59 53 28 70 2d 3e 6e 53 72 63 3e 30 29 20 29  AYS(p->nSrc>0) )
1edd0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
1ede0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1edf0 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63   = &p->a[p->nSrc
1ee00 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
1ee10 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78   pItem->notIndex
1ee20 65 64 3d 3d 30 20 26 26 20 70 49 74 65 6d 2d 3e  ed==0 && pItem->
1ee30 7a 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b  zIndexedBy==0 );
1ee40 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 65  .    if( pIndexe
1ee50 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49  dBy->n==1 && !pI
1ee60 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20  ndexedBy->z ){. 
1ee70 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49       /* A "NOT I
1ee80 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65 20 77  NDEXED" clause w
1ee90 61 73 20 73 75 70 70 6c 69 65 64 2e 20 53 65 65  as supplied. See
1eea0 20 70 61 72 73 65 2e 79 20 0a 20 20 20 20 20 20   parse.y .      
1eeb0 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 22 69 6e  ** construct "in
1eec0 64 65 78 65 64 5f 6f 70 74 22 20 66 6f 72 20 64  dexed_opt" for d
1eed0 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20  etails. */.     
1eee0 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78   pItem->notIndex
1eef0 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ed = 1;.    }els
1ef00 65 7b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  e{.      pItem->
1ef10 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c  zIndexedBy = sql
1ef20 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1ef30 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49  n(pParse->db, pI
1ef40 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d  ndexedBy);.    }
1ef50 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  .  }.}../*.** Wh
1ef60 65 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61  en building up a
1ef70 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20   FROM clause in 
1ef80 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 20  the parser, the 
1ef90 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  join operator.**
1efa0 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74   is initially at
1efb0 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65  tached to the le
1efc0 66 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74  ft operand.  But
1efd0 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
1efe0 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74  tor.** expects t
1eff0 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
1f000 20 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69   to be on the ri
1f010 67 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68  ght operand.  Th
1f020 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68  is routine.** Sh
1f030 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70  ifts all join op
1f040 65 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66  erators from lef
1f050 74 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61  t to right for a
1f060 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a  n entire FROM.**
1f070 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45   clause..**.** E
1f080 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20  xample: Suppose 
1f090 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65  the join is like
1f0a0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1f0b0 20 20 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c         A natural
1f0c0 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a   cross join B.**
1f0d0 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72  .** The operator
1f0e0 20 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f   is "natural cro
1f0f0 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41  ss join".  The A
1f100 20 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20   and B operands 
1f110 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  are stored.** in
1f120 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e   p->a[0] and p->
1f130 61 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65  a[1], respective
1f140 6c 79 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  ly.  The parser 
1f150 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73  initially stores
1f160 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72   the.** operator
1f170 20 77 69 74 68 20 41 2e 20 20 54 68 69 73 20 72   with A.  This r
1f180 6f 75 74 69 6e 65 20 73 68 69 66 74 73 20 74 68  outine shifts th
1f190 61 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72  at operator over
1f1a0 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73   to B..*/.void s
1f1b0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68 69  qlite3SrcListShi
1f1c0 66 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69  ftJoinType(SrcLi
1f1d0 73 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  st *p){.  if( p 
1f1e0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
1f1f0 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d    for(i=p->nSrc-
1f200 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
1f210 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e      p->a[i].join
1f220 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d  type = p->a[i-1]
1f230 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  .jointype;.    }
1f240 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 6a 6f 69  .    p->a[0].joi
1f250 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  ntype = 0;.  }.}
1f260 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
1f270 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
1f280 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
1f290 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
1f2a0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74  e *pParse, int t
1f2b0 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ype){.  sqlite3 
1f2c0 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
1f2d0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65    int i;..  asse
1f2e0 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b  rt( pParse!=0 );
1f2f0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
1f300 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  db;.  assert( db
1f310 21 3d 30 20 29 3b 0a 2f 2a 20 20 69 66 28 20 64  !=0 );./*  if( d
1f320 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30  b->aDb[0].pBt==0
1f330 20 29 20 72 65 74 75 72 6e 3b 20 2a 2f 0a 20 20   ) return; */.  
1f340 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1f350 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1f360 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
1f370 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20   "BEGIN", 0, 0) 
1f380 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
1f390 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33   }.  v = sqlite3
1f3a0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1f3b0 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75  .  if( !v ) retu
1f3c0 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 3d 3d  rn;.  if( type==
1f3d0 54 4b 5f 49 4d 4d 45 44 49 41 54 45 20 7c 7c 20  TK_IMMEDIATE || 
1f3e0 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49  type==TK_EXCLUSI
1f3f0 56 45 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  VE ){.    for(i=
1f400 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
1f410 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
1f420 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1f430 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  P_Transaction, i
1f440 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c  , (type==TK_EXCL
1f450 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 20  USIVE)+1);.     
1f460 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
1f470 42 74 72 65 65 28 76 2c 20 69 29 3b 0a 20 20 20  Btree(v, i);.   
1f480 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
1f490 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1f4a0 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20  _AutoCommit, 0, 
1f4b0 30 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 55 4e 4c  0, (type==TK_UNL
1f4c0 4f 43 4b 45 44 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  OCKED));.}../*.*
1f4d0 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73  * Commit a trans
1f4e0 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
1f4f0 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e  qlite3CommitTran
1f500 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
1f510 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
1f520 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  v;..  assert( pP
1f530 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  arse!=0 );.  ass
1f540 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21  ert( pParse->db!
1f550 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  =0 );.  if( sqli
1f560 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1f570 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
1f580 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54  SACTION, "COMMIT
1f590 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  ", 0, 0) ){.    
1f5a0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20  return;.  }.  v 
1f5b0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
1f5c0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
1f5d0 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
1f5e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1f5f0 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20  _AutoCommit, 1, 
1f600 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
1f610 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e   Rollback a tran
1f620 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
1f630 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54  sqlite3RollbackT
1f640 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
1f650 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
1f660 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28  e *v;..  assert(
1f670 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20   pParse!=0 );.  
1f680 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1f690 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  db!=0 );.  if( s
1f6a0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1f6b0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
1f6c0 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c  RANSACTION, "ROL
1f6d0 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 7b  LBACK", 0, 0) ){
1f6e0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1f6f0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1f700 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1f710 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
1f720 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1f730 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
1f740 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 1, 1);.  }.}..
1f750 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1f760 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
1f770 20 74 68 65 20 70 61 72 73 65 72 20 77 68 65 6e   the parser when
1f780 20 69 74 20 70 61 72 73 65 73 20 61 20 63 6f 6d   it parses a com
1f790 6d 61 6e 64 20 74 6f 20 63 72 65 61 74 65 2c 0a  mand to create,.
1f7a0 2a 2a 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f  ** release or ro
1f7b0 6c 6c 62 61 63 6b 20 61 6e 20 53 51 4c 20 73 61  llback an SQL sa
1f7c0 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69  vepoint. .*/.voi
1f7d0 64 20 73 71 6c 69 74 65 33 53 61 76 65 70 6f 69  d sqlite3Savepoi
1f7e0 6e 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  nt(Parse *pParse
1f7f0 2c 20 69 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20  , int op, Token 
1f800 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  *pName){.  char 
1f810 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  *zName = sqlite3
1f820 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
1f830 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29  arse->db, pName)
1f840 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  ;.  if( zName ){
1f850 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73  .    Vdbe *v = s
1f860 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1f870 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53  arse);.#ifndef S
1f880 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
1f890 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 73 74 61  RIZATION.    sta
1f8a0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
1f8b0 20 63 6f 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20   const az[] = { 
1f8c0 22 42 45 47 49 4e 22 2c 20 22 52 45 4c 45 41 53  "BEGIN", "RELEAS
1f8d0 45 22 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d  E", "ROLLBACK" }
1f8e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 53  ;.    assert( !S
1f8f0 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26  AVEPOINT_BEGIN &
1f900 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  & SAVEPOINT_RELE
1f910 41 53 45 3d 3d 31 20 26 26 20 53 41 56 45 50 4f  ASE==1 && SAVEPO
1f920 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20  INT_ROLLBACK==2 
1f930 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
1f940 28 20 21 76 20 7c 7c 20 73 71 6c 69 74 65 33 41  ( !v || sqlite3A
1f950 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
1f960 20 53 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e   SQLITE_SAVEPOIN
1f970 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65  T, az[op], zName
1f980 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  , 0) ){.      sq
1f990 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
1f9a0 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  se->db, zName);.
1f9b0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
1f9c0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
1f9d0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1f9e0 53 61 76 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30  Savepoint, op, 0
1f9f0 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44  , 0, zName, P4_D
1fa00 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a  YNAMIC);.  }.}..
1fa10 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
1fa20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73  the TEMP databas
1fa30 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76  e is open and av
1fa40 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e  ailable for use.
1fa50 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
1fa60 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
1fa70 2e 20 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72  .  Leave any err
1fa80 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74  or messages in t
1fa90 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
1faa0 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ure..*/.int sqli
1fab0 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62  te3OpenTempDatab
1fac0 61 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ase(Parse *pPars
1fad0 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
1fae0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1faf0 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d    if( db->aDb[1]
1fb00 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72  .pBt==0 && !pPar
1fb10 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
1fb20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42     int rc;.    B
1fb30 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 73  tree *pBt;.    s
1fb40 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20  tatic const int 
1fb50 66 6c 61 67 73 20 3d 20 0a 20 20 20 20 20 20 20  flags = .       
1fb60 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
1fb70 45 41 44 57 52 49 54 45 20 7c 0a 20 20 20 20 20  EADWRITE |.     
1fb80 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1fb90 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20  _CREATE |.      
1fba0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1fbb0 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20  EXCLUSIVE |.    
1fbc0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1fbd0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  N_DELETEONCLOSE 
1fbe0 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
1fbf0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b  TE_OPEN_TEMP_DB;
1fc00 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
1fc10 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e  e3BtreeOpen(db->
1fc20 70 56 66 73 2c 20 30 2c 20 64 62 2c 20 26 70 42  pVfs, 0, db, &pB
1fc30 74 2c 20 30 2c 20 66 6c 61 67 73 29 3b 0a 20 20  t, 0, flags);.  
1fc40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1fc50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
1fc60 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1fc70 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  rse, "unable to 
1fc80 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  open a temporary
1fc90 20 64 61 74 61 62 61 73 65 20 22 0a 20 20 20 20   database ".    
1fca0 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74      "file for st
1fcb0 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20  oring temporary 
1fcc0 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20  tables");.      
1fcd0 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b  pParse->rc = rc;
1fce0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1fcf0 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61  .    }.    db->a
1fd00 44 62 5b 31 5d 2e 70 42 74 20 3d 20 70 42 74 3b  Db[1].pBt = pBt;
1fd10 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
1fd20 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
1fd30 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
1fd40 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33  E_NOMEM==sqlite3
1fd50 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
1fd60 28 70 42 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61  (pBt, db->nextPa
1fd70 67 65 73 69 7a 65 2c 20 2d 31 2c 20 30 29 20 29  gesize, -1, 0) )
1fd80 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c  {.      db->mall
1fd90 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
1fda0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1fdb0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1fdc0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63   0;.}../*.** Rec
1fdd0 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
1fde0 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  t the schema coo
1fdf0 6b 69 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  kie will need to
1fe00 20 62 65 20 76 65 72 69 66 69 65 64 0a 2a 2a 20   be verified.** 
1fe10 66 6f 72 20 64 61 74 61 62 61 73 65 20 69 44 62  for database iDb
1fe20 2e 20 20 54 68 65 20 63 6f 64 65 20 74 6f 20 61  .  The code to a
1fe30 63 74 75 61 6c 6c 79 20 76 65 72 69 66 79 20 74  ctually verify t
1fe40 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
1fe50 0a 2a 2a 20 77 69 6c 6c 20 6f 63 63 75 72 20 61  .** will occur a
1fe60 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
1fe70 20 74 6f 70 2d 6c 65 76 65 6c 20 56 44 42 45 20   top-level VDBE 
1fe80 61 6e 64 20 77 69 6c 6c 20 62 65 20 67 65 6e 65  and will be gene
1fe90 72 61 74 65 64 0a 2a 2a 20 6c 61 74 65 72 2c 20  rated.** later, 
1fea0 62 79 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  by sqlite3Finish
1feb0 43 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69  Coding()..*/.voi
1fec0 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  d sqlite3CodeVer
1fed0 69 66 79 53 63 68 65 6d 61 28 50 61 72 73 65 20  ifySchema(Parse 
1fee0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62  *pParse, int iDb
1fef0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70  ){.  Parse *pTop
1ff00 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
1ff10 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
1ff20 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20  rse);.  sqlite3 
1ff30 2a 64 62 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d  *db = pToplevel-
1ff40 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  >db;..  assert( 
1ff50 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
1ff60 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
1ff70 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  t( db->aDb[iDb].
1ff80 70 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31  pBt!=0 || iDb==1
1ff90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44   );.  assert( iD
1ffa0 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  b<SQLITE_MAX_ATT
1ffb0 41 43 48 45 44 2b 32 20 29 3b 0a 20 20 61 73 73  ACHED+2 );.  ass
1ffc0 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
1ffd0 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
1ffe0 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 69 66 28  iDb, 0) );.  if(
1fff0 20 44 62 4d 61 73 6b 54 65 73 74 28 70 54 6f 70   DbMaskTest(pTop
20000 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73  level->cookieMas
20010 6b 2c 20 69 44 62 29 3d 3d 30 20 29 7b 0a 20 20  k, iDb)==0 ){.  
20020 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70    DbMaskSet(pTop
20030 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73  level->cookieMas
20040 6b 2c 20 69 44 62 29 3b 0a 20 20 20 20 70 54 6f  k, iDb);.    pTo
20050 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 56 61  plevel->cookieVa
20060 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61  lue[iDb] = db->a
20070 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
20080 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a  >schema_cookie;.
20090 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
200a0 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
200b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
200c0 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28  penTempDatabase(
200d0 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20  pToplevel);.    
200e0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
200f0 66 20 61 72 67 75 6d 65 6e 74 20 7a 44 62 20 69  f argument zDb i
20100 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 61 6c  s NULL, then cal
20110 6c 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  l sqlite3CodeVer
20120 69 66 79 53 63 68 65 6d 61 28 29 20 66 6f 72 20  ifySchema() for 
20130 65 61 63 68 20 0a 2a 2a 20 61 74 74 61 63 68 65  each .** attache
20140 64 20 64 61 74 61 62 61 73 65 2e 20 4f 74 68 65  d database. Othe
20150 72 77 69 73 65 2c 20 69 6e 76 6f 6b 65 20 69 74  rwise, invoke it
20160 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
20170 65 20 6e 61 6d 65 64 20 7a 44 62 20 6f 6e 6c 79  e named zDb only
20180 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
20190 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64  3CodeVerifyNamed
201a0 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50  Schema(Parse *pP
201b0 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
201c0 20 2a 7a 44 62 29 7b 0a 20 20 73 71 6c 69 74 65   *zDb){.  sqlite
201d0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
201e0 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  db;.  int i;.  f
201f0 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
20200 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20  b; i++){.    Db 
20210 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
20220 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  i];.    if( pDb-
20230 3e 70 42 74 20 26 26 20 28 21 7a 44 62 20 7c 7c  >pBt && (!zDb ||
20240 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
20250 6d 70 28 7a 44 62 2c 20 70 44 62 2d 3e 7a 4e 61  mp(zDb, pDb->zNa
20260 6d 65 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71  me)) ){.      sq
20270 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
20280 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29  chema(pParse, i)
20290 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
202a0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
202b0 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65  BE code that pre
202c0 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20  pares for doing 
202d0 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61  an operation tha
202e0 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67  t.** might chang
202f0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  e the database..
20300 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
20310 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20  ne starts a new 
20320 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77  transaction if w
20330 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64  e are not alread
20340 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72  y within.** a tr
20350 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77  ansaction.  If w
20360 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69  e are already wi
20370 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
20380 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b  on, then a check
20390 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20  point.** is set 
203a0 69 66 20 74 68 65 20 73 65 74 53 74 61 74 65 6d  if the setStatem
203b0 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  ent parameter is
203c0 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70   true.  A checkp
203d0 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  oint should.** b
203e0 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74  e set for operat
203f0 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20  ions that might 
20400 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63  fail (due to a c
20410 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20  onstraint) part 
20420 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68  of.** the way th
20430 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20  rough and which 
20440 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64  will need to und
20450 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69  o some writes wi
20460 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a  thout having to.
20470 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** rollback the 
20480 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  whole transactio
20490 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f  n.  For operatio
204a0 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e  ns where all con
204b0 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20  straints.** can 
204c0 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72  be checked befor
204d0 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72  e any changes ar
204e0 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  e made to the da
204f0 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65  tabase, it is ne
20500 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79  ver.** necessary
20510 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65   to undo a write
20520 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f   and the checkpo
20530 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  int should not b
20540 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  e set..*/.void s
20550 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
20560 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20  Operation(Parse 
20570 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74  *pParse, int set
20580 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69  Statement, int i
20590 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54  Db){.  Parse *pT
205a0 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
205b0 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
205c0 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
205d0 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
205e0 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
205f0 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70    DbMaskSet(pTop
20600 6c 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73 6b  level->writeMask
20610 2c 20 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c 65  , iDb);.  pTople
20620 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74  vel->isMultiWrit
20630 65 20 7c 3d 20 73 65 74 53 74 61 74 65 6d 65 6e  e |= setStatemen
20640 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69  t;.}../*.** Indi
20650 63 61 74 65 20 74 68 61 74 20 74 68 65 20 73 74  cate that the st
20660 61 74 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c  atement currentl
20670 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
20680 74 69 6f 6e 20 6d 69 67 68 74 20 77 72 69 74 65  tion might write
20690 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  .** more than on
206a0 65 20 65 6e 74 72 79 20 28 65 78 61 6d 70 6c 65  e entry (example
206b0 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72  : deleting one r
206c0 6f 77 20 74 68 65 6e 20 69 6e 73 65 72 74 69 6e  ow then insertin
206d0 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e  g another,.** in
206e0 73 65 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65  serting multiple
206f0 20 72 6f 77 73 20 69 6e 20 61 20 74 61 62 6c 65   rows in a table
20700 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 61  , or inserting a
20710 20 72 6f 77 20 61 6e 64 20 69 6e 64 65 78 20 65   row and index e
20720 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61  ntries.).** If a
20730 6e 20 61 62 6f 72 74 20 6f 63 63 75 72 73 20 61  n abort occurs a
20740 66 74 65 72 20 73 6f 6d 65 20 6f 66 20 74 68 65  fter some of the
20750 73 65 20 77 72 69 74 65 73 20 68 61 76 65 20 63  se writes have c
20760 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65 6e 20 69  ompleted, then i
20770 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63  t will.** be nec
20780 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 74  essary to undo t
20790 68 65 20 63 6f 6d 70 6c 65 74 65 64 20 77 72 69  he completed wri
207a0 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tes..*/.void sql
207b0 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28 50  ite3MultiWrite(P
207c0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
207d0 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
207e0 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
207f0 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
20800 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69  ;.  pToplevel->i
20810 73 4d 75 6c 74 69 57 72 69 74 65 20 3d 20 31 3b  sMultiWrite = 1;
20820 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63  .}../* .** The c
20830 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 63 61  ode generator ca
20840 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
20850 20 69 66 20 69 73 20 64 69 73 63 6f 76 65 72 73   if is discovers
20860 20 74 68 61 74 20 69 74 20 69 73 0a 2a 2a 20 70   that it is.** p
20870 6f 73 73 69 62 6c 65 20 74 6f 20 61 62 6f 72 74  ossible to abort
20880 20 61 20 73 74 61 74 65 6d 65 6e 74 20 70 72 69   a statement pri
20890 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  or to completion
208a0 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a  .  In order to .
208b0 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20  ** perform this 
208c0 61 62 6f 72 74 20 77 69 74 68 6f 75 74 20 63 6f  abort without co
208d0 72 72 75 70 74 69 6e 67 20 74 68 65 20 64 61 74  rrupting the dat
208e0 61 62 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74  abase, we need t
208f0 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74  o make.** sure t
20900 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hat the statemen
20910 74 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62  t is protected b
20920 79 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  y a statement tr
20930 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
20940 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65   Technically, we
20950 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 65   only need to se
20960 74 20 74 68 65 20 6d 61 79 41 62 6f 72 74 20 66  t the mayAbort f
20970 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a 20 69 73  lag if the.** is
20980 4d 75 6c 74 69 57 72 69 74 65 20 66 6c 61 67 20  MultiWrite flag 
20990 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73  was previously s
209a0 65 74 2e 20 20 54 68 65 72 65 20 69 73 20 61 20  et.  There is a 
209b0 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a  time dependency.
209c0 2a 2a 20 73 75 63 68 20 74 68 61 74 20 74 68 65  ** such that the
209d0 20 61 62 6f 72 74 20 6d 75 73 74 20 6f 63 63 75   abort must occu
209e0 72 20 61 66 74 65 72 20 74 68 65 20 6d 75 6c 74  r after the mult
209f0 69 77 72 69 74 65 2e 20 20 54 68 69 73 20 6d 61  iwrite.  This ma
20a00 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74  kes.** some stat
20a10 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67  ements involving
20a20 20 74 68 65 20 52 45 50 4c 41 43 45 20 63 6f 6e   the REPLACE con
20a30 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
20a40 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f   algorithm.** go
20a50 20 61 20 6c 69 74 74 6c 65 20 66 61 73 74 65 72   a little faster
20a60 2e 20 20 42 75 74 20 74 61 6b 69 6e 67 20 61 64  .  But taking ad
20a70 76 61 6e 74 61 67 65 20 6f 66 20 74 68 69 73 20  vantage of this 
20a80 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a  time dependency.
20a90 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65  ** makes it more
20aa0 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 70 72   difficult to pr
20ab0 6f 76 65 20 74 68 61 74 20 74 68 65 20 63 6f 64  ove that the cod
20ac0 65 20 69 73 20 63 6f 72 72 65 63 74 20 28 69 6e  e is correct (in
20ad0 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 2c   .** particular,
20ae0 20 69 74 20 70 72 65 76 65 6e 74 73 20 75 73 20   it prevents us 
20af0 66 72 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e 20  from writing an 
20b00 65 66 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70  effective.** imp
20b10 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73  lementation of s
20b20 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
20b30 62 6f 72 74 28 29 29 20 61 6e 64 20 73 6f 20 77  bort()) and so w
20b40 65 20 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a  e have chosen.**
20b50 20 74 6f 20 74 61 6b 65 20 74 68 65 20 73 61 66   to take the saf
20b60 65 20 72 6f 75 74 65 20 61 6e 64 20 73 6b 69 70  e route and skip
20b70 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
20b80 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
20b90 65 33 4d 61 79 41 62 6f 72 74 28 50 61 72 73 65  e3MayAbort(Parse
20ba0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72   *pParse){.  Par
20bb0 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
20bc0 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
20bd0 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
20be0 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62  pToplevel->mayAb
20bf0 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  ort = 1;.}../*.*
20c00 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c  * Code an OP_Hal
20c10 74 20 74 68 61 74 20 63 61 75 73 65 73 20 74 68  t that causes th
20c20 65 20 76 64 62 65 20 74 6f 20 72 65 74 75 72 6e  e vdbe to return
20c30 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   an SQLITE_CONST
20c40 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20  RAINT.** error. 
20c50 54 68 65 20 6f 6e 45 72 72 6f 72 20 70 61 72 61  The onError para
20c60 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73  meter determines
20c70 20 77 68 69 63 68 20 28 69 66 20 61 6e 79 29 20   which (if any) 
20c80 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
20c90 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72 65  .** and/or curre
20ca0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
20cb0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
20cc0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 48 61  /.void sqlite3Ha
20cd0 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  ltConstraint(.  
20ce0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
20cf0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
20d00 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 72  text */.  int er
20d10 72 43 6f 64 65 2c 20 20 20 20 20 20 2f 2a 20 65  rCode,      /* e
20d20 78 74 65 6e 64 65 64 20 65 72 72 6f 72 20 63 6f  xtended error co
20d30 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  de */.  int onEr
20d40 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e  ror,      /* Con
20d50 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a  straint type */.
20d60 20 20 63 68 61 72 20 2a 70 34 2c 20 20 20 20 20    char *p4,     
20d70 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73      /* Error mes
20d80 73 61 67 65 20 2a 2f 0a 20 20 69 38 20 70 34 74  sage */.  i8 p4t
20d90 79 70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ype,        /* P
20da0 34 5f 53 54 41 54 49 43 20 6f 72 20 50 34 5f 54  4_STATIC or P4_T
20db0 52 41 4e 53 49 45 4e 54 20 2a 2f 0a 20 20 75 38  RANSIENT */.  u8
20dc0 20 70 35 45 72 72 6d 73 67 20 20 20 20 20 20 20   p5Errmsg       
20dd0 2f 2a 20 50 35 5f 45 72 72 4d 73 67 20 74 79 70  /* P5_ErrMsg typ
20de0 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  e */.){.  Vdbe *
20df0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
20e00 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  be(pParse);.  as
20e10 73 65 72 74 28 20 28 65 72 72 43 6f 64 65 26 30  sert( (errCode&0
20e20 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  xff)==SQLITE_CON
20e30 53 54 52 41 49 4e 54 20 29 3b 0a 20 20 69 66 28  STRAINT );.  if(
20e40 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f   onError==OE_Abo
20e50 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rt ){.    sqlite
20e60 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
20e70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
20e80 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
20e90 5f 48 61 6c 74 2c 20 65 72 72 43 6f 64 65 2c 20  _Halt, errCode, 
20ea0 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20  onError, 0, p4, 
20eb0 70 34 74 79 70 65 29 3b 0a 20 20 69 66 28 20 70  p4type);.  if( p
20ec0 35 45 72 72 6d 73 67 20 29 20 73 71 6c 69 74 65  5Errmsg ) sqlite
20ed0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
20ee0 20 70 35 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f   p5Errmsg);.}../
20ef0 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
20f00 48 61 6c 74 20 64 75 65 20 74 6f 20 55 4e 49 51  Halt due to UNIQ
20f10 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45  UE or PRIMARY KE
20f20 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f  Y constraint vio
20f30 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  lation..*/.void 
20f40 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e  sqlite3UniqueCon
20f50 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65  straint(.  Parse
20f60 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
20f70 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
20f80 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
20f90 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  ,      /* Constr
20fa0 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 49  aint type */.  I
20fb0 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
20fc0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68   /* The index th
20fd0 61 74 20 74 72 69 67 67 65 72 73 20 74 68 65 20  at triggers the 
20fe0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b  constraint */.){
20ff0 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20  .  char *zErr;. 
21000 20 69 6e 74 20 6a 3b 0a 20 20 53 74 72 41 63 63   int j;.  StrAcc
21010 75 6d 20 65 72 72 4d 73 67 3b 0a 20 20 54 61 62  um errMsg;.  Tab
21020 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 64 78 2d  le *pTab = pIdx-
21030 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 73 71 6c 69  >pTable;..  sqli
21040 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
21050 26 65 72 72 4d 73 67 2c 20 70 50 61 72 73 65 2d  &errMsg, pParse-
21060 3e 64 62 2c 20 30 2c 20 30 2c 20 32 30 30 29 3b  >db, 0, 0, 200);
21070 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49  .  for(j=0; j<pI
21080 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b  dx->nKeyCol; j++
21090 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  ){.    char *zCo
210a0 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  l = pTab->aCol[p
210b0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
210c0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  ].zName;.    if(
210d0 20 6a 20 29 20 73 71 6c 69 74 65 33 53 74 72 41   j ) sqlite3StrA
210e0 63 63 75 6d 41 70 70 65 6e 64 28 26 65 72 72 4d  ccumAppend(&errM
210f0 73 67 2c 20 22 2c 20 22 2c 20 32 29 3b 0a 20 20  sg, ", ", 2);.  
21100 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
21110 6d 41 70 70 65 6e 64 41 6c 6c 28 26 65 72 72 4d  mAppendAll(&errM
21120 73 67 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  sg, pTab->zName)
21130 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72  ;.    sqlite3Str
21140 41 63 63 75 6d 41 70 70 65 6e 64 28 26 65 72 72  AccumAppend(&err
21150 4d 73 67 2c 20 22 2e 22 2c 20 31 29 3b 0a 20 20  Msg, ".", 1);.  
21160 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
21170 6d 41 70 70 65 6e 64 41 6c 6c 28 26 65 72 72 4d  mAppendAll(&errM
21180 73 67 2c 20 7a 43 6f 6c 29 3b 0a 20 20 7d 0a 20  sg, zCol);.  }. 
21190 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 53   zErr = sqlite3S
211a0 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 65  trAccumFinish(&e
211b0 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
211c0 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
211d0 70 50 61 72 73 65 2c 20 0a 20 20 20 20 49 73 50  pParse, .    IsP
211e0 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
211f0 49 64 78 29 20 3f 20 53 51 4c 49 54 45 5f 43 4f  Idx) ? SQLITE_CO
21200 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59  NSTRAINT_PRIMARY
21210 4b 45 59 20 0a 20 20 20 20 20 20 20 20 20 20 20  KEY .           
21220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21230 20 3a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   : SQLITE_CONSTR
21240 41 49 4e 54 5f 55 4e 49 51 55 45 2c 0a 20 20 20  AINT_UNIQUE,.   
21250 20 6f 6e 45 72 72 6f 72 2c 20 7a 45 72 72 2c 20   onError, zErr, 
21260 50 34 5f 44 59 4e 41 4d 49 43 2c 20 50 35 5f 43  P4_DYNAMIC, P5_C
21270 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29  onstraintUnique)
21280 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  ;.}.../*.** Code
21290 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20   an OP_Halt due 
212a0 74 6f 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f  to non-unique ro
212b0 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wid..*/.void sql
212c0 69 74 65 33 52 6f 77 69 64 43 6f 6e 73 74 72 61  ite3RowidConstra
212d0 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  int(.  Parse *pP
212e0 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
212f0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
21300 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
21310 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72     /* Conflict r
21320 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
21330 74 68 6d 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  thm */.  Table *
21340 70 54 61 62 20 20 20 20 20 20 20 2f 2a 20 54 68  pTab       /* Th
21350 65 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  e table with the
21360 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69   non-unique rowi
21370 64 20 2a 2f 20 0a 29 7b 0a 20 20 63 68 61 72 20  d */ .){.  char 
21380 2a 7a 4d 73 67 3b 0a 20 20 69 6e 74 20 72 63 3b  *zMsg;.  int rc;
21390 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b  .  if( pTab->iPK
213a0 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 7a 4d 73  ey>=0 ){.    zMs
213b0 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
213c0 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
213d0 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  %s.%s", pTab->zN
213e0 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
213f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
21400 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e  Tab->aCol[pTab->
21410 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  iPKey].zName);. 
21420 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
21430 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52  ONSTRAINT_PRIMAR
21440 59 4b 45 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  YKEY;.  }else{. 
21450 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
21460 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
21470 3e 64 62 2c 20 22 25 73 2e 72 6f 77 69 64 22 2c  >db, "%s.rowid",
21480 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
21490 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
214a0 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 3b  ONSTRAINT_ROWID;
214b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61  .  }.  sqlite3Ha
214c0 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  ltConstraint(pPa
214d0 72 73 65 2c 20 72 63 2c 20 6f 6e 45 72 72 6f 72  rse, rc, onError
214e0 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
214f0 49 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  IC,.            
21500 20 20 20 20 20 20 20 20 20 20 20 20 50 35 5f 43              P5_C
21510 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29  onstraintUnique)
21520 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
21530 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64 65   to see if pInde
21540 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61  x uses the colla
21550 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43  ting sequence pC
21560 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  oll.  Return.** 
21570 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 20  true if it does 
21580 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74 20  and false if it 
21590 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66  does not..*/.#if
215a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
215b0 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20  _REINDEX.static 
215c0 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74  int collationMat
215d0 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ch(const char *z
215e0 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e  Coll, Index *pIn
215f0 64 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  dex){.  int i;. 
21600 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d   assert( zColl!=
21610 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0 );.  for(i=0; 
21620 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  i<pIndex->nColum
21630 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  n; i++){.    con
21640 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e  st char *z = pIn
21650 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  dex->azColl[i];.
21660 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30      assert( z!=0
21670 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f   || pIndex->aiCo
21680 6c 75 6d 6e 5b 69 5d 3c 30 20 29 3b 0a 20 20 20  lumn[i]<0 );.   
21690 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 69 43   if( pIndex->aiC
216a0 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 26 26 20 30  olumn[i]>=0 && 0
216b0 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
216c0 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  (z, zColl) ){.  
216d0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
216e0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
216f0 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
21700 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c  .** Recompute al
21710 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61  l indices of pTa
21720 62 20 74 68 61 74 20 75 73 65 20 74 68 65 20 63  b that use the c
21730 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
21740 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70  e pColl..** If p
21750 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63  Coll==0 then rec
21760 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
21770 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23  es of pTab..*/.#
21780 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21790 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
217a0 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61  c void reindexTa
217b0 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
217c0 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
217d0 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
217e0 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  l){.  Index *pIn
217f0 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
21800 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
21810 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
21820 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e  ab */..  for(pIn
21830 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  dex=pTab->pIndex
21840 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
21850 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b  =pIndex->pNext){
21860 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d  .    if( zColl==
21870 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61  0 || collationMa
21880 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65  tch(zColl, pInde
21890 78 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  x) ){.      int 
218a0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
218b0 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
218c0 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
218d0 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  hema);.      sql
218e0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
218f0 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
21900 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  0, iDb);.      s
21910 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
21920 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
21930 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , -1);.    }.  }
21940 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
21950 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
21960 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61  ndices of all ta
21970 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61  bles in all data
21980 62 61 73 65 73 20 77 68 65 72 65 20 74 68 65 0a  bases where the.
21990 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20 74  ** indices use t
219a0 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
219b0 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66  uence pColl.  If
219c0 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72   pColl==0 then r
219d0 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20  ecompute.** all 
219e0 69 6e 64 69 63 65 73 20 65 76 65 72 79 77 68 65  indices everywhe
219f0 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  re..*/.#ifndef S
21a00 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
21a10 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  EX.static void r
21a20 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
21a30 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
21a40 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c  har const *zColl
21a50 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  ){.  Db *pDb;   
21a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a70 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74   /* A single dat
21a80 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  abase */.  int i
21a90 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
21aa0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
21ab0 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d  tabase index num
21ac0 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ber */.  sqlite3
21ad0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
21ae0 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  b;   /* The data
21af0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
21b00 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b  */.  HashElem *k
21b10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21b20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
21b30 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70  over tables in p
21b40 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  Db */.  Table *p
21b50 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
21b60 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
21b70 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
21b80 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
21b90 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c  ite3BtreeHoldsAl
21ba0 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 20  lMutexes(db) ); 
21bb0 20 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72 20 73   /* Needed for s
21bc0 63 68 65 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a  chema access */.
21bd0 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62    for(iDb=0, pDb
21be0 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62  =db->aDb; iDb<db
21bf0 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44  ->nDb; iDb++, pD
21c00 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  b++){.    assert
21c10 28 20 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20  ( pDb!=0 );.    
21c20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68  for(k=sqliteHash
21c30 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68  First(&pDb->pSch
21c40 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20  ema->tblHash);  
21c50 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e  k; k=sqliteHashN
21c60 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70  ext(k)){.      p
21c70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71  Tab = (Table*)sq
21c80 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b  liteHashData(k);
21c90 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 54 61  .      reindexTa
21ca0 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
21cb0 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a  , zColl);.    }.
21cc0 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
21cd0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
21ce0 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45  e for the REINDE
21cf0 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  X command..**.**
21d00 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
21d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a             -- 1.
21d30 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
21d40 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20  X  <collation>  
21d50 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
21d60 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  2.**        REIN
21d70 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  DEX  ?<database>
21d80 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d  .?<tablename>  -
21d90 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 3.**        RE
21da0 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73  INDEX  ?<databas
21db0 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20  e>.?<indexname> 
21dc0 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d   -- 4.**.** Form
21dd0 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e   1 causes all in
21de0 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74  dices in all att
21df0 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
21e00 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a  to be rebuilt..*
21e10 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64  * Form 2 rebuild
21e20 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e  s all indices in
21e30 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74   all databases t
21e40 68 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65  hat use the name
21e50 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66  d.** collating f
21e60 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20  unction.  Forms 
21e70 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20  3 and 4 rebuild 
21e80 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  the named index 
21e90 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65  or all.** indice
21ea0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
21eb0 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  h the named tabl
21ec0 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
21ed0 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
21ee0 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  X.void sqlite3Re
21ef0 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  index(Parse *pPa
21f00 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  rse, Token *pNam
21f10 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  e1, Token *pName
21f20 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  2){.  CollSeq *p
21f30 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
21f40 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
21f50 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65  equence to be re
21f60 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c  indexed, or NULL
21f70 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20   */.  char *z;  
21f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f90 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74    /* Name of a t
21fa0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f  able or index */
21fb0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
21fc0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Db;            /
21fd0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
21fe0 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c  tabase */.  Tabl
21ff0 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
22000 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62          /* A tab
22010 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
22020 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  se */.  Index *p
22030 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
22040 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
22050 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
22060 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44  pTab */.  int iD
22070 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
22080 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
22090 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62  abase index numb
220a0 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
220b0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
220c0 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
220d0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
220e0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e  /.  Token *pObjN
220f0 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
22100 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
22110 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f  able or index to
22120 20 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f   be reindexed */
22130 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
22140 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
22150 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
22160 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
22170 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a  ror message.  **
22180 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61   and code in pPa
22190 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  rse and return N
221a0 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51  ULL. */.  if( SQ
221b0 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
221c0 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
221d0 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
221e0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61  ;.  }..  if( pNa
221f0 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  me1==0 ){.    re
22200 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
22210 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72  Parse, 0);.    r
22220 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69  eturn;.  }else i
22230 66 28 20 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d  f( NEVER(pName2=
22240 3d 30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a  =0) || pName2->z
22250 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
22260 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65  *zColl;.    asse
22270 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b  rt( pName1->z );
22280 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c  .    zColl = sql
22290 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
222a0 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e  n(pParse->db, pN
222b0 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 21  ame1);.    if( !
222c0 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a  zColl ) return;.
222d0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
222e0 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
222f0 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c  b, ENC(db), zCol
22300 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  l, 0);.    if( p
22310 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65  Coll ){.      re
22320 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
22330 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  Parse, zColl);. 
22340 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
22350 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  ee(db, zColl);. 
22360 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
22370 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
22380 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
22390 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
223a0 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
223b0 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
223c0 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d  pName2, &pObjNam
223d0 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20  e);.  if( iDb<0 
223e0 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20  ) return;.  z = 
223f0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
22400 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d  oken(db, pObjNam
22410 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  e);.  if( z==0 )
22420 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d   return;.  zDb =
22430 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
22440 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  ame;.  pTab = sq
22450 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
22460 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66  b, z, zDb);.  if
22470 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65  ( pTab ){.    re
22480 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73  indexTable(pPars
22490 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20  e, pTab, 0);.   
224a0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
224b0 62 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74 75 72  b, z);.    retur
224c0 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20  n;.  }.  pIndex 
224d0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
224e0 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a  ex(db, z, zDb);.
224f0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
22500 64 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 49  db, z);.  if( pI
22510 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  ndex ){.    sqli
22520 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
22530 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
22540 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
22550 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
22560 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
22570 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  1);.    return;.
22580 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72    }.  sqlite3Err
22590 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
225a0 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66  nable to identif
225b0 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20  y the object to 
225c0 62 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a  be reindexed");.
225d0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
225e0 52 65 74 75 72 6e 20 61 20 4b 65 79 49 6e 66 6f  Return a KeyInfo
225f0 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
22600 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
22610 6f 72 20 74 68 65 20 67 69 76 65 6e 20 49 6e 64  or the given Ind
22620 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4b 65  ex..**.** The Ke
22630 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
22640 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 69 73 20  for an index is 
22650 63 61 63 68 65 64 20 69 6e 20 74 68 65 20 49 6e  cached in the In
22660 64 65 78 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 53  dex object..** S
22670 6f 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65  o there might be
22680 20 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72 65   multiple refere
22690 6e 63 65 73 20 74 6f 20 74 68 65 20 72 65 74 75  nces to the retu
226a0 72 6e 65 64 20 70 6f 69 6e 74 65 72 2e 20 20 54  rned pointer.  T
226b0 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f  he.** caller sho
226c0 75 6c 64 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d  uld not try to m
226d0 6f 64 69 66 79 20 74 68 65 20 4b 65 79 49 6e 66  odify the KeyInf
226e0 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  o object..**.** 
226f0 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  The caller shoul
22700 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  d invoke sqlite3
22710 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 29 20 6f  KeyInfoUnref() o
22720 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f  n the returned o
22730 62 6a 65 63 74 0a 2a 2a 20 77 68 65 6e 20 69 74  bject.** when it
22740 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 75 73   has finished us
22750 69 6e 67 20 69 74 2e 0a 2a 2f 0a 4b 65 79 49 6e  ing it..*/.KeyIn
22760 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e  fo *sqlite3KeyIn
22770 66 6f 4f 66 49 6e 64 65 78 28 50 61 72 73 65 20  foOfIndex(Parse 
22780 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a  *pParse, Index *
22790 70 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  pIdx){.  int i;.
227a0 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64    int nCol = pId
227b0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e  x->nColumn;.  in
227c0 74 20 6e 4b 65 79 20 3d 20 70 49 64 78 2d 3e 6e  t nKey = pIdx->n
227d0 4b 65 79 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66  KeyCol;.  KeyInf
227e0 6f 20 2a 70 4b 65 79 3b 0a 20 20 69 66 28 20 70  o *pKey;.  if( p
227f0 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
22800 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49  turn 0;.  if( pI
22810 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  dx->uniqNotNull 
22820 29 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71  ){.    pKey = sq
22830 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
22840 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b  c(pParse->db, nK
22850 65 79 2c 20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b 0a  ey, nCol-nKey);.
22860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65    }else{.    pKe
22870 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  y = sqlite3KeyIn
22880 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  foAlloc(pParse->
22890 64 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20  db, nCol, 0);.  
228a0 7d 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a  }.  if( pKey ){.
228b0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
228c0 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
228d0 65 61 62 6c 65 28 70 4b 65 79 29 20 29 3b 0a 20  eable(pKey) );. 
228e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
228f0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
22900 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49  char *zColl = pI
22910 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20  dx->azColl[i];. 
22920 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 43 6f       assert( zCo
22930 6c 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ll!=0 );.      p
22940 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Key->aColl[i] = 
22950 73 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c 22 42 49  strcmp(zColl,"BI
22960 4e 41 52 59 22 29 3d 3d 30 20 3f 20 30 20 3a 0a  NARY")==0 ? 0 :.
22970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22980 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c          sqlite3L
22990 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
229a0 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  rse, zColl);.   
229b0 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72     pKey->aSortOr
229c0 64 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61  der[i] = pIdx->a
229d0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20  SortOrder[i];.  
229e0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72    }.    if( pPar
229f0 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
22a00 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
22a10 55 6e 72 65 66 28 70 4b 65 79 29 3b 0a 20 20 20  Unref(pKey);.   
22a20 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20     pKey = 0;.   
22a30 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
22a40 70 4b 65 79 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  pKey;.}..#ifndef
22a50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
22a60 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ./* .** This rou
22a70 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  tine is invoked 
22a80 6f 6e 63 65 20 70 65 72 20 43 54 45 20 62 79 20  once per CTE by 
22a90 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
22aa0 20 70 61 72 73 69 6e 67 20 61 20 0a 2a 2a 20 57   parsing a .** W
22ab0 49 54 48 20 63 6c 61 75 73 65 2e 20 0a 2a 2f 0a  ITH clause. .*/.
22ac0 57 69 74 68 20 2a 73 71 6c 69 74 65 33 57 69 74  With *sqlite3Wit
22ad0 68 41 64 64 28 0a 20 20 50 61 72 73 65 20 2a 70  hAdd(.  Parse *p
22ae0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
22af0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
22b00 78 74 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57  xt */.  With *pW
22b10 69 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ith,            
22b20 2f 2a 20 45 78 69 73 74 69 6e 67 20 57 49 54 48  /* Existing WITH
22b30 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c   clause, or NULL
22b40 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
22b50 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me,           /*
22b60 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6d   Name of the com
22b70 6d 6f 6e 2d 74 61 62 6c 65 20 2a 2f 0a 20 20 45  mon-table */.  E
22b80 78 70 72 4c 69 73 74 20 2a 70 41 72 67 6c 69 73  xprList *pArglis
22b90 74 2c 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e  t,     /* Option
22ba0 61 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6c  al column name l
22bb0 69 73 74 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ist for the tabl
22bc0 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
22bd0 51 75 65 72 79 20 20 20 20 20 20 20 20 20 20 2f  Query          /
22be0 2a 20 51 75 65 72 79 20 75 73 65 64 20 74 6f 20  * Query used to 
22bf0 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 74  initialize the t
22c00 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  able */.){.  sql
22c10 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
22c20 65 2d 3e 64 62 3b 0a 20 20 57 69 74 68 20 2a 70  e->db;.  With *p
22c30 4e 65 77 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  New;.  char *zNa
22c40 6d 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  me;..  /* Check 
22c50 74 68 61 74 20 74 68 65 20 43 54 45 20 6e 61 6d  that the CTE nam
22c60 65 20 69 73 20 75 6e 69 71 75 65 20 77 69 74 68  e is unique with
22c70 69 6e 20 74 68 69 73 20 57 49 54 48 20 63 6c 61  in this WITH cla
22c80 75 73 65 2e 20 49 66 0a 20 20 2a 2a 20 6e 6f 74  use. If.  ** not
22c90 2c 20 73 74 6f 72 65 20 61 6e 20 65 72 72 6f 72  , store an error
22ca0 20 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74   in the Parse st
22cb0 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 7a 4e  ructure. */.  zN
22cc0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
22cd0 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
22ce0 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  e->db, pName);. 
22cf0 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 70 57   if( zName && pW
22d00 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ith ){.    int i
22d10 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
22d20 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b  <pWith->nCte; i+
22d30 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
22d40 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61  lite3StrICmp(zNa
22d50 6d 65 2c 20 70 57 69 74 68 2d 3e 61 5b 69 5d 2e  me, pWith->a[i].
22d60 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
22d70 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
22d80 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75  rMsg(pParse, "du
22d90 70 6c 69 63 61 74 65 20 57 49 54 48 20 74 61 62  plicate WITH tab
22da0 6c 65 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 4e  le name: %s", zN
22db0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
22dc0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
22dd0 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20  With ){.    int 
22de0 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
22df0 70 57 69 74 68 29 20 2b 20 28 73 69 7a 65 6f 66  pWith) + (sizeof
22e00 28 70 57 69 74 68 2d 3e 61 5b 31 5d 29 20 2a 20  (pWith->a[1]) * 
22e10 70 57 69 74 68 2d 3e 6e 43 74 65 29 3b 0a 20 20  pWith->nCte);.  
22e20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
22e30 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 57  DbRealloc(db, pW
22e40 69 74 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  ith, nByte);.  }
22e50 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 20 3d  else{.    pNew =
22e60 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
22e70 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
22e80 2a 70 57 69 74 68 29 29 3b 0a 20 20 7d 0a 20 20  *pWith));.  }.  
22e90 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30  assert( zName!=0
22ea0 20 7c 7c 20 70 4e 65 77 3d 3d 30 20 29 3b 0a 20   || pNew==0 );. 
22eb0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
22ec0 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20  locFailed==0 || 
22ed0 70 4e 65 77 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  pNew==0 );..  if
22ee0 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
22ef0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
22f00 44 65 6c 65 74 65 28 64 62 2c 20 70 41 72 67 6c  Delete(db, pArgl
22f10 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
22f20 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
22f30 2c 20 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73  , pQuery);.    s
22f40 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
22f50 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65   zName);.    pNe
22f60 77 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d 65 6c  w = pWith;.  }el
22f70 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b  se{.    pNew->a[
22f80 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c  pNew->nCte].pSel
22f90 65 63 74 20 3d 20 70 51 75 65 72 79 3b 0a 20 20  ect = pQuery;.  
22fa0 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
22fb0 6e 43 74 65 5d 2e 70 43 6f 6c 73 20 3d 20 70 41  nCte].pCols = pA
22fc0 72 67 6c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77  rglist;.    pNew
22fd0 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e  ->a[pNew->nCte].
22fe0 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
22ff0 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
23000 3e 6e 43 74 65 5d 2e 7a 45 72 72 20 3d 20 30 3b  >nCte].zErr = 0;
23010 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 43 74 65 2b  .    pNew->nCte+
23020 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  +;.  }..  return
23030 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
23040 46 72 65 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  Free the content
23050 73 20 6f 66 20 74 68 65 20 57 69 74 68 20 6f 62  s of the With ob
23060 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
23070 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
23080 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
23090 74 65 33 57 69 74 68 44 65 6c 65 74 65 28 73 71  te3WithDelete(sq
230a0 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20  lite3 *db, With 
230b0 2a 70 57 69 74 68 29 7b 0a 20 20 69 66 28 20 70  *pWith){.  if( p
230c0 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20  With ){.    int 
230d0 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
230e0 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69  i<pWith->nCte; i
230f0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
23100 74 20 43 74 65 20 2a 70 43 74 65 20 3d 20 26 70  t Cte *pCte = &p
23110 57 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  With->a[i];.    
23120 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
23130 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65  tDelete(db, pCte
23140 2d 3e 70 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20  ->pCols);.      
23150 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
23160 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 53  ete(db, pCte->pS
23170 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71  elect);.      sq
23180 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
23190 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCte->zName);.  
231a0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
231b0 62 46 72 65 65 28 64 62 2c 20 70 57 69 74 68 29  bFree(db, pWith)
231c0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
231d0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
231e0 45 5f 4f 4d 49 54 5f 43 54 45 29 20 2a 2f 0a     E_OMIT_CTE) */.