/ Hex Artifact Content
Login

Artifact 63465c86f7d5919fddb112ec6d38342863e8e8b3:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t.h"../*.** This
02f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
0300: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 53 51  ed when a new SQ
0310: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 62  L statement is b
0320: 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62  eginning to.** b
0330: 65 20 70 61 72 73 65 64 2e 20 20 49 6e 69 74 69  e parsed.  Initi
0340: 61 6c 69 7a 65 20 74 68 65 20 70 50 61 72 73 65  alize the pParse
0350: 20 73 74 72 75 63 74 75 72 65 20 61 73 20 6e 65   structure as ne
0360: 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eded..*/.void sq
0370: 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73 65 28  lite3BeginParse(
0380: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
0390: 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67 29 7b  nt explainFlag){
03a0: 0a 20 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  .  pParse->expla
03b0: 69 6e 20 3d 20 28 75 38 29 65 78 70 6c 61 69 6e  in = (u8)explain
03c0: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
03d0: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  nVar = 0;.}..#if
03e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
03f0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0400: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 4c 6f 63  .** The TableLoc
0410: 6b 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  k structure is o
0420: 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65 20  nly used by the 
0430: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0440: 28 29 20 61 6e 64 0a 2a 2a 20 63 6f 64 65 54 61  () and.** codeTa
0450: 62 6c 65 4c 6f 63 6b 73 28 29 20 66 75 6e 63 74  bleLocks() funct
0460: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ions..*/.struct 
0470: 54 61 62 6c 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  TableLock {.  in
0480: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
0490: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
04a0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
04b0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f  e table to be lo
04c0: 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  cked */.  int iT
04d0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ab;            /
04e0: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
04f0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0500: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
0510: 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20  8 isWriteLock;  
0520: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
0530: 77 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c  write lock.  Fal
0540: 73 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f  se for a read lo
0550: 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ck */.  const ch
0560: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
0570: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
0580: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  e */.};../*.** R
0590: 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
05a0: 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6c  hat we want to l
05b0: 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20 72  ock a table at r
05c0: 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a 2a  un-time.  .**.**
05d0: 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   The table to be
05e0: 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f 74   locked has root
05f0: 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20 69   page iTab and i
0600: 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61 62  s found in datab
0610: 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72 65  ase iDb..** A re
0620: 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c 6f  ad or a write lo
0630: 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e 20  ck can be taken 
0640: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73 57  depending on isW
0650: 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ritelock..**.** 
0660: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
0670: 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66 61  t records the fa
0680: 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ct that the lock
0690: 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54 68   is desired.  Th
06a0: 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61 6b  e.** code to mak
06b0: 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75 72  e the lock occur
06c0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
06d0: 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74 6f   a later call to
06e0: 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  .** codeTableLoc
06f0: 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75 72  ks() which occur
0700: 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  s during sqlite3
0710: 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
0720: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  */.void sqlite3T
0730: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72 73  ableLock(.  Pars
0740: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
0750: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0760: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
0770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
0780: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
0790: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
07a0: 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 20  e table to lock 
07b0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
07c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
07d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
07e0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c  he table to be l
07f0: 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69 73  ocked */.  u8 is
0800: 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f 2a  WriteLock,    /*
0810: 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69 74   True for a writ
0820: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73  e lock */.  cons
0830: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 2f  t char *zName  /
0840: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
0850: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
0860: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
0870: 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
0880: 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
0890: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
08a0: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 3b  i;.  int nBytes;
08b0: 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 3b  .  TableLock *p;
08c0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
08d0: 30 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  0 );..  for(i=0;
08e0: 20 69 3c 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54   i<pToplevel->nT
08f0: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0900: 20 20 20 20 70 20 3d 20 26 70 54 6f 70 6c 65 76      p = &pToplev
0910: 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69  el->aTableLock[i
0920: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 44  ];.    if( p->iD
0930: 62 3d 3d 69 44 62 20 26 26 20 70 2d 3e 69 54 61  b==iDb && p->iTa
0940: 62 3d 3d 69 54 61 62 20 29 7b 0a 20 20 20 20 20  b==iTab ){.     
0950: 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20   p->isWriteLock 
0960: 3d 20 28 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63  = (p->isWriteLoc
0970: 6b 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b  k || isWriteLock
0980: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
0990: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42  .    }.  }..  nB
09a0: 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 54 61  ytes = sizeof(Ta
09b0: 62 6c 65 4c 6f 63 6b 29 20 2a 20 28 70 54 6f 70  bleLock) * (pTop
09c0: 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63  level->nTableLoc
09d0: 6b 2b 31 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  k+1);.  pTopleve
09e0: 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 0a  l->aTableLock =.
09f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52        sqlite3DbR
0a00: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 54 6f  eallocOrFree(pTo
0a10: 70 6c 65 76 65 6c 2d 3e 64 62 2c 20 70 54 6f 70  plevel->db, pTop
0a20: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
0a30: 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  k, nBytes);.  if
0a40: 28 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61  ( pToplevel->aTa
0a50: 62 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  bleLock ){.    p
0a60: 20 3d 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61   = &pToplevel->a
0a70: 54 61 62 6c 65 4c 6f 63 6b 5b 70 54 6f 70 6c 65  TableLock[pTople
0a80: 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b  vel->nTableLock+
0a90: 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d  +];.    p->iDb =
0aa0: 20 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61   iDb;.    p->iTa
0ab0: 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d  b = iTab;.    p-
0ac0: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69  >isWriteLock = i
0ad0: 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20  sWriteLock;.    
0ae0: 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  p->zName = zName
0af0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
0b00: 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65  Toplevel->nTable
0b10: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 70 54  Lock = 0;.    pT
0b20: 6f 70 6c 65 76 65 6c 2d 3e 64 62 2d 3e 6d 61 6c  oplevel->db->mal
0b30: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
0b40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
0b50: 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b   an OP_TableLock
0b60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
0b70: 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b   each table lock
0b80: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 61  ed by the.** sta
0b90: 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75 72  tement (configur
0ba0: 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
0bb0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
0bc0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ))..*/.static vo
0bd0: 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  id codeTableLock
0be0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  s(Parse *pParse)
0bf0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0c00: 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70 56  e *pVdbe; ..  pV
0c10: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dbe = sqlite3Get
0c20: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
0c30: 61 73 73 65 72 74 28 20 70 56 64 62 65 21 3d 30  assert( pVdbe!=0
0c40: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47 65   ); /* sqlite3Ge
0c50: 74 56 64 62 65 20 63 61 6e 6e 6f 74 20 66 61 69  tVdbe cannot fai
0c60: 6c 3a 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  l: VDBE already 
0c70: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20  allocated */..  
0c80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
0c90: 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69  e->nTableLock; i
0ca0: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f  ++){.    TableLo
0cb0: 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d  ck *p = &pParse-
0cc0: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
0cd0: 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e      int p1 = p->
0ce0: 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  iDb;.    sqlite3
0cf0: 56 64 62 65 41 64 64 4f 70 34 28 70 56 64 62 65  VdbeAddOp4(pVdbe
0d00: 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20  , OP_TableLock, 
0d10: 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e  p1, p->iTab, p->
0d20: 69 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20  isWriteLock,.   
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f     p->zName, P4_
0d50: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  STATIC);.  }.}.#
0d60: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63  else.  #define c
0d70: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29  odeTableLocks(x)
0d80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0d90: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0da0: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0db0: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0dc0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0dd0: 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45  arsed and a VDBE
0de0: 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63   program to exec
0df0: 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ute that stateme
0e00: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0e10: 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72  repared.  This r
0e20: 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20  outine puts the 
0e30: 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65  finishing touche
0e40: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  s on the.** VDBE
0e50: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73   program and res
0e60: 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73  ets the pParse s
0e70: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
0e80: 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a   next.** parse..
0e90: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0ea0: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0eb0: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0ec0: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
0ed0: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
0ee0: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
0ef0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69  /.void sqlite3Fi
0f00: 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65  nishCoding(Parse
0f10: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
0f20: 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
0f30: 20 2a 76 3b 0a 0a 20 20 64 62 20 3d 20 70 50 61   *v;..  db = pPa
0f40: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64  rse->db;.  if( d
0f50: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0f60: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
0f70: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29  pParse->nested )
0f80: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
0f90: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
0fa0: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65 67 69  turn;..  /* Begi
0fb0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
0fc0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
0fd0: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
0fe0: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
0ff0: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1000: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1010: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1020: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1030: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1040: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1050: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1060: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
1070: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
1080: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1090: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
10a0: 48 61 6c 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  Halt);..    /* T
10b0: 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b 20 63  he cookie mask c
10c0: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69 74 20  ontains one bit 
10d0: 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73  for each databas
10e0: 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20 20 20  e file open..   
10f0: 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20 66 6f   ** (Bit 0 is fo
1100: 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20 69 73  r main, bit 1 is
1110: 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64 20 73   for temp, and s
1120: 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74 73 20  o forth.)  Bits 
1130: 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 66  are.    ** set f
1140: 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65  or each database
1150: 20 74 68 61 74 20 69 73 20 75 73 65 64 2e 20 20   that is used.  
1160: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1170: 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a 2a 20   start a.    ** 
1180: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 65  transaction on e
1190: 61 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73  ach used databas
11a0: 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66 79 20  e and to verify 
11b0: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
11c0: 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61 63 68  e.    ** on each
11d0: 20 75 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a   used database..
11e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
11f0: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
1200: 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 79 44 62  o>0 ){.      yDb
1210: 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 20 20 20  Mask mask;.     
1220: 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20   int iDb;.      
1230: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
1240: 65 72 65 28 76 2c 20 70 50 61 72 73 65 2d 3e 63  ere(v, pParse->c
1250: 6f 6f 6b 69 65 47 6f 74 6f 2d 31 29 3b 0a 20 20  ookieGoto-1);.  
1260: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 6d      for(iDb=0, m
1270: 61 73 6b 3d 31 3b 20 69 44 62 3c 64 62 2d 3e 6e  ask=1; iDb<db->n
1280: 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44  Db; mask<<=1, iD
1290: 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  b++){.        if
12a0: 28 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65  ( (mask & pParse
12b0: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30  ->cookieMask)==0
12c0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
12d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12e0: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
12f0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1300: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 4f  e3VdbeAddOp2(v,O
1310: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  P_Transaction, i
1320: 44 62 2c 20 28 6d 61 73 6b 20 26 20 70 50 61 72  Db, (mask & pPar
1330: 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d  se->writeMask)!=
1340: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
1350: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
1360: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
1370: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
1380: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
1390: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
13a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13b0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 56 65  eAddOp3(v, OP_Ve
13c0: 72 69 66 79 43 6f 6f 6b 69 65 2c 0a 20 20 20 20  rifyCookie,.    
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 20 20 20 20 69 44 62 2c 20 70 50 61          iDb, pPa
13f0: 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65  rse->cookieValue
1400: 5b 69 44 62 5d 2c 0a 20 20 20 20 20 20 20 20 20  [iDb],.         
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
1430: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
1440: 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  tion);.        }
1450: 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
1460: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1470: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
1480: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  {.        int i;
1490: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
14a0: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61  ; i<pParse->nVta
14b0: 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  bLock; i++){.   
14c0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 76 74 61         char *vta
14d0: 62 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  b = (char *)sqli
14e0: 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c  te3GetVTable(db,
14f0: 20 70 50 61 72 73 65 2d 3e 61 70 56 74 61 62 4c   pParse->apVtabL
1500: 6f 63 6b 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ock[i]);.       
1510: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1520: 64 4f 70 34 28 76 2c 20 4f 50 5f 56 42 65 67 69  dOp4(v, OP_VBegi
1530: 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 76 74 61 62  n, 0, 0, 0, vtab
1540: 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20  , P4_VTAB);.    
1550: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
1560: 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 20  arse->nVtabLock 
1570: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  = 0;.      }.#en
1580: 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  dif..      /* On
1590: 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69  ce all the cooki
15a0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72  es have been ver
15b0: 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61  ified and transa
15c0: 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a  ctions opened, .
15d0: 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20        ** obtain 
15e0: 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62  the required tab
15f0: 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69  le-locks. This i
1600: 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
1610: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73   the .      ** s
1620: 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74  hared-cache feat
1630: 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  ure is enabled..
1640: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
1650: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50  odeTableLocks(pP
1660: 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  arse);..      /*
1670: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20   Initialize any 
1680: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61  AUTOINCREMENT da
1690: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65  ta structures re
16a0: 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  quired..      */
16b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75  .      sqlite3Au
16c0: 74 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e  toincrementBegin
16d0: 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20  (pParse);..     
16e0: 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a 75 6d   /* Finally, jum
16f0: 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65  p back to the be
1700: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 65  ginning of the e
1710: 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65 2e 20  xecutable code. 
1720: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1730: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1740: 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65  _Goto, 0, pParse
1750: 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29 3b 0a 20  ->cookieGoto);. 
1760: 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20     }.  }...  /* 
1770: 47 65 74 20 74 68 65 20 56 44 42 45 20 70 72 6f  Get the VDBE pro
1780: 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72 20 65  gram ready for e
1790: 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20  xecution.  */.  
17a0: 69 66 28 20 76 20 26 26 20 41 4c 57 41 59 53 28  if( v && ALWAYS(
17b0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 29  pParse->nErr==0)
17c0: 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
17d0: 61 69 6c 65 64 20 29 7b 0a 23 69 66 64 65 66 20  ailed ){.#ifdef 
17e0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
17f0: 20 46 49 4c 45 20 2a 74 72 61 63 65 20 3d 20 28   FILE *trace = (
1800: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1810: 54 45 5f 56 64 62 65 54 72 61 63 65 29 21 3d 30  TE_VdbeTrace)!=0
1820: 20 3f 20 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20   ? stdout : 0;. 
1830: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72     sqlite3VdbeTr
1840: 61 63 65 28 76 2c 20 74 72 61 63 65 29 3b 0a 23  ace(v, trace);.#
1850: 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
1860: 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  ( pParse->iCache
1870: 4c 65 76 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20  Level==0 );  /* 
1880: 44 69 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d  Disables and re-
1890: 65 6e 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f  enables match */
18a0: 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75  .    /* A minimu
18b0: 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73 6f 72 20  m of one cursor 
18c0: 69 73 20 72 65 71 75 69 72 65 64 20 69 66 20 61  is required if a
18d0: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 69 73 20  utoincrement is 
18e0: 75 73 65 64 0a 20 20 20 20 2a 20 20 53 65 65 20  used.    *  See 
18f0: 74 69 63 6b 65 74 20 5b 61 36 39 36 33 37 39 63  ticket [a696379c
1900: 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20  1f08866] */.    
1910: 69 66 28 20 70 50 61 72 73 65 2d 3e 70 41 69 6e  if( pParse->pAin
1920: 63 21 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e  c!=0 && pParse->
1930: 6e 54 61 62 3d 3d 30 20 29 20 70 50 61 72 73 65  nTab==0 ) pParse
1940: 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 20 20  ->nTab = 1;.    
1950: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
1960: 65 61 64 79 28 76 2c 20 70 50 61 72 73 65 2d 3e  eady(v, pParse->
1970: 6e 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 6e 4d  nVar, pParse->nM
1980: 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  em,.            
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
19a0: 72 73 65 2d 3e 6e 54 61 62 2c 20 70 50 61 72 73  rse->nTab, pPars
19b0: 65 2d 3e 6e 4d 61 78 41 72 67 2c 20 70 50 61 72  e->nMaxArg, pPar
19c0: 73 65 2d 3e 65 78 70 6c 61 69 6e 2c 0a 20 20 20  se->explain,.   
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 73        pParse->is
19f0: 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20 70 50  MultiWrite && pP
1a00: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b  arse->mayAbort);
1a10: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
1a20: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1a30: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61     pParse->colNa
1a40: 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65  mesSet = 0;.  }e
1a50: 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  lse{.    pParse-
1a60: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52  >rc = SQLITE_ERR
1a70: 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65  OR;.  }.  pParse
1a80: 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20 70 50  ->nTab = 0;.  pP
1a90: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a  arse->nMem = 0;.
1aa0: 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d    pParse->nSet =
1ab0: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56   0;.  pParse->nV
1ac0: 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ar = 0;.  pParse
1ad0: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20 30  ->cookieMask = 0
1ae0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  ;.  pParse->cook
1af0: 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f  ieGoto = 0;.}../
1b00: 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70 61 72  *.** Run the par
1b10: 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ser and code gen
1b20: 65 72 61 74 6f 72 20 72 65 63 75 72 73 69 76 65  erator recursive
1b30: 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ly in order to g
1b40: 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20  enerate.** code 
1b50: 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74 61 74  for the SQL stat
1b60: 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f  ement given onto
1b70: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1b80: 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a  pParse context.*
1b90: 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  * currently unde
1ba0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
1bb0: 20 57 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   When the parser
1bc0: 20 69 73 20 72 75 6e 20 72 65 63 75 72 73 69 76   is run recursiv
1bd0: 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c  ely.** this way,
1be0: 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61   the final OP_Ha
1bf0: 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65 6e 64  lt is not append
1c00: 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69 6e 69  ed and other ini
1c10: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61  tialization.** a
1c20: 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  nd finalization 
1c30: 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74 74 65  steps are omitte
1c40: 64 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20  d because those 
1c50: 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62 79 20  are handling by 
1c60: 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74  the.** outermost
1c70: 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e   parser..**.** N
1c80: 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  ot everything is
1c90: 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68 69 73   nestable.  This
1ca0: 20 66 61 63 69 6c 69 74 79 20 69 73 20 64 65 73   facility is des
1cb0: 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69 74 0a  igned to permit.
1cc0: 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  ** INSERT, UPDAT
1cd0: 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20 6f 70  E, and DELETE op
1ce0: 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e 73 74  erations against
1cf0: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20   SQLITE_MASTER. 
1d00: 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69 66 20   Use.** care if 
1d10: 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20 74 72  you decide to tr
1d20: 79 20 74 6f 20 75 73 65 20 74 68 69 73 20 72 6f  y to use this ro
1d30: 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f  utine for some o
1d40: 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a  ther purposes..*
1d50: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4e 65  /.void sqlite3Ne
1d60: 73 74 65 64 50 61 72 73 65 28 50 61 72 73 65 20  stedParse(Parse 
1d70: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
1d80: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
1d90: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
1da0: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
1db0: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
1dc0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  = 0;.  sqlite3 *
1dd0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1de0: 0a 23 20 64 65 66 69 6e 65 20 53 41 56 45 5f 53  .# define SAVE_S
1df0: 5a 20 20 28 73 69 7a 65 6f 66 28 50 61 72 73 65  Z  (sizeof(Parse
1e00: 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 50 61 72  ) - offsetof(Par
1e10: 73 65 2c 6e 56 61 72 29 29 0a 20 20 63 68 61 72  se,nVar)).  char
1e20: 20 73 61 76 65 42 75 66 5b 53 41 56 45 5f 53 5a   saveBuf[SAVE_SZ
1e30: 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  ];..  if( pParse
1e40: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
1e50: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1e60: 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20  e->nested<10 ); 
1e70: 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75   /* Nesting shou
1e80: 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69  ld only be of li
1e90: 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20  mited depth */. 
1ea0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
1eb0: 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d  ormat);.  zSql =
1ec0: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
1ed0: 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  (db, zFormat, ap
1ee0: 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
1ef0: 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
1f00: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20  {.    return;   
1f10: 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74  /* A malloc must
1f20: 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a   have failed */.
1f30: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65    }.  pParse->ne
1f40: 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79  sted++;.  memcpy
1f50: 28 73 61 76 65 42 75 66 2c 20 26 70 50 61 72 73  (saveBuf, &pPars
1f60: 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45 5f 53 5a  e->nVar, SAVE_SZ
1f70: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61  );.  memset(&pPa
1f80: 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c 20 53 41  rse->nVar, 0, SA
1f90: 56 45 5f 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65  VE_SZ);.  sqlite
1fa0: 33 52 75 6e 50 61 72 73 65 72 28 70 50 61 72 73  3RunParser(pPars
1fb0: 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72 4d 73  e, zSql, &zErrMs
1fc0: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
1fd0: 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
1fe0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1ff0: 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d  e(db, zSql);.  m
2000: 65 6d 63 70 79 28 26 70 50 61 72 73 65 2d 3e 6e  emcpy(&pParse->n
2010: 56 61 72 2c 20 73 61 76 65 42 75 66 2c 20 53 41  Var, saveBuf, SA
2020: 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73 65  VE_SZ);.  pParse
2030: 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f  ->nested--;.}../
2040: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
2050: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
2060: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
2070: 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
2080: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c  database.** tabl
2090: 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  e given the name
20a0: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
20b0: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
20c0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
20d0: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  ** database cont
20e0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
20f0: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
2100: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  f not found..**.
2110: 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20  ** If zDatabase 
2120: 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61  is 0, all databa
2130: 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64  ses are searched
2140: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61   for the table a
2150: 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  nd the.** first 
2160: 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 69  matching table i
2170: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f  s returned.  (No
2180: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 75   checking for du
2190: 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a  plicate table.**
21a0: 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29   names is done.)
21b0: 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64    The search ord
21c0: 65 72 20 69 73 20 54 45 4d 50 20 66 69 72 73 74  er is TEMP first
21d0: 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65  , then MAIN, the
21e0: 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61  n any.** auxilia
21f0: 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64  ry databases add
2200: 65 64 20 75 73 69 6e 67 20 74 68 65 20 41 54 54  ed using the ATT
2210: 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  ACH command..**.
2220: 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
2230: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29  te3LocateTable()
2240: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
2250: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71 6c  te3FindTable(sql
2260: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
2270: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
2280: 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61  st char *zDataba
2290: 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20  se){.  Table *p 
22a0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
22b0: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 61 73 73  int nName;.  ass
22c0: 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20 29 3b  ert( zName!=0 );
22d0: 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  nName = sqlit
22e0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
22f0: 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65  );.  /* All mute
2300: 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  xes are required
2310: 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
2320: 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77  ss.  Make sure w
2330: 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a  e hold them. */.
2340: 20 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62    assert( zDatab
2350: 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase!=0 || sqlite
2360: 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
2370: 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20 66  texes(db) );.  f
2380: 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42  or(i=OMIT_TEMPDB
2390: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
23a0: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28  ){.    int j = (
23b0: 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20  i<2) ? i^1 : i; 
23c0: 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50    /* Search TEMP
23d0: 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a   before MAIN */.
23e0: 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73      if( zDatabas
23f0: 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  e!=0 && sqlite3S
2400: 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65  trICmp(zDatabase
2410: 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61  , db->aDb[j].zNa
2420: 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  me) ) continue;.
2430: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2440: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
2450: 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a  ld(db, j, 0) );.
2460: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48      p = sqlite3H
2470: 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62  ashFind(&db->aDb
2480: 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  [j].pSchema->tbl
2490: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Hash, zName, nNa
24a0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  me);.    if( p )
24b0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
24c0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
24d0: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
24e0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
24f0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
2500: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
2510: 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69  base.** table gi
2520: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
2530: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
2540: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
2550: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  name of the.** d
2560: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
2570: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
2580: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
2590: 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c  t found.  Also l
25a0: 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  eave an.** error
25b0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
25c0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
25d0: 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
25e0: 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
25f0: 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74  outine and sqlit
2600: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73  e3FindTable() is
2610: 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f   that this.** ro
2620: 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20  utine leaves an 
2630: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
2640: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
2650: 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65   where.** sqlite
2660: 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65  3FindTable() doe
2670: 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20  s not..*/.Table 
2680: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61  *sqlite3LocateTa
2690: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
26a0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
26b0: 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69 63   context in whic
26c0: 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f  h to report erro
26d0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  rs */.  int isVi
26e0: 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew,            /
26f0: 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69 6e  * True if lookin
2700: 67 20 66 6f 72 20 61 20 56 49 45 57 20 72 61 74  g for a VIEW rat
2710: 68 65 72 20 74 68 61 6e 20 61 20 54 41 42 4c 45  her than a TABLE
2720: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2730: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20   *zName,     /* 
2740: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
2750: 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  e we are looking
2760: 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   for */.  const 
2770: 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20 20  char *zDbase    
2780: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2790: 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68 74  database.  Might
27a0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   be NULL */.){. 
27b0: 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a   Table *p;..  /*
27c0: 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
27d0: 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
27e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
27f0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
2800: 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
2810: 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
2820: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
2830: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
2840: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
2850: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
2860: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2870: 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  }..  p = sqlite3
2880: 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
2890: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  ->db, zName, zDb
28a0: 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ase);.  if( p==0
28b0: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
28c0: 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69 65  ar *zMsg = isVie
28d0: 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65  w ? "no such vie
28e0: 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61  w" : "no such ta
28f0: 62 6c 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44  ble";.    if( zD
2900: 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71  base ){.      sq
2910: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2920: 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73  arse, "%s: %s.%s
2930: 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c  ", zMsg, zDbase,
2940: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
2950: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
2960: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2970: 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67  , "%s: %s", zMsg
2980: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  , zName);.    }.
2990: 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
29a0: 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d  kSchema = 1;.  }
29b0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
29c0: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
29d0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
29e0: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
29f0: 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63  bes .** a partic
2a00: 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e  ular index given
2a10: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
2a20: 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  t index.** and t
2a30: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
2a40: 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e  atabase that con
2a50: 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e  tains the index.
2a60: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
2a70: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
2a80: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
2a90: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
2aa0: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
2ab0: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62  d for the.** tab
2ac0: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  le and the first
2ad0: 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20   matching index 
2ae0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
2af0: 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f  o checking.** fo
2b00: 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65  r duplicate inde
2b10: 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  x names is done.
2b20: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
2b30: 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66  der is.** TEMP f
2b40: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2b50: 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69   then any auxili
2b60: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
2b70: 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ded.** using the
2b80: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
2b90: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
2ba0: 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69  e3FindIndex(sqli
2bb0: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
2bc0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
2bd0: 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
2be0: 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20  Index *p = 0;.  
2bf0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61  int i;.  int nNa
2c00: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2c10: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 2f  en30(zName);.  /
2c20: 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72  * All mutexes ar
2c30: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  e required for s
2c40: 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d  chema access.  M
2c50: 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64  ake sure we hold
2c60: 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65   them. */.  asse
2c70: 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73 71  rt( zDb!=0 || sq
2c80: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
2c90: 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b  llMutexes(db) );
2ca0: 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45  .  for(i=OMIT_TE
2cb0: 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  MPDB; i<db->nDb;
2cc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
2cd0: 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a   = (i<2) ? i^1 :
2ce0: 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54   i;  /* Search T
2cf0: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
2d00: 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  */.    Schema *p
2d10: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
2d20: 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20  [j].pSchema;.   
2d30: 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d 61   assert( pSchema
2d40: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20   );.    if( zDb 
2d50: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2d60: 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a  p(zDb, db->aDb[j
2d70: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
2d80: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
2d90: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
2da0: 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30  texHeld(db, j, 0
2db0: 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  ) );.    p = sql
2dc0: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 53  ite3HashFind(&pS
2dd0: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
2de0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
2df0: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
2e00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
2e10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61  ;.}../*.** Recla
2e20: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73  im the memory us
2e30: 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a  ed by an index.*
2e40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
2e50: 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  eeIndex(sqlite3 
2e60: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a  *db, Index *p){.
2e70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2e80: 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71  MIT_ANALYZE.  sq
2e90: 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78  lite3DeleteIndex
2ea0: 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a  Samples(db, p);.
2eb0: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
2ec0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 43  DbFree(db, p->zC
2ed0: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
2ee0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
2ef0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  }../*.** For the
2f00: 20 69 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49   index called zI
2f10: 64 78 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20  dxName which is 
2f20: 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74  found in the dat
2f30: 61 62 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e  abase iDb,.** un
2f40: 6c 69 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20  like that index 
2f50: 66 72 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74  from its Table t
2f60: 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69  hen remove the i
2f70: 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  ndex from.** the
2f80: 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
2f90: 65 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d  e and free all m
2fa0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
2fb0: 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
2fc0: 69 74 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ith the index..*
2fd0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  /.void sqlite3Un
2fe0: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64  linkAndDeleteInd
2ff0: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ex(sqlite3 *db, 
3000: 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63  int iDb, const c
3010: 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a  har *zIdxName){.
3020: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
3030: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 48 61  .  int len;.  Ha
3040: 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73  sh *pHash;..  as
3050: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
3060: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
3070: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48   iDb, 0) );.  pH
3080: 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  ash = &db->aDb[i
3090: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db].pSchema->idx
30a0: 48 61 73 68 3b 0a 20 20 6c 65 6e 20 3d 20 73 71  Hash;.  len = sq
30b0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49  lite3Strlen30(zI
30c0: 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65  dxName);.  pInde
30d0: 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  x = sqlite3HashI
30e0: 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64  nsert(pHash, zId
30f0: 78 4e 61 6d 65 2c 20 6c 65 6e 2c 20 30 29 3b 0a  xName, len, 0);.
3100: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e    if( ALWAYS(pIn
3110: 64 65 78 29 20 29 7b 0a 20 20 20 20 69 66 28 20  dex) ){.    if( 
3120: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
3130: 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29  pIndex==pIndex )
3140: 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
3150: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d  pTable->pIndex =
3160: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
3170: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3180: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20   Index *p;.     
3190: 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f   /* Justificatio
31a0: 6e 20 6f 66 20 41 4c 57 41 59 53 28 29 3b 20 20  n of ALWAYS();  
31b0: 54 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62  The index must b
31c0: 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  e on the list of
31d0: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 65  .      ** indice
31e0: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 20 3d 20  s. */.      p = 
31f0: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
3200: 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68  pIndex;.      wh
3210: 69 6c 65 28 20 41 4c 57 41 59 53 28 70 29 20 26  ile( ALWAYS(p) &
3220: 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64  & p->pNext!=pInd
3230: 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  ex ){ p = p->pNe
3240: 78 74 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20  xt; }.      if( 
3250: 41 4c 57 41 59 53 28 70 20 26 26 20 70 2d 3e 70  ALWAYS(p && p->p
3260: 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29 20 29 7b  Next==pIndex) ){
3270: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78  .        p->pNex
3280: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
3290: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
32a0: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 64  .    freeIndex(d
32b0: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
32c0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
32d0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
32e0: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  ges;.}../*.** Er
32f0: 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69  ase all schema i
3300: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
3310: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  the in-memory ha
3320: 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20  sh tables of.** 
3330: 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
3340: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
3350: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
3360: 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20  claim memory.** 
3370: 62 65 66 6f 72 65 20 74 68 65 20 64 61 74 61 62  before the datab
3380: 61 73 65 20 63 6c 6f 73 65 73 2e 20 20 49 74 20  ase closes.  It 
3390: 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64  is also called d
33a0: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
33b0: 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65 72  .** if there wer
33c0: 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  e schema changes
33d0: 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e   during the tran
33e0: 73 61 63 74 69 6f 6e 20 6f 72 20 69 66 20 61 0a  saction or if a.
33f0: 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65  ** schema-cookie
3400: 20 6d 69 73 6d 61 74 63 68 20 6f 63 63 75 72 73   mismatch occurs
3410: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30  ..**.** If iDb<0
3420: 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20   then reset the 
3430: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
3440: 74 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64  tables for all d
3450: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73  atabase.** files
3460: 2e 20 20 49 66 20 69 44 62 3e 3d 30 20 74 68 65  .  If iDb>=0 the
3470: 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65  n reset the inte
3480: 72 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f 72 20  rnal schema for 
3490: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67  only the.** sing
34a0: 6c 65 20 66 69 6c 65 20 69 6e 64 69 63 61 74 65  le file indicate
34b0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
34c0: 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
34d0: 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64  chema(sqlite3 *d
34e0: 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69  b, int iDb){.  i
34f0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 73 73 65 72  nt i, j;.  asser
3500: 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  t( iDb<db->nDb )
3510: 3b 0a 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20  ;..  if( iDb>=0 
3520: 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31  ){.    /* Case 1
3530: 3a 20 20 52 65 73 65 74 20 74 68 65 20 73 69 6e  :  Reset the sin
3540: 67 6c 65 20 73 63 68 65 6d 61 20 69 64 65 6e 74  gle schema ident
3550: 69 66 69 65 64 20 62 79 20 69 44 62 20 2a 2f 0a  ified by iDb */.
3560: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
3570: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20  b->aDb[iDb];.   
3580: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3590: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
35a0: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
35b0: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 44     if( ALWAYS(pD
35c0: 62 2d 3e 70 53 63 68 65 6d 61 29 20 29 7b 0a 20  b->pSchema) ){. 
35d0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65       sqlite3Sche
35e0: 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63  maClear(pDb->pSc
35f0: 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hema);.    }.   
3600: 20 2f 2a 20 49 66 20 61 6e 79 20 64 61 74 61 62   /* If any datab
3610: 61 73 65 20 6f 74 68 65 72 20 74 68 61 6e 20 54  ase other than T
3620: 45 4d 50 20 69 73 20 72 65 73 65 74 2c 20 74 68  EMP is reset, th
3630: 65 6e 20 61 6c 73 6f 20 72 65 73 65 74 20 54 45  en also reset TE
3640: 4d 50 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65 20  MP.    ** since 
3650: 54 45 4d 50 20 6d 69 67 68 74 20 62 65 20 68 6f  TEMP might be ho
3660: 6c 64 69 6e 67 20 74 72 69 67 67 65 72 73 20 74  lding triggers t
3670: 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 61  hat reference ta
3680: 62 6c 65 73 20 69 6e 20 74 68 65 0a 20 20 20 20  bles in the.    
3690: 2a 2a 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  ** other databas
36a0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
36b0: 28 20 69 44 62 21 3d 31 20 26 26 20 28 70 44 62  ( iDb!=1 && (pDb
36c0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 31 5d 29 21   = &db->aDb[1])!
36d0: 3d 30 20 26 26 20 41 4c 57 41 59 53 28 70 44 62  =0 && ALWAYS(pDb
36e0: 2d 3e 70 53 63 68 65 6d 61 29 20 29 7b 0a 20 20  ->pSchema) ){.  
36f0: 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d      sqlite3Schem
3700: 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68  aClear(pDb->pSch
3710: 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ema);.    }.    
3720: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 2f 2a  return;.  }.  /*
3730: 20 43 61 73 65 20 32 20 28 66 72 6f 6d 20 68 65   Case 2 (from he
3740: 72 65 20 74 6f 20 74 68 65 20 65 6e 64 29 3a 20  re to the end): 
3750: 52 65 73 65 74 20 61 6c 6c 20 73 63 68 65 6d 61  Reset all schema
3760: 73 20 66 6f 72 20 61 6c 6c 20 61 74 74 61 63 68  s for all attach
3770: 65 64 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  ed.  ** database
3780: 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  s. */.  assert( 
3790: 69 44 62 3c 30 20 29 3b 0a 20 20 73 71 6c 69 74  iDb<0 );.  sqlit
37a0: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
37b0: 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  db);.  for(i=0; 
37c0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
37d0: 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
37e0: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
37f0: 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
3800: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
3810: 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62  3SchemaClear(pDb
3820: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
3830: 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67  }.  }.  db->flag
3840: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
3850: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71  ernChanges;.  sq
3860: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c  lite3VtabUnlockL
3870: 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ist(db);.  sqlit
3880: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
3890: 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  db);..  /* If on
38a0: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
38b0: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
38c0: 61 73 65 20 66 69 6c 65 73 20 68 61 73 20 62 65  ase files has be
38d0: 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20  en closed,.  ** 
38e0: 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 6d  then remove them
38f0: 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c 69   from the auxili
3900: 61 72 79 20 64 61 74 61 62 61 73 65 20 6c 69 73  ary database lis
3910: 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65 0a  t.  We take the.
3920: 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79    ** opportunity
3930: 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72 65   to do this here
3940: 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 6a   since we have j
3950: 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c 20  ust deleted all 
3960: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68 65  of the.  ** sche
3970: 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73 20 61  ma hash tables a
3980: 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f 20  nd therefore do 
3990: 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b 65  not have to make
39a0: 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20 2a   any changes.  *
39b0: 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73  * to any of thos
39c0: 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
39d0: 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62   for(i=j=2; i<db
39e0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
39f0: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
3a00: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
3a10: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d     if( pDb->pBt=
3a20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
3a30: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
3a40: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
3a50: 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b   pDb->zName = 0;
3a60: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
3a70: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
3a80: 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  <i ){.      db->
3a90: 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62  aDb[j] = db->aDb
3aa0: 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  [i];.    }.    j
3ab0: 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  ++;.  }.  memset
3ac0: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c  (&db->aDb[j], 0,
3ad0: 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a   (db->nDb-j)*siz
3ae0: 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29  eof(db->aDb[j]))
3af0: 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b  ;.  db->nDb = j;
3b00: 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d  .  if( db->nDb<=
3b10: 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62  2 && db->aDb!=db
3b20: 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20  ->aDbStatic ){. 
3b30: 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44     memcpy(db->aD
3b40: 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62  bStatic, db->aDb
3b50: 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61  , 2*sizeof(db->a
3b60: 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c  Db[0]));.    sql
3b70: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 64  ite3DbFree(db, d
3b80: 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62 2d  b->aDb);.    db-
3b90: 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74  >aDb = db->aDbSt
3ba0: 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  atic;.  }.}../*.
3bb0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3bc0: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
3bd0: 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a   commit occurs..
3be0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
3bf0: 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
3c00: 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
3c10: 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  ){.  db->flags &
3c20: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  = ~SQLITE_Intern
3c30: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
3c40: 2a 20 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79 20  * Delete memory 
3c50: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
3c60: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f  e column names o
3c70: 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
3c80: 77 20 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65 2e  w (the.** Table.
3c90: 61 43 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a 2a  aCol[] array)..*
3ca0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
3cb0: 6c 69 74 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e  liteDeleteColumn
3cc0: 4e 61 6d 65 73 28 73 71 6c 69 74 65 33 20 2a 64  Names(sqlite3 *d
3cd0: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  b, Table *pTable
3ce0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f  ){.  int i;.  Co
3cf0: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73  lumn *pCol;.  as
3d00: 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20  sert( pTable!=0 
3d10: 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d  );.  if( (pCol =
3d20: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d   pTable->aCol)!=
3d30: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
3d40: 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
3d50: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
3d60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
3d70: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e  ree(db, pCol->zN
3d80: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
3d90: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
3da0: 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a  , pCol->pDflt);.
3db0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
3dc0: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44  ree(db, pCol->zD
3dd0: 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  flt);.      sqli
3de0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43  te3DbFree(db, pC
3df0: 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20  ol->zType);.    
3e00: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3e10: 64 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29  db, pCol->zColl)
3e20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
3e30: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
3e40: 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d  able->aCol);.  }
3e50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
3e60: 20 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61   the memory data
3e70: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
3e80: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
3e90: 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20  given.** Table. 
3ea0: 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
3eb0: 6d 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20  made to disk by 
3ec0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
3ed0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3ee0: 20 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68   just deletes th
3ef0: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
3f00: 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75  .  It does not u
3f10: 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62  nlink.** the tab
3f20: 6c 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  le data structur
3f30: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
3f40: 74 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64  table.  But it d
3f50: 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d  oes destroy.** m
3f60: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
3f70: 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20   of the indices 
3f80: 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  and foreign keys
3f90: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3fa0: 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a   .** the table..
3fb0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
3fc0: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
3fd0: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
3fe0: 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20  Table){.  Index 
3ff0: 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b  *pIndex, *pNext;
4000: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 54 61  ..  assert( !pTa
4010: 62 6c 65 20 7c 7c 20 70 54 61 62 6c 65 2d 3e 6e  ble || pTable->n
4020: 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 44  Ref>0 );..  /* D
4030: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
4040: 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65   table until the
4050: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
4060: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a   reaches zero. *
4070: 2f 0a 20 20 69 66 28 20 21 70 54 61 62 6c 65 20  /.  if( !pTable 
4080: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
4090: 28 28 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42  ((!db || db->pnB
40a0: 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26  ytesFreed==0) &&
40b0: 20 28 2d 2d 70 54 61 62 6c 65 2d 3e 6e 52 65 66   (--pTable->nRef
40c0: 29 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  )>0) ) return;..
40d0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20    /* Delete all 
40e0: 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
40f0: 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62  ed with this tab
4100: 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e  le. */.  for(pIn
4110: 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49  dex = pTable->pI
4120: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
4130: 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20  ndex=pNext){.   
4140: 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d   pNext = pIndex-
4150: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65  >pNext;.    asse
4160: 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  rt( pIndex->pSch
4170: 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63  ema==pTable->pSc
4180: 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20  hema );.    if( 
4190: 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74  !db || db->pnByt
41a0: 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20  esFreed==0 ){.  
41b0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
41c0: 3d 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b  = pIndex->zName;
41d0: 20 0a 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59   .      TESTONLY
41e0: 20 28 20 49 6e 64 65 78 20 2a 70 4f 6c 64 20 3d   ( Index *pOld =
41f0: 20 29 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   ) sqlite3HashIn
4200: 73 65 72 74 28 0a 09 20 20 26 70 49 6e 64 65 78  sert(..  &pIndex
4210: 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
4220: 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74  sh, zName, sqlit
4230: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
4240: 29 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  ), 0.      );.  
4250: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 3d 3d      assert( db==
4260: 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 63 68 65  0 || sqlite3Sche
4270: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
4280: 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  0, pIndex->pSche
4290: 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ma) );.      ass
42a0: 65 72 74 28 20 70 4f 6c 64 3d 3d 70 49 6e 64 65  ert( pOld==pInde
42b0: 78 20 7c 7c 20 70 4f 6c 64 3d 3d 30 20 29 3b 0a  x || pOld==0 );.
42c0: 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e      }.    freeIn
42d0: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
42e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
42f0: 65 20 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65  e any foreign ke
4300: 79 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  ys attached to t
4310: 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  his table. */.  
4320: 73 71 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28  sqlite3FkDelete(
4330: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20  db, pTable);..  
4340: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54 61  /* Delete the Ta
4350: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 74  ble structure it
4360: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  self..  */.  sql
4370: 69 74 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e  iteDeleteColumnN
4380: 61 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29  ames(db, pTable)
4390: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
43a0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  e(db, pTable->zN
43b0: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
43c0: 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65  bFree(db, pTable
43d0: 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71  ->zColAff);.  sq
43e0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
43f0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53  e(db, pTable->pS
4400: 65 6c 65 63 74 29 3b 0a 23 69 66 6e 64 65 66 20  elect);.#ifndef 
4410: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
4420: 4b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  K.  sqlite3ExprD
4430: 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65  elete(db, pTable
4440: 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 65 6e 64 69  ->pCheck);.#endi
4450: 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
4460: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
4470: 4c 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  LE.  sqlite3Vtab
4480: 43 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65  Clear(db, pTable
4490: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
44a0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
44b0: 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  able);.}../*.** 
44c0: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
44d0: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
44e0: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
44f0: 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a  the delete the.*
4500: 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  * table structur
4510: 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69  e with all its i
4520: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
4530: 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64  gn keys..*/.void
4540: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
4550: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  dDeleteTable(sql
4560: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
4570: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
4580: 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c  TabName){.  Tabl
4590: 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b  e *p;.  Db *pDb;
45a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
45b0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
45c0: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
45d0: 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
45e0: 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20  ( zTabName );.  
45f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
4600: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
4610: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
4620: 74 65 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61  testcase( zTabNa
4630: 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20  me[0]==0 );  /* 
4640: 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c  Zero-length tabl
4650: 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f  e names are allo
4660: 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26  wed */.  pDb = &
4670: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
4680: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
4690: 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68  nsert(&pDb->pSch
46a0: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54  ema->tblHash, zT
46b0: 61 62 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  abName,.        
46c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46d0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
46e0: 7a 54 61 62 4e 61 6d 65 29 2c 30 29 3b 0a 20 20  zTabName),0);.  
46f0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
4700: 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d  le(db, p);.  db-
4710: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
4720: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
4730: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
4740: 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61   token, return a
4750: 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e   string that con
4760: 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65 78  sists of the tex
4770: 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b  t of that.** tok
4780: 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  en.  Space to ho
4790: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
47a0: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74  string.** is obt
47b0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
47c0: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
47d0: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
47e0: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
47f0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e  nction..**.** An
4800: 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b  y quotation mark
4810: 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20  s (ex:  "name", 
4820: 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20  'name', [name], 
4830: 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74 0a  or `name`) that.
4840: 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65 20  ** surround the 
4850: 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b 65  body of the toke
4860: 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a  n are removed..*
4870: 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20  *.** Tokens are 
4880: 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74  often just point
4890: 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ers into the ori
48a0: 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61  ginal SQL text a
48b0: 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74  nd so.** are not
48c0: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
48d0: 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72   and are not per
48e0: 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65  sistent.  The re
48f0: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a  turned string.**
4900: 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61   is \000 termina
4910: 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73 69  ted and is persi
4920: 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a  stent..*/.char *
4930: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
4940: 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  oken(sqlite3 *db
4950: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
4960: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
4970: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
4980: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
4990: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
49a0: 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c  (char*)pName->z,
49b0: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
49c0: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
49d0: 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Name);.  }else{.
49e0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20      zName = 0;. 
49f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d   }.  return zNam
4a00: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  e;.}../*.** Open
4a10: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
4a20: 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20  er table stored 
4a30: 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62  in database numb
4a40: 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72  er iDb for.** wr
4a50: 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65  iting. The table
4a60: 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67   is opened using
4a70: 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f   cursor 0..*/.vo
4a80: 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61  id sqlite3OpenMa
4a90: 73 74 65 72 54 61 62 6c 65 28 50 61 72 73 65 20  sterTable(Parse 
4aa0: 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  *p, int iDb){.  
4ab0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
4ac0: 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73  3GetVdbe(p);.  s
4ad0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
4ae0: 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52  p, iDb, MASTER_R
4af0: 4f 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54  OOT, 1, SCHEMA_T
4b00: 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 73 71  ABLE(iDb));.  sq
4b10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4b20: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
4b30: 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c   0, MASTER_ROOT,
4b40: 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   iDb);.  sqlite3
4b50: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
4b60: 2d 31 2c 20 28 63 68 61 72 20 2a 29 35 2c 20 50  -1, (char *)5, P
4b70: 34 5f 49 4e 54 33 32 29 3b 20 20 2f 2a 20 35 20  4_INT32);  /* 5 
4b80: 63 6f 6c 75 6d 6e 20 74 61 62 6c 65 20 2a 2f 0a  column table */.
4b90: 20 20 69 66 28 20 70 2d 3e 6e 54 61 62 3d 3d 30    if( p->nTab==0
4ba0: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 54 61 62 20   ){.    p->nTab 
4bb0: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
4bc0: 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d  * Parameter zNam
4bd0: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75  e points to a nu
4be0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 62 75 66  l-terminated buf
4bf0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
4c00: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20  he name.** of a 
4c10: 64 61 74 61 62 61 73 65 20 28 22 6d 61 69 6e 22  database ("main"
4c20: 2c 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20  , "temp" or the 
4c30: 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63  name of an attac
4c40: 68 65 64 20 64 62 29 2e 20 54 68 69 73 0a 2a 2a  hed db). This.**
4c50: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
4c60: 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
4c70: 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73  he named databas
4c80: 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20  e in db->aDb[], 
4c90: 6f 72 0a 2a 2a 20 2d 31 20 69 66 20 74 68 65 20  or.** -1 if the 
4ca0: 6e 61 6d 65 64 20 64 62 20 63 61 6e 6e 6f 74 20  named db cannot 
4cb0: 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74  be found..*/.int
4cc0: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
4cd0: 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  me(sqlite3 *db, 
4ce0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
4cf0: 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31  e){.  int i = -1
4d00: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ;         /* Dat
4d10: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  abase number */.
4d20: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
4d30: 20 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 20 20     Db *pDb;.    
4d40: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
4d50: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
4d60: 20 20 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e      for(i=(db->n
4d70: 44 62 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e  Db-1), pDb=&db->
4d80: 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d  aDb[i]; i>=0; i-
4d90: 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20  -, pDb--){.     
4da0: 20 69 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50   if( (!OMIT_TEMP
4db0: 44 42 20 7c 7c 20 69 21 3d 31 20 29 20 26 26 20  DB || i!=1 ) && 
4dc0: 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  n==sqlite3Strlen
4dd0: 33 30 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26  30(pDb->zName) &
4de0: 26 20 0a 20 20 20 20 20 20 20 20 20 20 30 3d 3d  & .          0==
4df0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
4e00: 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  Db->zName, zName
4e10: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  ) ){.        bre
4e20: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4e30: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  }.  }.  return i
4e40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  ;.}../*.** The t
4e50: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74  oken *pName cont
4e60: 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  ains the name of
4e70: 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69 74   a database (eit
4e80: 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a  her "main" or.**
4e90: 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e   "temp" or the n
4ea0: 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68  ame of an attach
4eb0: 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75  ed db). This rou
4ec0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
4ed0: 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65  .** index of the
4ee0: 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20   named database 
4ef0: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72  in db->aDb[], or
4f00: 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64   -1 if the named
4f10: 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74   db .** does not
4f20: 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73   exist..*/.int s
4f30: 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c  qlite3FindDb(sql
4f40: 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20  ite3 *db, Token 
4f50: 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *pName){.  int i
4f60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f80: 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62  /* Database numb
4f90: 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  er */.  char *zN
4fa0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
4fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4fc0: 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61 72  Name we are sear
4fd0: 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a  ching for */.  z
4fe0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
4ff0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
5000: 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71  pName);.  i = sq
5010: 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
5020: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  db, zName);.  sq
5030: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5040: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
5050: 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61   i;.}../* The ta
5060: 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74  ble or view or t
5070: 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70  rigger name is p
5080: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f  assed to this ro
5090: 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73  utine via tokens
50a0: 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70  .** pName1 and p
50b0: 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61  Name2. If the ta
50c0: 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c  ble name was ful
50d0: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f  ly qualified, fo
50e0: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
50f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
5100: 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20  x.yyy (...);.** 
5110: 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20  .** Then pName1 
5120: 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20  is set to "xxx" 
5130: 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22  and pName2 "yyy"
5140: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
5150: 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61  and if.** the ta
5160: 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  ble name is not 
5170: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
5180: 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45   i.e.:.**.** CRE
5190: 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e  ATE TABLE yyy(..
51a0: 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70  .);.**.** Then p
51b0: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
51c0: 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32  "yyy" and pName2
51d0: 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68   is ""..**.** Th
51e0: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
51f0: 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f  the *ppUnqual po
5200: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  inter to point a
5210: 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61  t the token (pNa
5220: 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32  me1 or.** pName2
5230: 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68  ) that stores th
5240: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61  e unqualified ta
5250: 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69  ble name.  The i
5260: 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64  ndex of the.** d
5270: 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69 73  atabase "xxx" is
5280: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
5290: 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  t sqlite3TwoPart
52a0: 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70  Name(.  Parse *p
52b0: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
52c0: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
52d0: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
52e0: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
52f0: 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54  Name1,      /* T
5300: 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65 20  he "xxx" in the 
5310: 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f  name "xxx.yyy" o
5320: 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b  r "xxx" */.  Tok
5330: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
5340: 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e   /* The "yyy" in
5350: 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79   the name "xxx.y
5360: 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  yy" */.  Token *
5370: 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20  *pUnqual     /* 
5380: 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c  Write the unqual
5390: 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d  ified object nam
53a0: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
53b0: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
53c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
53d0: 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74  tabase holding t
53e0: 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  he object */.  s
53f0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
5400: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
5410: 41 4c 57 41 59 53 28 70 4e 61 6d 65 32 21 3d 30  ALWAYS(pName2!=0
5420: 29 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30  ) && pName2->n>0
5430: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
5440: 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20  init.busy ) {.  
5450: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
5460: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72  Msg(pParse, "cor
5470: 72 75 70 74 20 64 61 74 61 62 61 73 65 22 29 3b  rupt database");
5480: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
5490: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  Err++;.      ret
54a0: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
54b0: 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61    *pUnqual = pNa
54c0: 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  me2;.    iDb = s
54d0: 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c  qlite3FindDb(db,
54e0: 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66   pName1);.    if
54f0: 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20  ( iDb<0 ){.     
5500: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5510: 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
5520: 6e 20 64 61 74 61 62 61 73 65 20 25 54 22 2c 20  n database %T", 
5530: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 70  pName1);.      p
5540: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
5550: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
5560: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
5570: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69     assert( db->i
5580: 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62  nit.iDb==0 || db
5590: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
55a0: 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69     iDb = db->ini
55b0: 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71  t.iDb;.    *pUnq
55c0: 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20  ual = pName1;.  
55d0: 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a  }.  return iDb;.
55e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
55f0: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
5600: 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 55 54   check if the UT
5610: 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65  F-8 string zName
5620: 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75   is a legal.** u
5630: 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
5640: 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61  for a new schema
5650: 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20   object (table, 
5660: 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a  index, view or.*
5670: 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20  * trigger). All 
5680: 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20  names are legal 
5690: 65 78 63 65 70 74 20 74 68 6f 73 65 20 74 68 61  except those tha
56a0: 74 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  t begin with the
56b0: 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69   string.** "sqli
56c0: 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20  te_" (in upper, 
56d0: 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63  lower or mixed c
56e0: 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69  ase). This porti
56f0: 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70  on of the namesp
5700: 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76  ace.** is reserv
5710: 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20  ed for internal 
5720: 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
5730: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
5740: 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  me(Parse *pParse
5750: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
5760: 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61  ame){.  if( !pPa
5770: 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  rse->db->init.bu
5780: 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65  sy && pParse->ne
5790: 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20  sted==0 .       
57a0: 20 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e 64     && (pParse->d
57b0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
57c0: 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d 3d  E_WriteSchema)==
57d0: 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30  0.          && 0
57e0: 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ==sqlite3StrNICm
57f0: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
5800: 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71  _", 7) ){.    sq
5810: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5820: 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61  arse, "object na
5830: 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  me reserved for 
5840: 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73  internal use: %s
5850: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ", zName);.    r
5860: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
5870: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
5880: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
5890: 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74  *.** Begin const
58a0: 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ructing a new ta
58b0: 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
58c0: 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54  on in memory.  T
58d0: 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  his is.** the fi
58e0: 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61  rst of several a
58f0: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74  ction routines t
5900: 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69  hat get called i
5910: 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f  n response.** to
5920: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
5930: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70  statement.  In p
5940: 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20  articular, this 
5950: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
5960: 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e  d.** after seein
5970: 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45  g tokens "CREATE
5980: 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e  " and "TABLE" an
5990: 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  d the table name
59a0: 2e 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20  . The isTemp.** 
59b0: 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  flag is true if 
59c0: 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  the table should
59d0: 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68   be stored in th
59e0: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
59f0: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73  base.** file ins
5a00: 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d  tead of in the m
5a10: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
5a20: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
5a30: 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a  ally the case.**
5a40: 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22   when the "TEMP"
5a50: 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20   or "TEMPORARY" 
5a60: 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69  keyword occurs i
5a70: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45  n between.** CRE
5a80: 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a  ATE and TABLE..*
5a90: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62  *.** The new tab
5aa0: 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69  le record is ini
5ab0: 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74  tialized and put
5ac0: 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77   in pParse->pNew
5ad0: 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72  Table..** As mor
5ae0: 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  e of the CREATE 
5af0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
5b00: 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74  is parsed, addit
5b10: 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20  ional action.** 
5b20: 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65  routines will be
5b30: 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d   called to add m
5b40: 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
5b50: 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a  to this record..
5b60: 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
5b70: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
5b80: 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
5b90: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
5ba0: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  () routine.** is
5bb0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
5bc0: 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63  ete the construc
5bd0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20  tion of the new 
5be0: 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f  table record..*/
5bf0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61  .void sqlite3Sta
5c00: 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  rtTable(.  Parse
5c10: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
5c20: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
5c30: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
5c40: 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72  ,   /* First par
5c50: 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  t of the name of
5c60: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
5c70: 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ew */.  Token *p
5c80: 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f  Name2,   /* Seco
5c90: 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  nd part of the n
5ca0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
5cb0: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e   or view */.  in
5cc0: 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f  t isTemp,      /
5cd0: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
5ce0: 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a  s a TEMP table *
5cf0: 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20  /.  int isView, 
5d00: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5d10: 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a  this is a VIEW *
5d20: 2f 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75 61  /.  int isVirtua
5d30: 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  l,   /* True if 
5d40: 74 68 69 73 20 69 73 20 61 20 56 49 52 54 55 41  this is a VIRTUA
5d50: 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  L table */.  int
5d60: 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a   noErr        /*
5d70: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
5d80: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
5d90: 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  sts */.){.  Tabl
5da0: 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61  e *pTable;.  cha
5db0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a  r *zName = 0; /*
5dc0: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
5dd0: 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20   new table */.  
5de0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
5df0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
5e00: 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20   *v;.  int iDb; 
5e10: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
5e20: 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72  ase number to cr
5e30: 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69  eate the table i
5e40: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
5e50: 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61  ame;    /* Unqua
5e60: 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74  lified name of t
5e70: 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61  he table to crea
5e80: 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  te */..  /* The 
5e90: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
5ea0: 6d 65 20 74 6f 20 63 72 65 61 74 65 20 69 73 20  me to create is 
5eb0: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
5ec0: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e  outine via token
5ed0: 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e  s.  ** pName1 an
5ee0: 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65  d pName2. If the
5ef0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20   table name was 
5f00: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
5f10: 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20   for example:.  
5f20: 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54  **.  ** CREATE T
5f30: 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e  ABLE xxx.yyy (..
5f40: 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54  .);.  ** .  ** T
5f50: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
5f60: 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70  t to "xxx" and p
5f70: 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20  Name2 "yyy". On 
5f80: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69  the other hand i
5f90: 66 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65  f.  ** the table
5fa0: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c   name is not ful
5fb0: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e  ly qualified, i.
5fc0: 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52  e.:.  **.  ** CR
5fd0: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e  EATE TABLE yyy(.
5fe0: 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ..);.  **.  ** T
5ff0: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
6000: 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70  t to "yyy" and p
6010: 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 20 20 2a  Name2 is ""..  *
6020: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20  *.  ** The call 
6030: 62 65 6c 6f 77 20 73 65 74 73 20 74 68 65 20 70  below sets the p
6040: 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  Name pointer to 
6050: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b  point at the tok
6060: 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20  en (pName1 or.  
6070: 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20  ** pName2) that 
6080: 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61  stores the unqua
6090: 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d  lified table nam
60a0: 65 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65 20  e. The variable 
60b0: 69 44 62 20 69 73 0a 20 20 2a 2a 20 73 65 74 20  iDb is.  ** set 
60c0: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
60d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
60e0: 74 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  t the table or v
60f0: 69 65 77 20 69 73 20 74 6f 20 62 65 0a 20 20 2a  iew is to be.  *
6100: 2a 20 63 72 65 61 74 65 64 20 69 6e 2e 0a 20 20  * created in..  
6110: 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  */.  iDb = sqlit
6120: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
6130: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
6140: 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
6150: 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74   if( iDb<0 ) ret
6160: 75 72 6e 3b 0a 20 20 69 66 28 20 21 4f 4d 49 54  urn;.  if( !OMIT
6170: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
6180: 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30  p && pName2->n>0
6190: 20 26 26 20 69 44 62 21 3d 31 20 29 7b 0a 20 20   && iDb!=1 ){.  
61a0: 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67    /* If creating
61b0: 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 74   a temp table, t
61c0: 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20  he name may not 
61d0: 62 65 20 71 75 61 6c 69 66 69 65 64 2e 20 55 6e  be qualified. Un
61e0: 6c 65 73 73 20 0a 20 20 20 20 2a 2a 20 74 68 65  less .    ** the
61f0: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69   database name i
6200: 73 20 22 74 65 6d 70 22 20 61 6e 79 77 61 79 2e  s "temp" anyway.
6210: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
6220: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
6230: 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c   "temporary tabl
6240: 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75  e name must be u
6250: 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20  nqualified");.  
6260: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
6270: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
6280: 20 26 26 20 69 73 54 65 6d 70 20 29 20 69 44 62   && isTemp ) iDb
6290: 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d   = 1;..  pParse-
62a0: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70  >sNameToken = *p
62b0: 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  Name;.  zName = 
62c0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
62d0: 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
62e0: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
62f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
6300: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
6310: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
6320: 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29  e(pParse, zName)
6330: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67   ){.    goto beg
6340: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
6350: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e    }.  if( db->in
6360: 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65  it.iDb==1 ) isTe
6370: 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  mp = 1;.#ifndef 
6380: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
6390: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65  ORIZATION.  asse
63a0: 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31 29  rt( (isTemp & 1)
63b0: 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a  ==isTemp );.  {.
63c0: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
63d0: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
63e0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
63f0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
6400: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
6410: 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
6420: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
6430: 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20  sTemp), 0, zDb) 
6440: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
6450: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6460: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
6470: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
6480: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
6490: 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  && isTemp ){.   
64a0: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
64b0: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
64c0: 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
64d0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
64e0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
64f0: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
6500: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
6510: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
6520: 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  & isTemp ){.    
6530: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
6540: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
6550: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
6560: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
6570: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
6580: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ABLE;.      }.  
6590: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56    }.    if( !isV
65a0: 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74 65  irtual && sqlite
65b0: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
65c0: 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20  e, code, zName, 
65d0: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
65e0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
65f0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
6600: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
6610: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
6620: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65  w table name doe
6630: 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69  s not collide wi
6640: 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  th an existing. 
6650: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
6660: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  le name in the s
6670: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ame database.  I
6680: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
6690: 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74  ssage if.  ** it
66a0: 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70   does. The excep
66b0: 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73  tion is if the s
66c0: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70  tatement being p
66d0: 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64  arsed was passed
66e0: 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69  .  ** to an sqli
66f0: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
6700: 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74  () call. In that
6710: 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63   case only the c
6720: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a  olumn names.  **
6730: 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20   and types will 
6740: 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72  be used, so ther
6750: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
6760: 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61  test for namespa
6770: 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f  ce.  ** collisio
6780: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
6790: 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
67a0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62  ){.    char *zDb
67b0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
67c0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 53  zName;.    if( S
67d0: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
67e0: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
67f0: 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  se) ){.      got
6800: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
6810: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ror;.    }.    p
6820: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46  Table = sqlite3F
6830: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
6840: 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66  me, zDb);.    if
6850: 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ( pTable ){.    
6860: 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a    if( !noErr ){.
6870: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
6880: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6890: 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64  "table %T alread
68a0: 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65  y exists", pName
68b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
68c0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
68d0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
68e0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
68f0: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
6900: 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20  e, zDb)!=0 ){.  
6910: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6920: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65  Msg(pParse, "the
6930: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
6940: 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22   index named %s"
6950: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
6960: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
6970: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
6980: 7d 0a 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71  }..  pTable = sq
6990: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
69a0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
69b0: 6c 65 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62  le));.  if( pTab
69c0: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  le==0 ){.    db-
69d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
69e0: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  1;.    pParse->r
69f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
6a00: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
6a10: 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62  rr++;.    goto b
6a20: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
6a30: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e  ;.  }.  pTable->
6a40: 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
6a50: 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d   pTable->iPKey =
6a60: 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70   -1;.  pTable->p
6a70: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
6a80: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  [iDb].pSchema;. 
6a90: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20   pTable->nRef = 
6aa0: 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f  1;.  pTable->nRo
6ab0: 77 45 73 74 20 3d 20 31 30 30 30 30 30 30 3b 0a  wEst = 1000000;.
6ac0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
6ad0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29  ->pNewTable==0 )
6ae0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  ;.  pParse->pNew
6af0: 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a  Table = pTable;.
6b00: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
6b10: 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74   the magic sqlit
6b20: 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
6b30: 20 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63   used by autoinc
6b40: 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65  rement,.  ** the
6b50: 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74  n record a point
6b60: 65 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  er to this table
6b70: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
6b80: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 0a  abase structure.
6b90: 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53    ** so that INS
6ba0: 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65  ERT can find the
6bb0: 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20   table easily.. 
6bc0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
6bd0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
6be0: 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61  EMENT.  if( !pPa
6bf0: 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 73  rse->nested && s
6c00: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  trcmp(zName, "sq
6c10: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d  lite_sequence")=
6c20: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
6c30: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
6c40: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
6c50: 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 54 61 62  , 0) );.    pTab
6c60: 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65  le->pSchema->pSe
6c70: 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20  qTab = pTable;. 
6c80: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
6c90: 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
6ca0: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77   the code that w
6cb0: 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74  ill insert the t
6cc0: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f  able record into
6cd0: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  .  ** the SQLITE
6ce0: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
6cf0: 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c  Note in particul
6d00: 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20  ar that we must 
6d10: 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e  go ahead.  ** an
6d20: 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72  d allocate the r
6d30: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
6d40: 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
6d50: 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e   now.  Before an
6d60: 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b  y.  ** PRIMARY K
6d70: 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79  EY or UNIQUE key
6d80: 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64  words are parsed
6d90: 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64  .  Those keyword
6da0: 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a  s will cause.  *
6db0: 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20  * indices to be 
6dc0: 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20  created and the 
6dd0: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73  table record mus
6de0: 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68  t come before th
6df0: 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e  e .  ** indices.
6e00: 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63    Hence, the rec
6e10: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
6e20: 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
6e30: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20   allocated.  ** 
6e40: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
6e50: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
6e60: 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65  & (v = sqlite3Ge
6e70: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d  tVdbe(pParse))!=
6e80: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 3b  0 ){.    int j1;
6e90: 0a 20 20 20 20 69 6e 74 20 66 69 6c 65 46 6f 72  .    int fileFor
6ea0: 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  mat;.    int reg
6eb0: 31 2c 20 72 65 67 32 2c 20 72 65 67 33 3b 0a 20  1, reg2, reg3;. 
6ec0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
6ed0: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
6ee0: 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a  arse, 0, iDb);..
6ef0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6f00: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
6f10: 0a 20 20 20 20 69 66 28 20 69 73 56 69 72 74 75  .    if( isVirtu
6f20: 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  al ){.      sqli
6f30: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
6f40: 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20   OP_VBegin);.   
6f50: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
6f60: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f  * If the file fo
6f70: 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e  rmat and encodin
6f80: 67 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  g in the databas
6f90: 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20  e have not been 
6fa0: 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74  set, .    ** set
6fb0: 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a   them now..    *
6fc0: 2f 0a 20 20 20 20 72 65 67 31 20 3d 20 70 50 61  /.    reg1 = pPa
6fd0: 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20  rse->regRowid = 
6fe0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
6ff0: 20 20 20 20 72 65 67 32 20 3d 20 70 50 61 72 73      reg2 = pPars
7000: 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70  e->regRoot = ++p
7010: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
7020: 20 72 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65   reg3 = ++pParse
7030: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
7040: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7050: 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20   OP_ReadCookie, 
7060: 69 44 62 2c 20 72 65 67 33 2c 20 42 54 52 45 45  iDb, reg3, BTREE
7070: 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20  _FILE_FORMAT);. 
7080: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
7090: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
70a0: 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  .    j1 = sqlite
70b0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
70c0: 50 5f 49 66 2c 20 72 65 67 33 29 3b 0a 20 20 20  P_If, reg3);.   
70d0: 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64   fileFormat = (d
70e0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
70f0: 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 29  E_LegacyFileFmt)
7100: 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20  !=0 ?.          
7110: 20 20 20 20 20 20 20 20 31 20 3a 20 53 51 4c 49          1 : SQLI
7120: 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d  TE_MAX_FILE_FORM
7130: 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  AT;.    sqlite3V
7140: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7150: 49 6e 74 65 67 65 72 2c 20 66 69 6c 65 46 6f 72  Integer, fileFor
7160: 6d 61 74 2c 20 72 65 67 33 29 3b 0a 20 20 20 20  mat, reg3);.    
7170: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7180: 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  3(v, OP_SetCooki
7190: 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 46 49  e, iDb, BTREE_FI
71a0: 4c 45 5f 46 4f 52 4d 41 54 2c 20 72 65 67 33 29  LE_FORMAT, reg3)
71b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
71c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
71d0: 74 65 67 65 72 2c 20 45 4e 43 28 64 62 29 2c 20  teger, ENC(db), 
71e0: 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74  reg3);.    sqlit
71f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7200: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
7210: 62 2c 20 42 54 52 45 45 5f 54 45 58 54 5f 45 4e  b, BTREE_TEXT_EN
7220: 43 4f 44 49 4e 47 2c 20 72 65 67 33 29 3b 0a 20  CODING, reg3);. 
7230: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
7240: 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a  mpHere(v, j1);..
7250: 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74      /* This just
7260: 20 63 72 65 61 74 65 73 20 61 20 70 6c 61 63 65   creates a place
7270: 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69  -holder record i
7280: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
7290: 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  ter table..    *
72a0: 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63 72 65  * The record cre
72b0: 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f  ated does not co
72c0: 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79  ntain anything y
72d0: 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  et.  It will be 
72e0: 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20  replaced.    ** 
72f0: 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72  by the real entr
7300: 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61  y in code genera
7310: 74 65 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e  ted at sqlite3En
7320: 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a  dTable()..    **
7330: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69  .    ** The rowi
7340: 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e  d for the new en
7350: 74 72 79 20 69 73 20 6c 65 66 74 20 69 6e 20 72  try is left in r
7360: 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e  egister pParse->
7370: 72 65 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a  regRowid..    **
7380: 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   The root page n
7390: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77  umber of the new
73a0: 20 74 61 62 6c 65 20 69 73 20 6c 65 66 74 20 69   table is left i
73b0: 6e 20 72 65 67 20 70 50 61 72 73 65 2d 3e 72 65  n reg pParse->re
73c0: 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68  gRoot..    ** Th
73d0: 65 20 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74  e rowid and root
73e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 76 61 6c   page number val
73f0: 75 65 73 20 61 72 65 20 6e 65 65 64 65 64 20 62  ues are needed b
7400: 79 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 0a  y the code that.
7410: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e      ** sqlite3En
7420: 64 54 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65  dTable will gene
7430: 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  rate..    */.#if
7440: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7450: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
7460: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
7470: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
7480: 29 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  ).    if( isView
7490: 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b   || isVirtual ){
74a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
74b0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
74c0: 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29  nteger, 0, reg2)
74d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
74e0: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 73  if.    {.      s
74f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7500: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62  (v, OP_CreateTab
7510: 6c 65 2c 20 69 44 62 2c 20 72 65 67 32 29 3b 0a  le, iDb, reg2);.
7520: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7530: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
7540: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
7550: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7560: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
7570: 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20  wid, 0, reg1);. 
7580: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7590: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
75a0: 20 30 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73   0, reg3);.    s
75b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
75c0: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30  (v, OP_Insert, 0
75d0: 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b 0a 20  , reg3, reg1);. 
75e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
75f0: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
7600: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71  _APPEND);.    sq
7610: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
7620: 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20  v, OP_Close);.  
7630: 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28  }..  /* Normal (
7640: 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72  non-error) retur
7650: 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a  n. */.  return;.
7660: 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
7670: 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d  r occurs, we jum
7680: 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f  p here */.begin_
7690: 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73  table_error:.  s
76a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
76b0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
76c0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  n;.}../*.** This
76d0: 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 74   macro is used t
76e0: 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 20 73 74  o compare two st
76f0: 72 69 6e 67 73 20 69 6e 20 61 20 63 61 73 65 2d  rings in a case-
7700: 69 6e 73 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e  insensitive mann
7710: 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69  er..** It is sli
7720: 67 68 74 6c 79 20 66 61 73 74 65 72 20 74 68 61  ghtly faster tha
7730: 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  n calling sqlite
7740: 33 53 74 72 49 43 6d 70 28 29 20 64 69 72 65 63  3StrICmp() direc
7750: 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64  tly, but.** prod
7760: 75 63 65 73 20 6c 61 72 67 65 72 20 63 6f 64 65  uces larger code
7770: 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a  ..**.** WARNING:
7780: 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 6e   This macro is n
7790: 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  ot compatible wi
77a0: 74 68 20 74 68 65 20 73 74 72 63 6d 70 28 29 20  th the strcmp() 
77b0: 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65  family. It.** re
77c0: 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 74 68  turns true if th
77d0: 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 61 72  e two strings ar
77e0: 65 20 65 71 75 61 6c 2c 20 6f 74 68 65 72 77 69  e equal, otherwi
77f0: 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65  se false..*/.#de
7800: 66 69 6e 65 20 53 54 52 49 43 4d 50 28 78 2c 20  fine STRICMP(x, 
7810: 79 29 20 28 5c 0a 73 71 6c 69 74 65 33 55 70 70  y) (\.sqlite3Upp
7820: 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69  erToLower[*(unsi
7830: 67 6e 65 64 20 63 68 61 72 20 2a 29 28 78 29 5d  gned char *)(x)]
7840: 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33 55 70  ==   \.sqlite3Up
7850: 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73  perToLower[*(uns
7860: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 79 29  igned char *)(y)
7870: 5d 20 20 20 20 20 5c 0a 26 26 20 73 71 6c 69 74  ]     \.&& sqlit
7880: 65 33 53 74 72 49 43 6d 70 28 28 78 29 2b 31 2c  e3StrICmp((x)+1,
7890: 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a  (y)+1)==0 )../*.
78a0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c  ** Add a new col
78b0: 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65  umn to the table
78c0: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
78d0: 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a   constructed..**
78e0: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
78f0: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
7900: 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  e once for each 
7910: 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69  column declarati
7920: 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54  on.** in a CREAT
7930: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
7940: 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  t.  sqlite3Start
7950: 54 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c  Table() gets cal
7960: 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20  led.** first to 
7970: 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67  get things going
7980: 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75  .  Then this rou
7990: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
79a0: 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d  or each.** colum
79b0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
79c0: 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73  e3AddColumn(Pars
79d0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
79e0: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c   *pName){.  Tabl
79f0: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
7a00: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75   char *z;.  Colu
7a10: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69  mn *pCol;.  sqli
7a20: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
7a30: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d  ->db;.  if( (p =
7a40: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
7a50: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
7a60: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
7a70: 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e  COLUMN.  if( p->
7a80: 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69  nCol+1>db->aLimi
7a90: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
7aa0: 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71  OLUMN] ){.    sq
7ab0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7ac0: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
7ad0: 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20  columns on %s", 
7ae0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  p->zName);.    r
7af0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
7b00: 66 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e  f.  z = sqlite3N
7b10: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
7b20: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a   pName);.  if( z
7b30: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
7b40: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
7b50: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
7b60: 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e  ( STRICMP(z, p->
7b70: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29  aCol[i].zName) )
7b80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
7b90: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7ba0: 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d  "duplicate colum
7bb0: 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b  n name: %s", z);
7bc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
7bd0: 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20  Free(db, z);.   
7be0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
7bf0: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e  .  }.  if( (p->n
7c00: 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b  Col & 0x7)==0 ){
7c10: 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65  .    Column *aNe
7c20: 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71  w;.    aNew = sq
7c30: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
7c40: 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43  b,p->aCol,(p->nC
7c50: 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e  ol+8)*sizeof(p->
7c60: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69  aCol[0]));.    i
7c70: 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
7c80: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
7c90: 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e(db, z);.      
7ca0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
7cb0: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77    p->aCol = aNew
7cc0: 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26  ;.  }.  pCol = &
7cd0: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d  p->aCol[p->nCol]
7ce0: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c  ;.  memset(pCol,
7cf0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43   0, sizeof(p->aC
7d00: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d  ol[0]));.  pCol-
7d10: 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20  >zName = z;. .  
7d20: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
7d30: 6f 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64  o type specified
7d40: 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74  , columns have t
7d50: 68 65 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e  he default affin
7d60: 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e  ity.  ** 'NONE'.
7d70: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
7d80: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 74  ype specified, t
7d90: 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f  hen sqlite3AddCo
7da0: 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a  lumnType() will.
7db0: 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e    ** be called n
7dc0: 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d  ext to set pCol-
7dd0: 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63  >affinity correc
7de0: 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c  tly..  */.  pCol
7df0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
7e00: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
7e10: 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a  p->nCol++;.}../*
7e20: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7e30: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
7e40: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
7e50: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
7e60: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
7e70: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
7e80: 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c  ent.  A "NOT NUL
7e90: 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  L" constraint ha
7ea0: 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f  s.** been seen o
7eb0: 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69  n a column.  Thi
7ec0: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
7ed0: 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20  he notNull flag 
7ee0: 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  on.** the column
7ef0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
7f00: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
7f10: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
7f20: 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a  dNotNull(Parse *
7f30: 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72  pParse, int onEr
7f40: 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ror){.  Table *p
7f50: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
7f60: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
7f70: 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70   p==0 || NEVER(p
7f80: 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74 75  ->nCol<1) ) retu
7f90: 72 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 70 2d  rn;.  p->aCol[p-
7fa0: 3e 6e 43 6f 6c 2d 31 5d 2e 6e 6f 74 4e 75 6c 6c  >nCol-1].notNull
7fb0: 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a   = (u8)onError;.
7fc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68  }../*.** Scan th
7fd0: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61  e column type na
7fe0: 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68  me zType (length
7ff0: 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74 75   nType) and retu
8000: 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69  rn the.** associ
8010: 61 74 65 64 20 61 66 66 69 6e 69 74 79 20 74 79  ated affinity ty
8020: 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  pe..**.** This r
8030: 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61  outine does a ca
8040: 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73  se-independent s
8050: 65 61 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66  earch of zType f
8060: 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74  or the .** subst
8070: 72 69 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c  rings in the fol
8080: 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66  lowing table. If
8090: 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73   one of the subs
80a0: 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75  trings is.** fou
80b0: 6e 64 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  nd, the correspo
80c0: 6e 64 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69  nding affinity i
80d0: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a  s returned. If z
80e0: 54 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  Type contains.**
80f0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f   more than one o
8100: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73  f the substrings
8110: 2c 20 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64  , entries toward
8120: 20 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20   the top of .** 
8130: 74 68 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70  the table take p
8140: 72 69 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61  riority. For exa
8150: 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69  mple, if zType i
8160: 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a  s 'BLOBINT', .**
8170: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
8180: 47 45 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e  GER is returned.
8190: 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67  .**.** Substring
81a0: 20 20 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a       | Affinity.
81b0: 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
81c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81d0: 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20  ---.** 'INT'    
81e0: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
81f0: 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48  F_INTEGER.** 'CH
8200: 41 52 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  AR'        | SQL
8210: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
8220: 27 43 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20  'CLOB'        | 
8230: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
8240: 2a 2a 20 27 54 45 58 54 27 20 20 20 20 20 20 20  ** 'TEXT'       
8250: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   | SQLITE_AFF_TE
8260: 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20  XT.** 'BLOB'    
8270: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
8280: 5f 4e 4f 4e 45 0a 2a 2a 20 27 52 45 41 4c 27 20  _NONE.** 'REAL' 
8290: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
82a0: 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f  AFF_REAL.** 'FLO
82b0: 41 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  A'        | SQLI
82c0: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27  TE_AFF_REAL.** '
82d0: 44 4f 55 42 27 20 20 20 20 20 20 20 20 7c 20 53  DOUB'        | S
82e0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a  QLITE_AFF_REAL.*
82f0: 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20  *.** If none of 
8300: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69  the substrings i
8310: 6e 20 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c  n the above tabl
8320: 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20  e are found,.** 
8330: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
8340: 49 43 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  IC is returned..
8350: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41  */.char sqlite3A
8360: 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73  ffinityType(cons
8370: 74 20 63 68 61 72 20 2a 7a 49 6e 29 7b 0a 20 20  t char *zIn){.  
8380: 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61  u32 h = 0;.  cha
8390: 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41  r aff = SQLITE_A
83a0: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 0a 20 20 69  FF_NUMERIC;..  i
83b0: 66 28 20 7a 49 6e 20 29 20 77 68 69 6c 65 28 20  f( zIn ) while( 
83c0: 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20  zIn[0] ){.    h 
83d0: 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74  = (h<<8) + sqlit
83e0: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28  e3UpperToLower[(
83f0: 2a 7a 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20  *zIn)&0xff];.   
8400: 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20   zIn++;.    if( 
8410: 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27  h==(('c'<<24)+('
8420: 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29  h'<<16)+('a'<<8)
8430: 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20 20 20  +'r') ){        
8440: 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a       /* CHAR */.
8450: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
8460: 54 45 5f 41 46 46 5f 54 45 58 54 3b 20 0a 20 20  TE_AFF_TEXT; .  
8470: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
8480: 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c  ('c'<<24)+('l'<<
8490: 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27  16)+('o'<<8)+'b'
84a0: 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c  ) ){       /* CL
84b0: 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  OB */.      aff 
84c0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
84d0: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
84e0: 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28   h==(('t'<<24)+(
84f0: 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38  'e'<<16)+('x'<<8
8500: 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20  )+'t') ){       
8510: 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20  /* TEXT */.     
8520: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
8530: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73  F_TEXT;.    }els
8540: 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c  e if( h==(('b'<<
8550: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
8560: 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  o'<<8)+'b')     
8570: 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a       /* BLOB */.
8580: 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d          && (aff=
8590: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
85a0: 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  RIC || aff==SQLI
85b0: 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a  TE_AFF_REAL) ){.
85c0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
85d0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 23 69 66  TE_AFF_NONE;.#if
85e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
85f0: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
8600: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
8610: 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27 65 27  =(('r'<<24)+('e'
8620: 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27  <<16)+('a'<<8)+'
8630: 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l')          /* 
8640: 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20  REAL */.        
8650: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
8660: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
8670: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
8680: 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d  _AFF_REAL;.    }
8690: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 66  else if( h==(('f
86a0: 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29  '<<24)+('l'<<16)
86b0: 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20  +('o'<<8)+'a')  
86c0: 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20          /* FLOA 
86d0: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66  */.        && af
86e0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
86f0: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61  MERIC ){.      a
8700: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
8710: 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  REAL;.    }else 
8720: 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34  if( h==(('d'<<24
8730: 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27  )+('o'<<16)+('u'
8740: 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20  <<8)+'b')       
8750: 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20     /* DOUB */.  
8760: 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51        && aff==SQ
8770: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
8780: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
8790: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b  SQLITE_AFF_REAL;
87a0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
87b0: 65 20 69 66 28 20 28 68 26 30 78 30 30 46 46 46  e if( (h&0x00FFF
87c0: 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29  FFF)==(('i'<<16)
87d0: 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29  +('n'<<8)+'t') )
87e0: 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20  {    /* INT */. 
87f0: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
8800: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20  E_AFF_INTEGER;. 
8810: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8820: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
8830: 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  aff;.}../*.** Th
8840: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
8850: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
8860: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
8870: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
8880: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
8890: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
88a0: 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e  The pFirst token
88b0: 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   is the first.**
88c0: 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65   token in the se
88d0: 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73  quence of tokens
88e0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74   that describe t
88f0: 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a  he type of the.*
8900: 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  * column current
8910: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
8920: 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69  ction.   pLast i
8930: 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e  s the last token
8940: 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65  .** in the seque
8950: 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73 20 69  nce.  Use this i
8960: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f  nformation to co
8970: 6e 73 74 72 75 63 74 20 61 20 73 74 72 69 6e 67  nstruct a string
8980: 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  .** that contain
8990: 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f  s the typename o
89a0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64  f the column and
89b0: 20 73 74 6f 72 65 20 74 68 61 74 20 73 74 72 69   store that stri
89c0: 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a  ng.** in zType..
89d0: 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */ .void sqlite3
89e0: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61  AddColumnType(Pa
89f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
8a00: 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61  en *pType){.  Ta
8a10: 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e  ble *p;.  Column
8a20: 20 2a 70 43 6f 6c 3b 0a 0a 20 20 70 20 3d 20 70   *pCol;..  p = p
8a30: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
8a40: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
8a50: 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29  NEVER(p->nCol<1)
8a60: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f   ) return;.  pCo
8a70: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
8a80: 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 61 73 73 65 72  nCol-1];.  asser
8a90: 74 28 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d  t( pCol->zType==
8aa0: 30 20 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79  0 );.  pCol->zTy
8ab0: 70 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  pe = sqlite3Name
8ac0: 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
8ad0: 2d 3e 64 62 2c 20 70 54 79 70 65 29 3b 0a 20 20  ->db, pType);.  
8ae0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
8af0: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
8b00: 54 79 70 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65  Type(pCol->zType
8b10: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
8b20: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68  expression is th
8b30: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
8b40: 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
8b50: 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75  ently added colu
8b60: 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  mn.** of the tab
8b70: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
8b80: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
8b90: 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76  .**.** Default v
8ba0: 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73  alue expressions
8bb0: 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e   must be constan
8bc0: 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65 78 63  t.  Raise an exc
8bd0: 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a  eption if this.*
8be0: 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73  * is not the cas
8bf0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
8c00: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
8c10: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
8c20: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
8c30: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
8c40: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
8c50: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
8c60: 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66 61  d sqlite3AddDefa
8c70: 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a  ultValue(Parse *
8c80: 70 50 61 72 73 65 2c 20 45 78 70 72 53 70 61 6e  pParse, ExprSpan
8c90: 20 2a 70 53 70 61 6e 29 7b 0a 20 20 54 61 62 6c   *pSpan){.  Tabl
8ca0: 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  e *p;.  Column *
8cb0: 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20  pCol;.  sqlite3 
8cc0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
8cd0: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
8ce0: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
8cf0: 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f   p!=0 ){.    pCo
8d00: 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d  l = &(p->aCol[p-
8d10: 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69  >nCol-1]);.    i
8d20: 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  f( !sqlite3ExprI
8d30: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
8d40: 69 6f 6e 28 70 53 70 61 6e 2d 3e 70 45 78 70 72  ion(pSpan->pExpr
8d50: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
8d60: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8d70: 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75  e, "default valu
8d80: 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d  e of column [%s]
8d90: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74   is not constant
8da0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ",.          pCo
8db0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  l->zName);.    }
8dc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
8dd0: 20 63 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69   copy of pExpr i
8de0: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  s used instead o
8df0: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20  f the original, 
8e00: 61 73 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e  as pExpr contain
8e10: 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e  s.      ** token
8e20: 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
8e30: 76 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e  volatile memory.
8e40: 20 54 68 65 20 27 73 70 61 6e 27 20 6f 66 20 74   The 'span' of t
8e50: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  he expression.  
8e60: 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72      ** is requir
8e70: 65 64 20 62 79 20 70 72 61 67 6d 61 20 74 61 62  ed by pragma tab
8e80: 6c 65 5f 69 6e 66 6f 2e 0a 20 20 20 20 20 20 2a  le_info..      *
8e90: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
8ea0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43  xprDelete(db, pC
8eb0: 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20  ol->pDflt);.    
8ec0: 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20    pCol->pDflt = 
8ed0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
8ee0: 62 2c 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 2c  b, pSpan->pExpr,
8ef0: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
8f00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
8f10: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  bFree(db, pCol->
8f20: 7a 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43  zDflt);.      pC
8f30: 6f 6c 2d 3e 7a 44 66 6c 74 20 3d 20 73 71 6c 69  ol->zDflt = sqli
8f40: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
8f50: 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a   (char*)pSpan->z
8f60: 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20  Start,.         
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f80: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
8f90: 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20  )(pSpan->zEnd - 
8fa0: 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b  pSpan->zStart));
8fb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
8fc0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
8fd0: 62 2c 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 29  b, pSpan->pExpr)
8fe0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67  ;.}../*.** Desig
8ff0: 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59  nate the PRIMARY
9000: 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61 62   KEY for the tab
9010: 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20  le.  pList is a 
9020: 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a  list of names .*
9030: 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61  * of columns tha
9040: 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61  t form the prima
9050: 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73  ry key.  If pLis
9060: 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
9070: 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65  the.** most rece
9080: 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d  ntly added colum
9090: 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  n of the table i
90a0: 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  s the primary ke
90b0: 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65  y..**.** A table
90c0: 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73   can have at mos
90d0: 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  t one primary ke
90e0: 79 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65  y.  If the table
90f0: 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20   already has.** 
9100: 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61  a primary key (a
9110: 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20 73  nd this is the s
9120: 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65  econd primary ke
9130: 79 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  y) then create a
9140: 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n.** error..**.*
9150: 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41 52 59  * If the PRIMARY
9160: 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e   KEY is on a sin
9170: 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65  gle column whose
9180: 20 64 61 74 61 74 79 70 65 20 69 73 20 49 4e 54   datatype is INT
9190: 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65  EGER,.** then we
91a0: 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65   will try to use
91b0: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20   that column as 
91c0: 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20  the rowid.  Set 
91d0: 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a  the Table.iPKey.
91e0: 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ** field of the 
91f0: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
9200: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74  truction to be t
9210: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
9220: 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  ** INTEGER PRIMA
9230: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20  RY KEY column.  
9240: 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73  Table.iPKey is s
9250: 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72  et to -1 if ther
9260: 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47  e is.** no INTEG
9270: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a  ER PRIMARY KEY..
9280: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79  **.** If the key
9290: 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47   is not an INTEG
92a0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
92b0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e  then create a un
92c0: 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f  ique.** index fo
92d0: 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69  r the key.  No i
92e0: 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20  ndex is created 
92f0: 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d  for INTEGER PRIM
9300: 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69  ARY KEYs..*/.voi
9310: 64 20 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d  d sqlite3AddPrim
9320: 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20  aryKey(.  Parse 
9330: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
9340: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
9350: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
9360: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
9370: 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20   field names to 
9380: 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
9390: 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
93a0: 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
93b0: 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73  with a uniquenes
93c0: 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  s conflict */.  
93d0: 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20 20 20  int autoInc,    
93e0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
93f0: 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b   AUTOINCREMENT k
9400: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
9410: 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f  t */.  int sortO
9420: 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51 4c 49  rder     /* SQLI
9430: 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c  TE_SO_ASC or SQL
9440: 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29  ITE_SO_DESC */.)
9450: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
9460: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
9470: 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79  ble;.  char *zTy
9480: 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43  pe = 0;.  int iC
9490: 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66  ol = -1, i;.  if
94a0: 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f  ( pTab==0 || IN_
94b0: 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67  DECLARE_VTAB ) g
94c0: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
94d0: 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62  exit;.  if( pTab
94e0: 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
94f0: 48 61 73 50 72 69 6d 61 72 79 4b 65 79 20 29 7b  HasPrimaryKey ){
9500: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
9510: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
9520: 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c      "table \"%s\
9530: 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20  " has more than 
9540: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22  one primary key"
9550: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
9560: 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79      goto primary
9570: 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20  _key_exit;.  }. 
9580: 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
9590: 7c 3d 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79  |= TF_HasPrimary
95a0: 4b 65 79 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  Key;.  if( pList
95b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20  ==0 ){.    iCol 
95c0: 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31  = pTab->nCol - 1
95d0: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c  ;.    pTab->aCol
95e0: 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79  [iCol].isPrimKey
95f0: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
9600: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
9610: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
9620: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c  {.      for(iCol
9630: 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  =0; iCol<pTab->n
9640: 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  Col; iCol++){.  
9650: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9660: 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  3StrICmp(pList->
9670: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62  a[i].zName, pTab
9680: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
9690: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
96a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
96b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
96c0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54 61 62     if( iCol<pTab
96d0: 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
96e0: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f    pTab->aCol[iCo
96f0: 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31  l].isPrimKey = 1
9700: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9710: 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e      if( pList->n
9720: 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d 20  Expr>1 ) iCol = 
9730: 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43  -1;.  }.  if( iC
9740: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
9750: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
9760: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
9770: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
9780: 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70 65 20    }.  if( zType 
9790: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
97a0: 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45  p(zType, "INTEGE
97b0: 52 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26  R")==0.        &
97c0: 26 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c  & sortOrder==SQL
97d0: 49 54 45 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20  ITE_SO_ASC ){.  
97e0: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
97f0: 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e  iCol;.    pTab->
9800: 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38 29 6f 6e  keyConf = (u8)on
9810: 45 72 72 6f 72 3b 0a 20 20 20 20 61 73 73 65 72  Error;.    asser
9820: 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c  t( autoInc==0 ||
9830: 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20   autoInc==1 );. 
9840: 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
9850: 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f  s |= autoInc*TF_
9860: 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20  Autoincrement;. 
9870: 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49   }else if( autoI
9880: 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  nc ){.#ifndef SQ
9890: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
98a0: 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69  CREMENT.    sqli
98b0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
98c0: 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45  se, "AUTOINCREME
98d0: 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77  NT is only allow
98e0: 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20  ed on an ".     
98f0: 20 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41    "INTEGER PRIMA
9900: 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66  RY KEY");.#endif
9910: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e  .  }else{.    In
9920: 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20  dex *p;.    p = 
9930: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
9940: 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  ex(pParse, 0, 0,
9950: 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72   0, pList, onErr
9960: 6f 72 2c 20 30 2c 20 30 2c 20 73 6f 72 74 4f 72  or, 0, 0, sortOr
9970: 64 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  der, 0);.    if(
9980: 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61   p ){.      p->a
9990: 75 74 6f 49 6e 64 65 78 20 3d 20 32 3b 0a 20 20  utoIndex = 2;.  
99a0: 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20    }.    pList = 
99b0: 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f  0;.  }..primary_
99c0: 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  key_exit:.  sqli
99d0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
99e0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  e(pParse->db, pL
99f0: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ist);.  return;.
9a00: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
9a10: 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ew CHECK constra
9a20: 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65  int to the table
9a30: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
9a40: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
9a50: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
9a60: 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74  dCheckConstraint
9a70: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
9a80: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
9a90: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
9aa0: 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20  pr *pCheckExpr  
9ab0: 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78 70  /* The check exp
9ac0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  ression */.){.  
9ad0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
9ae0: 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65  arse->db;.#ifnde
9af0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
9b00: 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  ECK.  Table *pTa
9b10: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
9b20: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 54 61  Table;.  if( pTa
9b30: 62 20 26 26 20 21 49 4e 5f 44 45 43 4c 41 52 45  b && !IN_DECLARE
9b40: 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 70 54 61  _VTAB ){.    pTa
9b50: 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69  b->pCheck = sqli
9b60: 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
9b70: 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68  Tab->pCheck, pCh
9b80: 65 63 6b 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73  eckExpr);.  }els
9b90: 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  e.#endif.  {.   
9ba0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
9bb0: 74 65 28 64 62 2c 20 70 43 68 65 63 6b 45 78 70  te(db, pCheckExp
9bc0: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
9bd0: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
9be0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74  on function of t
9bf0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
9c00: 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f   parsed table co
9c10: 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43  lumn.** to the C
9c20: 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f  ollSeq given..*/
9c30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
9c40: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
9c50: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
9c60: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62   *pToken){.  Tab
9c70: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
9c80: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20    char *zColl;  
9c90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
9ca0: 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20  equoted name of 
9cb0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
9cc0: 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ce */.  sqlite3 
9cd0: 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d  *db;..  if( (p =
9ce0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
9cf0: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
9d00: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
9d10: 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
9d20: 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73  >db;.  zColl = s
9d30: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
9d40: 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b  ken(db, pToken);
9d50: 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20  .  if( !zColl ) 
9d60: 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73  return;..  if( s
9d70: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
9d80: 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
9d90: 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  l) ){.    Index 
9da0: 2a 70 49 64 78 3b 0a 20 20 20 20 70 2d 3e 61 43  *pIdx;.    p->aC
9db0: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43  ol[i].zColl = zC
9dc0: 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49  oll;.  .    /* I
9dd0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  f the column is 
9de0: 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61  declared as "<na
9df0: 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20  me> PRIMARY KEY 
9e00: 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c  COLLATE <type>",
9e10: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20  .    ** then an 
9e20: 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65 20 62  index may have b
9e30: 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74  een created on t
9e40: 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72  his column befor
9e50: 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c  e the.    ** col
9e60: 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20  lation type was 
9e70: 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74  added. Correct t
9e80: 68 69 73 20 69 66 20 69 74 20 69 73 20 74 68 65  his if it is the
9e90: 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
9ea0: 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49    for(pIdx=p->pI
9eb0: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
9ec0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
9ed0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
9ee0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  x->nColumn==1 );
9ef0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
9f00: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20  >aiColumn[0]==i 
9f10: 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  ){.        pIdx-
9f20: 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e  >azColl[0] = p->
9f30: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20  aCol[i].zColl;. 
9f40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9f50: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
9f60: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c  3DbFree(db, zCol
9f70: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
9f80: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
9f90: 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61  eturns the colla
9fa0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
9fb0: 72 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  r database nativ
9fc0: 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69  e text.** encodi
9fd0: 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ng identified by
9fe0: 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d   the string zNam
9ff0: 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e  e, length nName.
a000: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
a010: 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
a020: 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f  n sequence is no
a030: 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20  t available, or 
a040: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a  not available.**
a050: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
a060: 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67   native encoding
a070: 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  , the collation 
a080: 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b  factory is invok
a090: 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74  ed to.** request
a0a0: 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c   it. If the coll
a0b0: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f  ation factory do
a0c0: 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75  es not supply su
a0d0: 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a  ch a sequence,.*
a0e0: 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e  * and the sequen
a0f0: 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ce is available 
a100: 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20  in another text 
a110: 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74  encoding, then t
a120: 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  hat is.** return
a130: 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
a140: 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73  * If no versions
a150: 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65   of the requeste
a160: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71  d collations seq
a170: 75 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61  uence are availa
a180: 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68  ble, or.** anoth
a190: 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  er error occurs,
a1a0: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
a1b0: 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d  d and an error m
a1c0: 65 73 73 61 67 65 20 77 72 69 74 74 65 6e 20 69  essage written i
a1d0: 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a  nto.** pParse..*
a1e0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a1f0: 65 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  e is a wrapper a
a200: 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e  round sqlite3Fin
a210: 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69  dCollSeq().  Thi
a220: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76  s routine.** inv
a230: 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  okes the collati
a240: 6f 6e 20 66 61 63 74 6f 72 79 20 69 66 20 74 68  on factory if th
a250: 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f  e named collatio
a260: 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  n cannot be foun
a270: 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  d.** and generat
a280: 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  es an error mess
a290: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  age..**.** See a
a2a0: 6c 73 6f 3a 20 73 71 6c 69 74 65 33 46 69 6e 64  lso: sqlite3Find
a2b0: 43 6f 6c 6c 53 65 71 28 29 2c 20 73 71 6c 69 74  CollSeq(), sqlit
a2c0: 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a  e3GetCollSeq().*
a2d0: 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  /.CollSeq *sqlit
a2e0: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
a2f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
a300: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
a310: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
a320: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
a330: 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62   u8 enc = ENC(db
a340: 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79  );.  u8 initbusy
a350: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79   = db->init.busy
a360: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
a370: 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73  ll;..  pColl = s
a380: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
a390: 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65  q(db, enc, zName
a3a0: 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69  , initbusy);.  i
a3b0: 66 28 20 21 69 6e 69 74 62 75 73 79 20 26 26 20  f( !initbusy && 
a3c0: 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c  (!pColl || !pCol
a3d0: 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20  l->xCmp) ){.    
a3e0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47  pColl = sqlite3G
a3f0: 65 74 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e  etCollSeq(db, en
a400: 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29  c, pColl, zName)
a410: 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c  ;.    if( !pColl
a420: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a430: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a440: 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61  , "no such colla
a450: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 25  tion sequence: %
a460: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
a470: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
a480: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pColl;.}.../*.**
a490: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
a4a0: 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65  hat will increme
a4b0: 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  nt the schema co
a4c0: 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  okie..**.** The 
a4d0: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73  schema cookie is
a4e0: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
a4f0: 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  ne when the sche
a500: 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61  ma for the.** da
a510: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
a520: 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65   After each sche
a530: 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63  ma change, the c
a540: 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63  ookie value.** c
a550: 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20  hanges.  When a 
a560: 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65  process first re
a570: 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69  ads the schema i
a580: 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a  t records the.**
a590: 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61   cookie.  Therea
a5a0: 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69  fter, whenever i
a5b0: 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73  t goes to access
a5c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a   the database,.*
a5d0: 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20  * it checks the 
a5e0: 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73  cookie to make s
a5f0: 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68  ure the schema h
a600: 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a  as not changed.*
a610: 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c  * since it was l
a620: 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  ast read..**.** 
a630: 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74  This plan is not
a640: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c   completely bull
a650: 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73  et-proof.  It is
a660: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a   possible for.**
a670: 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63   the schema to c
a680: 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74  hange multiple t
a690: 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65  imes and for the
a6a0: 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a   cookie to be.**
a6b0: 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69   set back to pri
a6c0: 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73  or value.  But s
a6d0: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72  chema changes ar
a6e0: 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20  e infrequent.** 
a6f0: 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c  and the probabil
a700: 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74  ity of hitting t
a710: 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76  he same cookie v
a720: 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  alue is only.** 
a730: 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32  1 chance in 2^32
a740: 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65  .  So we're safe
a750: 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64   enough..*/.void
a760: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
a770: 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50 61 72  okie(Parse *pPar
a780: 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
a790: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
a7a0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
a7b0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e);.  sqlite3 *d
a7c0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
a7d0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
a7e0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
a7f0: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
a800: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
a810: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 73 71 6c  iDb, 0) );.  sql
a820: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a830: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62  , OP_Integer, db
a840: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
a850: 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  ma->schema_cooki
a860: 65 2b 31 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69  e+1, r1);.  sqli
a870: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
a880: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
a890: 44 62 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41  Db, BTREE_SCHEMA
a8a0: 5f 56 45 52 53 49 4f 4e 2c 20 72 31 29 3b 0a 20  _VERSION, r1);. 
a8b0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
a8c0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
a8d0: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61  1);.}../*.** Mea
a8e0: 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20  sure the number 
a8f0: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65  of characters ne
a900: 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74  eded to output t
a910: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e  he given.** iden
a920: 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d  tifier.  The num
a930: 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63  ber returned inc
a940: 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73  ludes any quotes
a950: 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65   used.** but doe
a960: 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68  s not include th
a970: 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f  e null terminato
a980: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74  r..**.** The est
a990: 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76  imate is conserv
a9a0: 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74  ative.  It might
a9b0: 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 74 20   be larger that 
a9c0: 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c  what is.** reall
a9d0: 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  y needed..*/.sta
a9e0: 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e  tic int identLen
a9f0: 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  gth(const char *
aa00: 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66  z){.  int n;.  f
aa10: 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c  or(n=0; *z; n++,
aa20: 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a   z++){.    if( *
aa30: 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d  z=='"' ){ n++; }
aa40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20  .  }.  return n 
aa50: 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  + 2;.}../*.** Th
aa60: 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65  e first paramete
aa70: 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
aa80: 6f 20 61 6e 20 6f 75 74 70 75 74 20 62 75 66 66  o an output buff
aa90: 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 0a  er. The second .
aaa0: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
aab0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
aac0: 69 6e 74 65 67 65 72 20 74 68 61 74 20 63 6f 6e  integer that con
aad0: 74 61 69 6e 73 20 74 68 65 20 6f 66 66 73 65 74  tains the offset
aae0: 20 61 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20   at.** which to 
aaf0: 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6f  write into the o
ab00: 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68  utput buffer. Th
ab10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69  is function copi
ab20: 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65  es the.** nul-te
ab30: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
ab40: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68  pointed to by th
ab50: 65 20 74 68 69 72 64 20 70 61 72 61 6d 65 74 65  e third paramete
ab60: 72 2c 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c  r, zSignedIdent,
ab70: 0a 2a 2a 20 74 6f 20 74 68 65 20 73 70 65 63 69  .** to the speci
ab80: 66 69 65 64 20 6f 66 66 73 65 74 20 69 6e 20 74  fied offset in t
ab90: 68 65 20 62 75 66 66 65 72 20 61 6e 64 20 75 70  he buffer and up
aba0: 64 61 74 65 73 20 2a 70 49 64 78 20 74 6f 20 72  dates *pIdx to r
abb0: 65 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66  efer.** to the f
abc0: 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20  irst byte after 
abd0: 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 77 72  the last byte wr
abe0: 69 74 74 65 6e 20 62 65 66 6f 72 65 20 72 65 74  itten before ret
abf0: 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49  urning..** .** I
ac00: 66 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53 69  f the string zSi
ac10: 67 6e 65 64 49 64 65 6e 74 20 63 6f 6e 73 69 73  gnedIdent consis
ac20: 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 61  ts entirely of a
ac30: 6c 70 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20  lpha-numeric.** 
ac40: 63 68 61 72 61 63 74 65 72 73 2c 20 64 6f 65 73  characters, does
ac50: 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20   not begin with 
ac60: 61 20 64 69 67 69 74 20 61 6e 64 20 69 73 20 6e  a digit and is n
ac70: 6f 74 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72  ot an SQL keywor
ac80: 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73  d,.** then it is
ac90: 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 6f   copied to the o
aca0: 75 74 70 75 74 20 62 75 66 66 65 72 20 65 78 61  utput buffer exa
acb0: 63 74 6c 79 20 61 73 20 69 74 20 69 73 2e 20 4f  ctly as it is. O
acc0: 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20  therwise,.** it 
acd0: 69 73 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20  is quoted using 
ace0: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a  double-quotes..*
acf0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64  /.static void id
ad00: 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20  entPut(char *z, 
ad10: 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20  int *pIdx, char 
ad20: 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a  *zSignedIdent){.
ad30: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
ad40: 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67  *zIdent = (unsig
ad50: 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65  ned char*)zSigne
ad60: 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c  dIdent;.  int i,
ad70: 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20   j, needQuote;. 
ad80: 20 69 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66   i = *pIdx;..  f
ad90: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
ada0: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; j++){.    if(
adb0: 20 21 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d   !sqlite3Isalnum
adc0: 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a  (zIdent[j]) && z
add0: 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20  Ident[j]!='_' ) 
ade0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65  break;.  }.  nee
adf0: 64 51 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33  dQuote = sqlite3
ae00: 49 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30  Isdigit(zIdent[0
ae10: 5d 29 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79  ]) || sqlite3Key
ae20: 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c  wordCode(zIdent,
ae30: 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66   j)!=TK_ID;.  if
ae40: 28 20 21 6e 65 65 64 51 75 6f 74 65 20 29 7b 0a  ( !needQuote ){.
ae50: 20 20 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20      needQuote = 
ae60: 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 7d 0a 0a  zIdent[j];.  }..
ae70: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
ae80: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
ae90: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
aea0: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
aeb0: 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b  z[i++] = zIdent[
aec0: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65  j];.    if( zIde
aed0: 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69  nt[j]=='"' ) z[i
aee0: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20  ++] = '"';.  }. 
aef0: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
af00: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
af10: 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49   z[i] = 0;.  *pI
af20: 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dx = i;.}../*.**
af30: 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41   Generate a CREA
af40: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
af50: 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  nt appropriate f
af60: 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
af70: 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74  table.  Memory t
af80: 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20  o hold the text 
af90: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
afa0: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
afb0: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
afc0: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
afd0: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
afe0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
aff0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63  /.static char *c
b000: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73  reateTableStmt(s
b010: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c  qlite3 *db, Tabl
b020: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20  e *p){.  int i, 
b030: 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53  k, n;.  char *zS
b040: 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65  tmt;.  char *zSe
b050: 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64  p, *zSep2, *zEnd
b060: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
b070: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72  ;.  n = 0;.  for
b080: 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c  (pCol = p->aCol,
b090: 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b   i=0; i<p->nCol;
b0a0: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
b0b0: 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e     n += identLen
b0c0: 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  gth(pCol->zName)
b0d0: 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d   + 5;.  }.  n +=
b0e0: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e   identLength(p->
b0f0: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c  zName);.  if( n<
b100: 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65 70 20  50 ){ .    zSep 
b110: 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  = "";.    zSep2 
b120: 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20  = ",";.    zEnd 
b130: 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = ")";.  }else{.
b140: 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20      zSep = "\n  
b150: 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22  ";.    zSep2 = "
b160: 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64  ,\n  ";.    zEnd
b170: 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20   = "\n)";.  }.  
b180: 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e  n += 35 + 6*p->n
b190: 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73  Col;.  zStmt = s
b1a0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
b1b0: 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a  w(0, n);.  if( z
b1c0: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64  Stmt==0 ){.    d
b1d0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
b1e0: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
b1f0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
b200: 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74  _snprintf(n, zSt
b210: 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c  mt, "CREATE TABL
b220: 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69  E ");.  k = sqli
b230: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d  te3Strlen30(zStm
b240: 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a  t);.  identPut(z
b250: 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61  Stmt, &k, p->zNa
b260: 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b  me);.  zStmt[k++
b270: 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70  ] = '(';.  for(p
b280: 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30  Col=p->aCol, i=0
b290: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
b2a0: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73  , pCol++){.    s
b2b0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
b2c0: 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b   * const azType[
b2d0: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ] = {.        /*
b2e0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
b2f0: 20 20 20 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a      */ " TEXT",.
b300: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
b310: 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20 2a 2f  E_AFF_NONE    */
b320: 20 22 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20   "",.        /* 
b330: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
b340: 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20  IC */ " NUM",.  
b350: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
b360: 41 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22  AFF_INTEGER */ "
b370: 20 49 4e 54 22 2c 0a 20 20 20 20 20 20 20 20 2f   INT",.        /
b380: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  * SQLITE_AFF_REA
b390: 4c 20 20 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a  L    */ " REAL".
b3a0: 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c      };.    int l
b3b0: 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  en;.    const ch
b3c0: 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20  ar *zType;..    
b3d0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
b3e0: 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c  (n-k, &zStmt[k],
b3f0: 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d   zSep);.    k +=
b400: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
b410: 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20  (&zStmt[k]);.   
b420: 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20   zSep = zSep2;. 
b430: 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d     identPut(zStm
b440: 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  t, &k, pCol->zNa
b450: 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  me);.    assert(
b460: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d   pCol->affinity-
b470: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
b480: 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65  >= 0 );.    asse
b490: 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  rt( pCol->affini
b4a0: 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  ty-SQLITE_AFF_TE
b4b0: 58 54 20 3c 20 73 69 7a 65 6f 66 28 61 7a 54 79  XT < sizeof(azTy
b4c0: 70 65 29 2f 73 69 7a 65 6f 66 28 61 7a 54 79 70  pe)/sizeof(azTyp
b4d0: 65 5b 30 5d 29 20 29 3b 0a 20 20 20 20 74 65 73  e[0]) );.    tes
b4e0: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
b4f0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
b500: 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 74 65  F_TEXT );.    te
b510: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
b520: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
b530: 46 46 5f 4e 4f 4e 45 20 29 3b 0a 20 20 20 20 74  FF_NONE );.    t
b540: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
b550: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
b560: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20  AFF_NUMERIC );. 
b570: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f     testcase( pCo
b580: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
b590: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
b5a0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
b5b0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
b5c0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
b5d0: 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79   );.    .    zTy
b5e0: 70 65 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c  pe = azType[pCol
b5f0: 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c  ->affinity - SQL
b600: 49 54 45 5f 41 46 46 5f 54 45 58 54 5d 3b 0a 20  ITE_AFF_TEXT];. 
b610: 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33     len = sqlite3
b620: 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b  Strlen30(zType);
b630: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f  .    assert( pCo
b640: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
b650: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 0a 20 20  ITE_AFF_NONE .  
b660: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f            || pCo
b670: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c  l->affinity==sql
b680: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
b690: 28 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20 6d  (zType) );.    m
b6a0: 65 6d 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c  emcpy(&zStmt[k],
b6b0: 20 7a 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20 20   zType, len);.  
b6c0: 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20    k += len;.    
b6d0: 61 73 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a  assert( k<=n );.
b6e0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e    }.  sqlite3_sn
b6f0: 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74  printf(n-k, &zSt
b700: 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e  mt[k], "%s", zEn
b710: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74  d);.  return zSt
b720: 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  mt;.}../*.** Thi
b730: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
b740: 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  led to report th
b750: 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74  e final ")" that
b760: 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61   terminates.** a
b770: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
b780: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
b790: 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  he table structu
b7a0: 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63  re that other ac
b7b0: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61  tion routines ha
b7c0: 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67  ve been building
b7d0: 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20  .** is added to 
b7e0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  the internal has
b7f0: 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69  h tables, assumi
b800: 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76  ng no errors hav
b810: 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a  e.** occurred..*
b820: 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f  *.** An entry fo
b830: 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d  r the table is m
b840: 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65  ade in the maste
b850: 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c  r table on disk,
b860: 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20   unless.** this 
b870: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  is a temporary t
b880: 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74  able or db->init
b890: 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20  .busy==1.  When 
b8a0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
b8b0: 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20  .** it means we 
b8c0: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
b8d0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
b8e0: 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a  ble because we j
b8f0: 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64  ust.** connected
b900: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
b910: 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20   or because the 
b920: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
b930: 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e  ble has.** recen
b940: 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20  tly changed, so 
b950: 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
b960: 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  is table already
b970: 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68   exists in.** th
b980: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
b990: 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f  table.  We do no
b9a0: 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65  t want to create
b9b0: 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a   it again..**.**
b9c0: 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20   If the pSelect 
b9d0: 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
b9e0: 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74  NULL, it means t
b9f0: 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hat this routine
ba00: 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74  .** was called t
ba10: 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65  o create a table
ba20: 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
ba30: 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41  a .** "CREATE TA
ba40: 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43  BLE ... AS SELEC
ba50: 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74  T ..." statement
ba60: 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  .  The column na
ba70: 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  mes of.** the ne
ba80: 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74  w table will mat
ba90: 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ch the result se
baa0: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  t of the SELECT.
bab0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
bac0: 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73  EndTable(.  Pars
bad0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
bae0: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
baf0: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
bb00: 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20  *pCons,         
bb10: 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b    /* The ',' tok
bb20: 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  en after the las
bb30: 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a  t column defn. *
bb40: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c  /.  Token *pEnd,
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
bb60: 68 65 20 66 69 6e 61 6c 20 27 29 27 20 74 6f 6b  he final ')' tok
bb70: 65 6e 20 69 6e 20 74 68 65 20 43 52 45 41 54 45  en in the CREATE
bb80: 20 54 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c 65   TABLE */.  Sele
bb90: 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20  ct *pSelect     
bba0: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72      /* Select fr
bbb0: 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e  om a "CREATE ...
bbc0: 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29   AS SELECT" */.)
bbd0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
bbe0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
bbf0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
bc00: 69 44 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e  iDb;..  if( (pEn
bc10: 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d  d==0 && pSelect=
bc20: 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  =0) || db->mallo
bc30: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
bc40: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 20 3d  eturn;.  }.  p =
bc50: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
bc60: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  le;.  if( p==0 )
bc70: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
bc80: 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  rt( !db->init.bu
bc90: 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29  sy || !pSelect )
bca0: 3b 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  ;..  iDb = sqlit
bcb0: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
bcc0: 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b  db, p->pSchema);
bcd0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
bce0: 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a  _OMIT_CHECK.  /*
bcf0: 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69   Resolve names i
bd00: 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73  n all CHECK cons
bd10: 74 72 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f  traint expressio
bd20: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ns..  */.  if( p
bd30: 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20  ->pCheck ){.    
bd40: 53 72 63 4c 69 73 74 20 73 53 72 63 3b 20 20 20  SrcList sSrc;   
bd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd60: 2f 2a 20 46 61 6b 65 20 53 72 63 4c 69 73 74 20  /* Fake SrcList 
bd70: 66 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  for pParse->pNew
bd80: 54 61 62 6c 65 20 2a 2f 0a 20 20 20 20 4e 61 6d  Table */.    Nam
bd90: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20  eContext sNC;   
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bdb0: 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
bdc0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
bdd0: 6c 65 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73 65  le */..    memse
bde0: 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
bdf0: 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 6d 65 6d  f(sNC));.    mem
be00: 73 65 74 28 26 73 53 72 63 2c 20 30 2c 20 73 69  set(&sSrc, 0, si
be10: 7a 65 6f 66 28 73 53 72 63 29 29 3b 0a 20 20 20  zeof(sSrc));.   
be20: 20 73 53 72 63 2e 6e 53 72 63 20 3d 20 31 3b 0a   sSrc.nSrc = 1;.
be30: 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 7a 4e      sSrc.a[0].zN
be40: 61 6d 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a  ame = p->zName;.
be50: 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 70 54      sSrc.a[0].pT
be60: 61 62 20 3d 20 70 3b 0a 20 20 20 20 73 53 72 63  ab = p;.    sSrc
be70: 2e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20  .a[0].iCursor = 
be80: 2d 31 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72  -1;.    sNC.pPar
be90: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
bea0: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
beb0: 26 73 53 72 63 3b 0a 20 20 20 20 73 4e 43 2e 69  &sSrc;.    sNC.i
bec0: 73 43 68 65 63 6b 20 3d 20 31 3b 0a 20 20 20 20  sCheck = 1;.    
bed0: 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  if( sqlite3Resol
bee0: 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43  veExprNames(&sNC
bef0: 2c 20 70 2d 3e 70 43 68 65 63 6b 29 20 29 7b 0a  , p->pCheck) ){.
bf00: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
bf10: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
bf20: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
bf30: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f  E_OMIT_CHECK) */
bf40: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  ..  /* If the db
bf50: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31  ->init.busy is 1
bf60: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
bf70: 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c   reading the SQL
bf80: 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73   off the.  ** "s
bf90: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72  qlite_master" or
bfa0: 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61   "sqlite_temp_ma
bfb0: 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74  ster" table on t
bfc0: 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f  he disk..  ** So
bfd0: 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f   do not write to
bfe0: 20 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e   the disk again.
bff0: 20 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f    Extract the ro
c000: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  ot page number. 
c010: 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c   ** for the tabl
c020: 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69  e from the db->i
c030: 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c  nit.newTnum fiel
c040: 64 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e 75  d.  (The page nu
c050: 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  mber.  ** should
c060: 20 68 61 76 65 20 62 65 65 6e 20 70 75 74 20 74   have been put t
c070: 68 65 72 65 20 62 79 20 74 68 65 20 73 71 6c 69  here by the sqli
c080: 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65  teOpenCb routine
c090: 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  .).  */.  if( db
c0a0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
c0b0: 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d     p->tnum = db-
c0c0: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
c0d0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20   }..  /* If not 
c0e0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68  initializing, th
c0f0: 65 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f  en create a reco
c100: 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  rd for the new t
c110: 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65  able.  ** in the
c120: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
c130: 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61  able of the data
c140: 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  base..  **.  ** 
c150: 49 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  If this is a TEM
c160: 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72  PORARY table, wr
c170: 69 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e  ite the entry in
c180: 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  to the auxiliary
c190: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65  .  ** file inste
c1a0: 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d  ad of into the m
c1b0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
c1c0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64  e..  */.  if( !d
c1d0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
c1e0: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56      int n;.    V
c1f0: 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72  dbe *v;.    char
c200: 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22   *zType;    /* "
c210: 76 69 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22  view" or "table"
c220: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54   */.    char *zT
c230: 79 70 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57  ype2;   /* "VIEW
c240: 22 20 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a  " or "TABLE" */.
c250: 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b      char *zStmt;
c260: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74      /* Text of t
c270: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
c280: 6f 72 20 43 52 45 41 54 45 20 56 49 45 57 20 73  or CREATE VIEW s
c290: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20  tatement */..   
c2a0: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
c2b0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
c2c0: 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
c2d0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20   ) return;..    
c2e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c2f0: 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  1(v, OP_Close, 0
c300: 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20  );..    /* .    
c310: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54  ** Initialize zT
c320: 79 70 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ype for the new 
c330: 76 69 65 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20  view or table.. 
c340: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
c350: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
c360: 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61       /* A regula
c370: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  r table */.     
c380: 20 7a 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22   zType = "table"
c390: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d  ;.      zType2 =
c3a0: 20 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65   "TABLE";.#ifnde
c3b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
c3c0: 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  EW.    }else{.  
c3d0: 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f      /* A view */
c3e0: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
c3f0: 76 69 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79  view";.      zTy
c400: 70 65 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65  pe2 = "VIEW";.#e
c410: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
c420: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
c430: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 20  CREATE TABLE xx 
c440: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65  AS SELECT ..., e
c450: 78 65 63 75 74 65 20 74 68 65 20 53 45 4c 45 43  xecute the SELEC
c460: 54 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65  T.    ** stateme
c470: 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  nt to populate t
c480: 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68  he new table. Th
c490: 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  e root-page numb
c4a0: 65 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a  er for the.    *
c4b0: 2a 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 69  * new table is i
c4c0: 6e 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73  n register pPars
c4d0: 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20  e->regRoot..    
c4e0: 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74  **.    ** Once t
c4f0: 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65  he SELECT has be
c500: 65 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69  en coded by sqli
c510: 74 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20  te3Select(), it 
c520: 69 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73  is in a.    ** s
c530: 75 69 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f  uitable state to
c540: 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 20 63   query for the c
c550: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20  olumn names and 
c560: 74 79 70 65 73 20 74 6f 20 62 65 20 75 73 65 64  types to be used
c570: 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e  .    ** by the n
c580: 65 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  ew table..    **
c590: 0a 20 20 20 20 2a 2a 20 41 20 73 68 61 72 65 64  .    ** A shared
c5a0: 2d 63 61 63 68 65 20 77 72 69 74 65 2d 6c 6f 63  -cache write-loc
c5b0: 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  k is not require
c5c0: 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  d to write to th
c5d0: 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20 20  e new table,.   
c5e0: 20 2a 2a 20 61 73 20 61 20 73 63 68 65 6d 61 2d   ** as a schema-
c5f0: 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76 65 20 61  lock must have a
c600: 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 62 74 61  lready been obta
c610: 69 6e 65 64 20 74 6f 20 63 72 65 61 74 65 20 69  ined to create i
c620: 74 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20  t. Since.    ** 
c630: 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78  a schema-lock ex
c640: 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72  cludes all other
c650: 20 64 61 74 61 62 61 73 65 20 75 73 65 72 73 2c   database users,
c660: 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20   the write-lock 
c670: 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20  would.    ** be 
c680: 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a  redundant..    *
c690: 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  /.    if( pSelec
c6a0: 74 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63  t ){.      Selec
c6b0: 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20  tDest dest;.    
c6c0: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
c6d0: 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
c6e0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29  pParse->nTab==1)
c6f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c700: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
c710: 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 70 50  OpenWrite, 1, pP
c720: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69  arse->regRoot, i
c730: 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
c740: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
c750: 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 1);.      pPar
c760: 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20  se->nTab = 2;.  
c770: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
c780: 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
c790: 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 29 3b 0a   SRT_Table, 1);.
c7a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
c7b0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
c7c0: 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  ect, &dest);.   
c7d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c7e0: 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
c7f0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
c800: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
c810: 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54  ){.        pSelT
c820: 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
c830: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
c840: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a  arse, pSelect);.
c850: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65 6c          if( pSel
c860: 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Tab==0 ) return;
c870: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c880: 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20   p->aCol==0 );. 
c890: 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d         p->nCol =
c8a0: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
c8b0: 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20          p->aCol 
c8c0: 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
c8d0: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
c8e0: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
c8f0: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
c900: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  l = 0;.        s
c910: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
c920: 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a  e(db, pSelTab);.
c930: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
c940: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
c950: 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
c960: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 73 74  of the CREATE st
c970: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
c980: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
c990: 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61      zStmt = crea
c9a0: 74 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20  teTableStmt(db, 
c9b0: 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
c9c0: 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70       n = (int)(p
c9d0: 45 6e 64 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d  End->z - pParse-
c9e0: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b  >sNameToken.z) +
c9f0: 20 31 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   1;.      zStmt 
ca00: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
ca10: 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  (db, .          
ca20: 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22  "CREATE %s %.*s"
ca30: 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61  , zType2, n, pPa
ca40: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
ca50: 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  z.      );.    }
ca60: 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20  ..    /* A slot 
ca70: 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68  for the record h
ca80: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
ca90: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65  allocated in the
caa0: 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f   .    ** SQLITE_
cab0: 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57  MASTER table.  W
cac0: 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75  e just need to u
cad0: 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20  pdate that slot 
cae0: 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20  with all.    ** 
caf0: 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
cb00: 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e  we've collected.
cb10: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
cb20: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
cb30: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50  Parse,.      "UP
cb40: 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20  DATE %Q.%s ".   
cb50: 20 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d        "SET type=
cb60: 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74  '%s', name=%Q, t
cb70: 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74  bl_name=%Q, root
cb80: 70 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51  page=#%d, sql=%Q
cb90: 20 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45   ".       "WHERE
cba0: 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20   rowid=#%d",.   
cbb0: 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
cbc0: 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
cbd0: 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20  BLE(iDb),.      
cbe0: 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zType,.      p->
cbf0: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zName,.      p->
cc00: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 50 61  zName,.      pPa
cc10: 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20  rse->regRoot,.  
cc20: 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20      zStmt,.     
cc30: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69   pParse->regRowi
cc40: 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  d.    );.    sql
cc50: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
cc60: 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
cc70: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
cc80: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69  Parse, iDb);..#i
cc90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cca0: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
ccb0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
ccc0: 73 65 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  see if we need t
ccd0: 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69  o create an sqli
cce0: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
ccf0: 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65  e for.    ** kee
cd00: 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75  ping track of au
cd10: 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73  toincrement keys
cd20: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
cd30: 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54   p->tabFlags & T
cd40: 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  F_Autoincrement 
cd50: 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62  ){.      Db *pDb
cd60: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
cd70: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
cd80: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
cd90: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
cda0: 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  0) );.      if( 
cdb0: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53  pDb->pSchema->pS
cdc0: 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20  eqTab==0 ){.    
cdd0: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
cde0: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
cdf0: 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
ce00: 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65   TABLE %Q.sqlite
ce10: 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73  _sequence(name,s
ce20: 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  eq)",.          
ce30: 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  pDb->zName.     
ce40: 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
ce50: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
ce60: 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65 72 79  /* Reparse every
ce70: 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20  thing to update 
ce80: 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74  our internal dat
ce90: 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a  a structures */.
cea0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ceb0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 61 72 73  ddOp4(v, OP_Pars
cec0: 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
ced0: 20 30 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0,.        sqli
cee0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
cef0: 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 22 2c 70  tbl_name='%q'",p
cf00: 2d 3e 7a 4e 61 6d 65 29 2c 20 50 34 5f 44 59 4e  ->zName), P4_DYN
cf10: 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  AMIC);.  }...  /
cf20: 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20  * Add the table 
cf30: 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  to the in-memory
cf40: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
cf50: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
cf60: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
cf70: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
cf80: 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20   Table *pOld;.  
cf90: 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d    Schema *pSchem
cfa0: 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a  a = p->pSchema;.
cfb0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
cfc0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
cfd0: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
cfe0: 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c  ;.    pOld = sql
cff0: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
d000: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
d010: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  , p->zName,.    
d020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d030: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d040: 53 74 72 6c 65 6e 33 30 28 70 2d 3e 7a 4e 61 6d  Strlen30(p->zNam
d050: 65 29 2c 70 29 3b 0a 20 20 20 20 69 66 28 20 70  e),p);.    if( p
d060: 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Old ){.      ass
d070: 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20  ert( p==pOld ); 
d080: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
d090: 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69  have failed insi
d0a0: 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20  de HashInsert() 
d0b0: 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  */.      db->mal
d0c0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
d0d0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
d0e0: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70   }.    pParse->p
d0f0: 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  NewTable = 0;.  
d100: 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a    db->nTable++;.
d110: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
d120: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
d130: 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20  anges;..#ifndef 
d140: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45  SQLITE_OMIT_ALTE
d150: 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 21  RTABLE.    if( !
d160: 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  p->pSelect ){.  
d170: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
d180: 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  zName = (const c
d190: 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e  har *)pParse->sN
d1a0: 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20  ameToken.z;.    
d1b0: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20    int nName;.   
d1c0: 20 20 20 61 73 73 65 72 74 28 20 21 70 53 65 6c     assert( !pSel
d1d0: 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26 26 20  ect && pCons && 
d1e0: 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 69 66  pEnd );.      if
d1f0: 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b  ( pCons->z==0 ){
d200: 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73 20 3d  .        pCons =
d210: 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20   pEnd;.      }. 
d220: 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e       nName = (in
d230: 74 29 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  t)((const char *
d240: 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d  )pCons->z - zNam
d250: 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64  e);.      p->add
d260: 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 20 2b  ColOffset = 13 +
d270: 20 73 71 6c 69 74 65 33 55 74 66 38 43 68 61 72   sqlite3Utf8Char
d280: 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  Len(zName, nName
d290: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
d2a0: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
d2b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
d2c0: 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  /*.** The parser
d2d0: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
d2e0: 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ine in order to 
d2f0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49 45  create a new VIE
d300: 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  W.*/.void sqlite
d310: 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 20 50  3CreateView(.  P
d320: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
d330: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
d340: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
d350: 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20  ken *pBegin,    
d360: 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
d370: 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
d380: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
d390: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
d3a0: 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f  1,     /* The to
d3b0: 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ken that holds t
d3c0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
d3d0: 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  iew */.  Token *
d3e0: 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54  pName2,     /* T
d3f0: 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f  he token that ho
d400: 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  lds the name of 
d410: 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65  the view */.  Se
d420: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
d430: 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61   /* A SELECT sta
d440: 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c  tement that will
d450: 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
d460: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
d470: 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
d480: 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f  TRUE for a TEMPO
d490: 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69  RARY view */.  i
d4a0: 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20  nt noErr        
d4b0: 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72    /* Suppress er
d4c0: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66 20  ror messages if 
d4d0: 56 49 45 57 20 61 6c 72 65 61 64 79 20 65 78 69  VIEW already exi
d4e0: 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  sts */.){.  Tabl
d4f0: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  e *p;.  int n;. 
d500: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
d510: 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20    Token sEnd;.  
d520: 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20  DbFixer sFix;.  
d530: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 20 20  Token *pName;.  
d540: 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74  int iDb;.  sqlit
d550: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
d560: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  >db;..  if( pPar
d570: 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20  se->nVar>0 ){.  
d580: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
d590: 67 28 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d  g(pParse, "param
d5a0: 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c  eters are not al
d5b0: 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73 22 29  lowed in views")
d5c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
d5d0: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
d5e0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
d5f0: 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
d600: 33 53 74 61 72 74 54 61 62 6c 65 28 70 50 61 72  3StartTable(pPar
d610: 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
d620: 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30  e2, isTemp, 1, 0
d630: 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20  , noErr);.  p = 
d640: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
d650: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  e;.  if( p==0 ||
d660: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
d670: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
d680: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
d690: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
d6a0: 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
d6b0: 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
d6c0: 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
d6d0: 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69  e2, &pName);.  i
d6e0: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
d6f0: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d  maToIndex(db, p-
d700: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 69 66 28  >pSchema);.  if(
d710: 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
d720: 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69  &sFix, pParse, i
d730: 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d  Db, "view", pNam
d740: 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65  e).    && sqlite
d750: 33 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78  3FixSelect(&sFix
d760: 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a  , pSelect).  ){.
d770: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
d780: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
d790: 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ect);.    return
d7a0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
d7b0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
d7c0: 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74 61  ntire SELECT sta
d7d0: 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
d7e0: 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
d7f0: 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72  ** This will for
d800: 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e  ce all the Expr.
d810: 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74  token.z values t
d820: 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
d830: 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  .  ** allocated 
d840: 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e  rather than poin
d850: 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73  t to the input s
d860: 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65  tring - which me
d870: 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ans that.  ** th
d880: 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20  ey will persist 
d890: 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e  after the curren
d8a0: 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  t sqlite3_exec()
d8b0: 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20   call returns.. 
d8c0: 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74   */.  p->pSelect
d8d0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
d8e0: 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c  Dup(db, pSelect,
d8f0: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
d900: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
d910: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
d920: 65 63 74 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ect);.  if( db->
d930: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
d940: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
d950: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
d960: 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  busy ){.    sqli
d970: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
d980: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29  Names(pParse, p)
d990: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
d9a0: 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
d9b0: 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  e CREATE VIEW st
d9c0: 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73  atement.  Make s
d9d0: 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a  End point to.  *
d9e0: 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a  * the end..  */.
d9f0: 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d    sEnd = pParse-
da00: 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69  >sLastToken;.  i
da10: 66 28 20 41 4c 57 41 59 53 28 73 45 6e 64 2e 7a  f( ALWAYS(sEnd.z
da20: 5b 30 5d 21 3d 30 29 20 26 26 20 73 45 6e 64 2e  [0]!=0) && sEnd.
da30: 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20  z[0]!=';' ){.   
da40: 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e   sEnd.z += sEnd.
da50: 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20  n;.  }.  sEnd.n 
da60: 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29  = 0;.  n = (int)
da70: 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e  (sEnd.z - pBegin
da80: 2d 3e 7a 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67  ->z);.  z = pBeg
da90: 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20  in->z;.  while( 
daa0: 41 4c 57 41 59 53 28 6e 3e 30 29 20 26 26 20 73  ALWAYS(n>0) && s
dab0: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
dac0: 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  n-1]) ){ n--; }.
dad0: 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d    sEnd.z = &z[n-
dae0: 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31  1];.  sEnd.n = 1
daf0: 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69  ;..  /* Use sqli
db00: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f  te3EndTable() to
db10: 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74 6f   add the view to
db20: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
db30: 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  ER table */.  sq
db40: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50  lite3EndTable(pP
db50: 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20  arse, 0, &sEnd, 
db60: 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  0);.  return;.}.
db70: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
db80: 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23  _OMIT_VIEW */..#
db90: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
dba0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
dbb0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
dbc0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
dbd0: 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61  LE)./*.** The Ta
dbe0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54  ble structure pT
dbf0: 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61  able is really a
dc00: 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20   VIEW.  Fill in 
dc10: 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  the names of.** 
dc20: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
dc30: 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70  he view in the p
dc40: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e  Table structure.
dc50: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
dc60: 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73  ber.** of errors
dc70: 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  .  If an error i
dc80: 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20  s seen leave an 
dc90: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
dca0: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
dcb0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
dcc0: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
dcd0: 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  es(Parse *pParse
dce0: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
dcf0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54  {.  Table *pSelT
dd00: 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20  ab;   /* A fake 
dd10: 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68  table from which
dd20: 20 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75   we get the resu
dd30: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65  lt set */.  Sele
dd40: 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a  ct *pSel;     /*
dd50: 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   Copy of the SEL
dd60: 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ECT that impleme
dd70: 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a  nts the view */.
dd80: 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20    int nErr = 0; 
dd90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
dda0: 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
ddb0: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  red */.  int n; 
ddc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
ddd0: 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20  mporarily holds 
dde0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75  the number of cu
ddf0: 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a  rsors assigned *
de00: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
de10: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
de20: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
de30: 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63  ction for malloc
de40: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74   errors */.  int
de50: 20 28 2a 78 41 75 74 68 29 28 76 6f 69 64 2a 2c   (*xAuth)(void*,
de60: 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  int,const char*,
de70: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
de80: 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68  t char*,const ch
de90: 61 72 2a 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ar*);..  assert(
dea0: 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e   pTable );..#ifn
deb0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
dec0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
ded0: 66 28 20 73 71 6c 69 74 65 33 56 74 61 62 43 61  f( sqlite3VtabCa
dee0: 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65  llConnect(pParse
def0: 2c 20 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20  , pTable) ){.   
df00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
df10: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
df20: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65  IsVirtual(pTable
df30: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ) ) return 0;.#e
df40: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
df50: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
df60: 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e   /* A positive n
df70: 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f  Col means the co
df80: 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20  lumns names for 
df90: 74 68 69 73 20 76 69 65 77 20 61 72 65 0a 20 20  this view are.  
dfa0: 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e  ** already known
dfb0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
dfc0: 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65  ble->nCol>0 ) re
dfd0: 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20  turn 0;..  /* A 
dfe0: 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73  negative nCol is
dff0: 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65   a special marke
e000: 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77  r meaning that w
e010: 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a  e are currently.
e020: 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63    ** trying to c
e030: 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d  ompute the colum
e040: 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20  n names.  If we 
e050: 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  enter this routi
e060: 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e  ne with.  ** a n
e070: 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74  egative nCol, it
e080: 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f   means two or mo
e090: 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20  re views form a 
e0a0: 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a  loop, like this:
e0b0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43  .  **.  **     C
e0c0: 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41  REATE VIEW one A
e0d0: 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
e0e0: 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52  two;.  **     CR
e0f0: 45 41 54 45 20 56 49 45 57 20 74 77 6f 20 41 53  EATE VIEW two AS
e100: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f   SELECT * FROM o
e110: 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63  ne;.  **.  ** Ac
e120: 74 75 61 6c 6c 79 2c 20 74 68 65 20 65 72 72 6f  tually, the erro
e130: 72 20 61 62 6f 76 65 20 69 73 20 6e 6f 77 20 63  r above is now c
e140: 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72  aught prior to r
e150: 65 61 63 68 69 6e 67 20 74 68 69 73 20 70 6f 69  eaching this poi
e160: 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 65  nt..  ** But the
e170: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20   following test 
e180: 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f 72 74 61  is still importa
e190: 6e 74 20 61 73 20 69 74 20 64 6f 65 73 20 63 6f  nt as it does co
e1a0: 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e 20 74 68  me up.  ** in th
e1b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a  e following:.  *
e1c0: 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  * .  **     CREA
e1d0: 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e 65 78  TE TABLE main.ex
e1e0: 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43  1(a);.  **     C
e1f0: 52 45 41 54 45 20 54 45 4d 50 20 56 49 45 57 20  REATE TEMP VIEW 
e200: 65 78 31 20 41 53 20 53 45 4c 45 43 54 20 61 20  ex1 AS SELECT a 
e210: 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a 20 20  FROM ex1;.  **  
e220: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
e230: 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a   temp.ex1;.  */.
e240: 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
e250: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ol<0 ){.    sqli
e260: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
e270: 73 65 2c 20 22 76 69 65 77 20 25 73 20 69 73 20  se, "view %s is 
e280: 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e  circularly defin
e290: 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  ed", pTable->zNa
e2a0: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
e2b0: 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  1;.  }.  assert(
e2c0: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30   pTable->nCol>=0
e2d0: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20   );..  /* If we 
e2e0: 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74  get this far, it
e2f0: 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74   means we need t
e300: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61  o compute the ta
e310: 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20  ble names..  ** 
e320: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61  Note that the ca
e330: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73  ll to sqlite3Res
e340: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29  ultSetOfSelect()
e350: 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79   will expand any
e360: 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e  .  ** "*" elemen
e370: 74 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ts in the result
e380: 73 20 73 65 74 20 6f 66 20 74 68 65 20 76 69 65  s set of the vie
e390: 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67  w and will assig
e3a0: 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74  n cursors.  ** t
e3b0: 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f  o the elements o
e3c0: 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
e3d0: 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f  e.  But we do no
e3e0: 74 20 77 61 6e 74 20 74 68 65 73 65 20 63 68 61  t want these cha
e3f0: 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20  nges.  ** to be 
e400: 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74  permanent.  So t
e410: 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69  he computation i
e420: 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79  s done on a copy
e430: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20   of the SELECT. 
e440: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68   ** statement th
e450: 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76  at defines the v
e460: 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  iew..  */.  asse
e470: 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  rt( pTable->pSel
e480: 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20  ect );.  pSel = 
e490: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
e4a0: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65  (db, pTable->pSe
e4b0: 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  lect, 0);.  if( 
e4c0: 70 53 65 6c 20 29 7b 0a 20 20 20 20 75 38 20 65  pSel ){.    u8 e
e4d0: 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 20 3d  nableLookaside =
e4e0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
e4f0: 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 6e 20 3d  Enabled;.    n =
e500: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
e510: 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
e520: 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
e530: 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72  Parse, pSel->pSr
e540: 63 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e  c);.    pTable->
e550: 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 64  nCol = -1;.    d
e560: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
e570: 61 62 6c 65 64 20 3d 20 30 3b 0a 23 69 66 6e 64  abled = 0;.#ifnd
e580: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
e590: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
e5a0: 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75   xAuth = db->xAu
e5b0: 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74  th;.    db->xAut
e5c0: 68 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54  h = 0;.    pSelT
e5d0: 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
e5e0: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
e5f0: 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20  arse, pSel);.   
e600: 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75   db->xAuth = xAu
e610: 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 53  th;.#else.    pS
e620: 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
e630: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
e640: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a  (pParse, pSel);.
e650: 23 65 6e 64 69 66 0a 20 20 20 20 64 62 2d 3e 6c  #endif.    db->l
e660: 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
e670: 64 20 3d 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73  d = enableLookas
e680: 69 64 65 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ide;.    pParse-
e690: 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69  >nTab = n;.    i
e6a0: 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20  f( pSelTab ){.  
e6b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
e6c0: 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20  le->aCol==0 );. 
e6d0: 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f       pTable->nCo
e6e0: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f  l = pSelTab->nCo
e6f0: 6c 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d  l;.      pTable-
e700: 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >aCol = pSelTab-
e710: 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65  >aCol;.      pSe
e720: 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  lTab->nCol = 0;.
e730: 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61        pSelTab->a
e740: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  Col = 0;.      s
e750: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
e760: 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a  e(db, pSelTab);.
e770: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
e780: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
e790: 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 54 61 62  Held(db, 0, pTab
e7a0: 6c 65 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a  le->pSchema) );.
e7b0: 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53        pTable->pS
e7c0: 63 68 65 6d 61 2d 3e 66 6c 61 67 73 20 7c 3d 20  chema->flags |= 
e7d0: 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b  DB_UnresetViews;
e7e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e7f0: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
e800: 20 30 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b   0;.      nErr++
e810: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
e820: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
e830: 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20 7d 20 65  db, pSel);.  } e
e840: 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b  lse {.    nErr++
e850: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
e860: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
e870: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45 72   */.  return nEr
e880: 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  r;  .}.#endif /*
e890: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
e8a0: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
e8b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
e8c0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
e8d0: 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) */..#ifndef SQ
e8e0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f  LITE_OMIT_VIEW./
e8f0: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63  *.** Clear the c
e900: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d  olumn names from
e910: 20 65 76 65 72 79 20 56 49 45 57 20 69 6e 20 64   every VIEW in d
e920: 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a  atabase idx..*/.
e930: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
e940: 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73  teViewResetAll(s
e950: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
e960: 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  idx){.  HashElem
e970: 20 2a 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73   *i;.  assert( s
e980: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
e990: 78 48 65 6c 64 28 64 62 2c 20 69 64 78 2c 20 30  xHeld(db, idx, 0
e9a0: 29 20 29 3b 0a 20 20 69 66 28 20 21 44 62 48 61  ) );.  if( !DbHa
e9b0: 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64  sProperty(db, id
e9c0: 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  x, DB_UnresetVie
e9d0: 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ws) ) return;.  
e9e0: 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68  for(i=sqliteHash
e9f0: 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69  First(&db->aDb[i
ea00: 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  dx].pSchema->tbl
ea10: 48 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74  Hash); i;i=sqlit
ea20: 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
ea30: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
ea40: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
ea50: 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  i);.    if( pTab
ea60: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
ea70: 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 43     sqliteDeleteC
ea80: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70  olumnNames(db, p
ea90: 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54 61 62  Tab);.      pTab
eaa0: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
eab0: 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30    pTab->nCol = 0
eac0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62  ;.    }.  }.  Db
ead0: 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62  ClearProperty(db
eae0: 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65  , idx, DB_Unrese
eaf0: 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65  tViews);.}.#else
eb00: 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65  .# define sqlite
eb10: 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42  ViewResetAll(A,B
eb20: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
eb30: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
eb40: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
eb50: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
eb60: 79 20 74 68 65 20 56 44 42 45 20 74 6f 20 61 64  y the VDBE to ad
eb70: 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61  just the interna
eb80: 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64  l schema.** used
eb90: 20 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20   by SQLite when 
eba0: 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20  the btree layer 
ebb0: 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f  moves a table ro
ebc0: 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20  ot page. The.** 
ebd0: 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74  root-page of a t
ebe0: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e  able or index in
ebf0: 20 64 61 74 61 62 61 73 65 20 69 44 62 20 68 61   database iDb ha
ec00: 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69  s changed from i
ec10: 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a  From.** to iTo..
ec20: 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31 37  **.** Ticket #17
ec30: 32 38 3a 20 20 54 68 65 20 73 79 6d 62 6f 6c 20  28:  The symbol 
ec40: 74 61 62 6c 65 20 6d 69 67 68 74 20 73 74 69 6c  table might stil
ec50: 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d  l contain inform
ec60: 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c  ation.** on tabl
ec70: 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65  es and/or indice
ec80: 73 20 74 68 61 74 20 61 72 65 20 74 68 65 20 70  s that are the p
ec90: 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20  rocess of being 
eca0: 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79  deleted..** If y
ecb0: 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20  ou are unlucky, 
ecc0: 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 64 65 6c  one of those del
ecd0: 65 74 65 64 20 69 6e 64 69 63 65 73 20 6f 72 20  eted indices or 
ece0: 74 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20  tables might.** 
ecf0: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 72 6f  have the same ro
ed00: 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73  otpage number as
ed10: 20 74 68 65 20 72 65 61 6c 20 74 61 62 6c 65 20   the real table 
ed20: 6f 72 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  or index that is
ed30: 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e  .** being moved.
ed40: 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73    So we cannot s
ed50: 74 6f 70 20 73 65 61 72 63 68 69 6e 67 20 61 66  top searching af
ed60: 74 65 72 20 74 68 65 20 66 69 72 73 74 20 6d 61  ter the first ma
ed70: 74 63 68 20 0a 2a 2a 20 62 65 63 61 75 73 65 20  tch .** because 
ed80: 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20  the first match 
ed90: 6d 69 67 68 74 20 62 65 20 66 6f 72 20 6f 6e 65  might be for one
eda0: 20 6f 66 20 74 68 65 20 64 65 6c 65 74 65 64 20   of the deleted 
edb0: 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61  indices.** or ta
edc0: 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74 68 65  bles and not the
edd0: 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 74 68 61   table/index tha
ede0: 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 62 65  t is actually be
edf0: 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65  ing moved..** We
ee00: 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c   must continue l
ee10: 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c  ooping until all
ee20: 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69   tables and indi
ee30: 63 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74  ces with.** root
ee40: 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65  page==iFrom have
ee50: 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20   been converted 
ee60: 74 6f 20 68 61 76 65 20 61 20 72 6f 6f 74 70 61  to have a rootpa
ee70: 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20  ge of iTo.** in 
ee80: 6f 72 64 65 72 20 74 6f 20 62 65 20 63 65 72 74  order to be cert
ee90: 61 69 6e 20 74 68 61 74 20 77 65 20 67 6f 74 20  ain that we got 
eea0: 74 68 65 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a  the right one..*
eeb0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
eec0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
eed0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f  .void sqlite3Roo
eee0: 74 50 61 67 65 4d 6f 76 65 64 28 44 62 20 2a 70  tPageMoved(Db *p
eef0: 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  Db, int iFrom, i
ef00: 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45  nt iTo){.  HashE
ef10: 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61  lem *pElem;.  Ha
ef20: 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 70 48  sh *pHash;..  pH
ef30: 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68  ash = &pDb->pSch
ef40: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20  ema->tblHash;.  
ef50: 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65  for(pElem=sqlite
ef60: 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29  HashFirst(pHash)
ef70: 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
ef80: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
ef90: 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65  lem)){.    Table
efa0: 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
efb0: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
efc0: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e      if( pTab->tn
efd0: 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  um==iFrom ){.   
efe0: 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20     pTab->tnum = 
eff0: 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  iTo;.    }.  }. 
f000: 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70   pHash = &pDb->p
f010: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b  Schema->idxHash;
f020: 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c  .  for(pElem=sql
f030: 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61  iteHashFirst(pHa
f040: 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
f050: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
f060: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e  (pElem)){.    In
f070: 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69  dex *pIdx = sqli
f080: 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
f090: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d  );.    if( pIdx-
f0a0: 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a  >tnum==iFrom ){.
f0b0: 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d        pIdx->tnum
f0c0: 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20   = iTo;.    }.  
f0d0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
f0e0: 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f 20  * Write code to 
f0f0: 65 72 61 73 65 20 74 68 65 20 74 61 62 6c 65 20  erase the table 
f100: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
f110: 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61 62  Table from datab
f120: 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f  ase iDb..** Also
f130: 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20 6d   write code to m
f140: 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69 74 65  odify the sqlite
f150: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e  _master table an
f160: 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  d internal schem
f170: 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70  a.** if a root-p
f180: 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 74  age of another t
f190: 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79  able is moved by
f1a0: 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65 72   the btree-layer
f1b0: 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69   whilst.** erasi
f1c0: 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69 73 20  ng iTable (this 
f1d0: 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20  can happen with 
f1e0: 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
f1f0: 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74  atabase)..*/ .st
f200: 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f  atic void destro
f210: 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65 20  yRootPage(Parse 
f220: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61  *pParse, int iTa
f230: 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  ble, int iDb){. 
f240: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
f250: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
f260: 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71  );.  int r1 = sq
f270: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
f280: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
f290: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
f2a0: 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62  OP_Destroy, iTab
f2b0: 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20 20  le, r1, iDb);.  
f2c0: 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
f2d0: 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66  pParse);.#ifndef
f2e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
f2f0: 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f  OVACUUM.  /* OP_
f300: 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20 61  Destroy stores a
f310: 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31 2e  n in integer r1.
f320: 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65 72   If this integer
f330: 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72  .  ** is non-zer
f340: 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  o, then it is th
f350: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
f360: 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f  er of a table mo
f370: 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61  ved to.  ** loca
f380: 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65  tion iTable. The
f390: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
f3a0: 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71 6c  modifies the sql
f3b0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
f3c0: 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74   to.  ** reflect
f3d0: 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   this..  **.  **
f3e0: 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74   The "#NNN" in t
f3f0: 68 65 20 53 51 4c 20 69 73 20 61 20 73 70 65 63  he SQL is a spec
f400: 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ial constant tha
f410: 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72  t means whatever
f420: 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69   value.  ** is i
f430: 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20  n register NNN. 
f440: 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72 75 6c   See grammar rul
f450: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
f460: 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49 53 54  th the TK_REGIST
f470: 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f  ER.  ** token fo
f480: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
f490: 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  ormation..  */. 
f4a0: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
f4b0: 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
f4c0: 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20    "UPDATE %Q.%s 
f4d0: 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20  SET rootpage=%d 
f4e0: 57 48 45 52 45 20 23 25 64 20 41 4e 44 20 72 6f  WHERE #%d AND ro
f4f0: 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20 20  otpage=#%d",.   
f500: 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44    pParse->db->aD
f510: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
f520: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
f530: 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 72 31 29   iTable, r1, r1)
f540: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
f550: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
f560: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a  (pParse, r1);.}.
f570: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42  ./*.** Write VDB
f580: 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20  E code to erase 
f590: 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61  table pTab and a
f5a0: 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e  ll associated in
f5b0: 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a  dices on disk..*
f5c0: 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65  * Code to update
f5d0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
f5e0: 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e  er tables and in
f5f0: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65  ternal schema de
f600: 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20  finitions.** in 
f610: 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65  case a root-page
f620: 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e   belonging to an
f630: 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d  other table is m
f640: 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65  oved by the btre
f650: 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c  e layer.** is al
f660: 73 6f 20 61 64 64 65 64 20 28 74 68 69 73 20 63  so added (this c
f670: 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  an happen with a
f680: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
f690: 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74  tabase)..*/.stat
f6a0: 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54  ic void destroyT
f6b0: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
f6c0: 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29  se, Table *pTab)
f6d0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
f6e0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
f6f0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
f700: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
f710: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
f720: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
f730: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 64 65  ->pSchema);.  de
f740: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
f750: 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  arse, pTab->tnum
f760: 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28 70 49  , iDb);.  for(pI
f770: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
f780: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
f790: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64 65  ->pNext){.    de
f7a0: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
f7b0: 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  arse, pIdx->tnum
f7c0: 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73  , iDb);.  }.#els
f7d0: 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  e.  /* If the da
f7e0: 74 61 62 61 73 65 20 6d 61 79 20 62 65 20 61 75  tabase may be au
f7f0: 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c  to-vacuum capabl
f800: 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  e (if SQLITE_OMI
f810: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a  T_AUTOVACUUM.  *
f820: 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  * is not defined
f830: 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d  ), then it is im
f840: 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20  portant to call 
f850: 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68  OP_Destroy on th
f860: 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64  e.  ** table and
f870: 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65   index root-page
f880: 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72  s in order, star
f890: 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75  ting with the nu
f8a0: 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20  merically .  ** 
f8b0: 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
f8c0: 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67  e number. This g
f8d0: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e  uarantees that n
f8e0: 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d  one of the root-
f8f0: 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65  pages.  ** to be
f900: 20 64 65 73 74 72 6f 79 65 64 20 69 73 20 72 65   destroyed is re
f910: 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65 61  located by an ea
f920: 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79  rlier OP_Destroy
f930: 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20  . i.e. if the.  
f940: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72  ** following wer
f950: 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20  e coded:.  **.  
f960: 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20  ** OP_Destroy 4 
f970: 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20  0.  ** ....  ** 
f980: 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20  OP_Destroy 5 0. 
f990: 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f   **.  ** and roo
f9a0: 74 20 70 61 67 65 20 35 20 68 61 70 70 65 6e 65  t page 5 happene
f9b0: 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67  d to be the larg
f9c0: 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  est root-page nu
f9d0: 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a  mber in the.  **
f9e0: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20   database, then 
f9f0: 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c  root page 5 woul
fa00: 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61  d be moved to pa
fa10: 67 65 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a  ge 4 by the .  *
fa20: 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20  * "OP_Destroy 4 
fa30: 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73  0" opcode. The s
fa40: 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65  ubsequent "OP_De
fa50: 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64  stroy 5 0" would
fa60: 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65   hit.  ** a free
fa70: 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f  -list page..  */
fa80: 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54  .  int iTab = pT
fa90: 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20  ab->tnum;.  int 
faa0: 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a  iDestroyed = 0;.
fab0: 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
fac0: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
fad0: 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74      int iLargest
fae0: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69   = 0;..    if( i
faf0: 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20  Destroyed==0 || 
fb00: 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20  iTab<iDestroyed 
fb10: 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73  ){.      iLarges
fb20: 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a  t = iTab;.    }.
fb30: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
fb40: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
fb50: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
fb60: 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49  t){.      int iI
fb70: 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b  dx = pIdx->tnum;
fb80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
fb90: 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  Idx->pSchema==pT
fba0: 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20  ab->pSchema );. 
fbb0: 20 20 20 20 20 69 66 28 20 28 69 44 65 73 74 72       if( (iDestr
fbc0: 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78  oyed==0 || (iIdx
fbd0: 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20 26 26  <iDestroyed)) &&
fbe0: 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29   iIdx>iLargest )
fbf0: 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67 65  {.        iLarge
fc00: 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20  st = iIdx;.     
fc10: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
fc20: 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a   iLargest==0 ){.
fc30: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
fc40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
fc50: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
fc60: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
fc70: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
fc80: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
fc90: 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
fca0: 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74  pParse, iLargest
fcb0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69 44  , iDb);.      iD
fcc0: 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67  estroyed = iLarg
fcd0: 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  est;.    }.  }.#
fce0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
fcf0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
fd00: 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20  alled to do the 
fd10: 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54  work of a DROP T
fd20: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
fd30: 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20  ** pName is the 
fd40: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
fd50: 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e  e to be dropped.
fd60: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
fd70: 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20  DropTable(Parse 
fd80: 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
fd90: 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56   *pName, int isV
fda0: 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b  iew, int noErr){
fdb0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
fdc0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
fdd0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
fde0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
fdf0: 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  ;..  if( db->mal
fe00: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
fe10: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
fe20: 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73  table;.  }.  ass
fe30: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
fe40: 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r==0 );.  assert
fe50: 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31  ( pName->nSrc==1
fe60: 20 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20   );.  if( noErr 
fe70: 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72  ) db->suppressEr
fe80: 72 2b 2b 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  r++;.  pTab = sq
fe90: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
fea0: 28 70 50 61 72 73 65 2c 20 69 73 56 69 65 77 2c  (pParse, isView,
feb0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
fec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
fed0: 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ame->a[0].zName,
fee0: 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
fef0: 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 6e  tabase);.  if( n
ff00: 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72  oErr ) db->suppr
ff10: 65 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28  essErr--;..  if(
ff20: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
ff30: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
ff40: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20  able;.  }.  iDb 
ff50: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
ff60: 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
ff70: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73  >pSchema);.  ass
ff80: 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
ff90: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20  Db<db->nDb );.. 
ffa0: 20 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20 61   /* If pTab is a
ffb0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20   virtual table, 
ffc0: 63 61 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c 75  call ViewGetColu
ffd0: 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e 73  mnNames() to ens
ffe0: 75 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 69  ure.  ** it is i
fff0: 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
10000 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
10010 28 70 54 61 62 29 20 26 26 20 73 71 6c 69 74 65  (pTab) && sqlite
10020 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
10030 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
10040 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
10050 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
10060 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
10070 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
10080 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
10090 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74   code;.    const
100a0 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43   char *zTab = SC
100b0 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b  HEMA_TABLE(iDb);
100c0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
100d0 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
100e0 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  Db].zName;.    c
100f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32  onst char *zArg2
10100 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
10110 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
10120 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
10130 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a  LETE, zTab, 0, z
10140 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  Db)){.      goto
10150 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
10160 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10170 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
10180 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
10190 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
101a0 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
101b0 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49  ITE_DROP_TEMP_VI
101c0 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EW;.      }else{
101d0 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
101e0 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57  SQLITE_DROP_VIEW
101f0 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
10200 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
10210 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d  RTUALTABLE.    }
10220 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75  else if( IsVirtu
10230 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
10240 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
10250 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20  DROP_VTABLE;.   
10260 20 20 20 7a 41 72 67 32 20 3d 20 73 71 6c 69 74     zArg2 = sqlit
10270 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20  e3GetVTable(db, 
10280 70 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61  pTab)->pMod->zNa
10290 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  me;.#endif.    }
102a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
102b0 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
102c0 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
102d0 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
102e0 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b  DROP_TEMP_TABLE;
102f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10300 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
10310 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a  ITE_DROP_TABLE;.
10320 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10330 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
10340 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
10350 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ode, pTab->zName
10360 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29 7b  , zArg2, zDb) ){
10370 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
10380 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
10390 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
103a0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
103b0 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
103c0 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  E, pTab->zName, 
103d0 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
103e0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
103f0 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  table;.    }.  }
10400 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71  .#endif.  if( sq
10410 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54  lite3StrNICmp(pT
10420 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ab->zName, "sqli
10430 74 65 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20  te_", 7)==0 ){. 
10440 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
10450 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
10460 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
10470 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e  dropped", pTab->
10480 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
10490 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
104a0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
104b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
104c0 20 20 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f 50    /* Ensure DROP
104d0 20 54 41 42 4c 45 20 69 73 20 6e 6f 74 20 75 73   TABLE is not us
104e0 65 64 20 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e  ed on a view, an
104f0 64 20 44 52 4f 50 20 56 49 45 57 20 69 73 20 6e  d DROP VIEW is n
10500 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20  ot used.  ** on 
10510 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  a table..  */.  
10520 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70 54  if( isView && pT
10530 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  ab->pSelect==0 )
10540 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
10550 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
10560 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f  se DROP TABLE to
10570 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73   delete table %s
10580 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
10590 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
105a0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
105b0 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
105c0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
105d0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
105e0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73  rMsg(pParse, "us
105f0 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64  e DROP VIEW to d
10600 65 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c 20  elete view %s", 
10610 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
10620 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
10630 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64  _table;.  }.#end
10640 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
10650 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
10660 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
10670 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
10680 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20  .  ** on disk.. 
10690 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
106a0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
106b0 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
106c0 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
106d0 65 72 3b 0a 20 20 20 20 44 62 20 2a 70 44 62 20  er;.    Db *pDb 
106e0 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
106f0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
10700 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
10710 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
10720 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10730 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
10740 4c 45 0a 20 20 20 20 69 66 28 20 49 73 56 69 72  LE.    if( IsVir
10750 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
10760 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10770 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67  ddOp0(v, OP_VBeg
10780 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  in);.    }.#endi
10790 66 0a 20 20 20 20 73 71 6c 69 74 65 33 46 6b 44  f.    sqlite3FkD
107a0 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ropTable(pParse,
107b0 20 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a 0a   pName, pTab);..
107c0 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20      /* Drop all 
107d0 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61  triggers associa
107e0 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  ted with the tab
107f0 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
10800 2e 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73  . Code.    ** is
10810 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65   generated to re
10820 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f  move entries fro
10830 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  m sqlite_master 
10840 61 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20 73 71  and/or.    ** sq
10850 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
10860 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20   if required..  
10870 20 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67 65    */.    pTrigge
10880 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67  r = sqlite3Trigg
10890 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  erList(pParse, p
108a0 54 61 62 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  Tab);.    while(
108b0 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20   pTrigger ){.   
108c0 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
108d0 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  ger->pSchema==pT
108e0 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a  ab->pSchema || .
108f0 20 20 20 20 20 20 20 20 20 20 70 54 72 69 67 67            pTrigg
10900 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d  er->pSchema==db-
10910 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
10920 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10930 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 70  DropTriggerPtr(p
10940 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 29  Parse, pTrigger)
10950 3b 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72  ;.      pTrigger
10960 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65   = pTrigger->pNe
10970 78 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  xt;.    }..#ifnd
10980 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
10990 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
109a0 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65   /* Remove any e
109b0 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71  ntries of the sq
109c0 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
109d0 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
109e0 69 74 68 0a 20 20 20 20 2a 2a 20 74 68 65 20 74  ith.    ** the t
109f0 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
10a00 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  ed. This is done
10a10 20 62 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c   before the tabl
10a20 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20 20  e is dropped.   
10a30 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65   ** at the btree
10a40 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20   level, in case 
10a50 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65  the sqlite_seque
10a60 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20  nce table needs 
10a70 74 6f 0a 20 20 20 20 2a 2a 20 6d 6f 76 65 20 61  to.    ** move a
10a80 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
10a90 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70  e drop (can happ
10aa0 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  en in auto-vacuu
10ab0 6d 20 6d 6f 64 65 29 2e 0a 20 20 20 20 2a 2f 0a  m mode)..    */.
10ac0 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61      if( pTab->ta
10ad0 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
10ae0 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20  increment ){.   
10af0 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
10b00 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
10b10 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
10b20 4f 4d 20 25 73 2e 73 71 6c 69 74 65 5f 73 65 71  OM %s.sqlite_seq
10b30 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d 65  uence WHERE name
10b40 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 70 44  =%Q",.        pD
10b50 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  b->zName, pTab->
10b60 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
10b70 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
10b80 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c   /* Drop all SQL
10b90 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
10ba0 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69   and index entri
10bb0 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  es that refer to
10bc0 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c   the.    ** tabl
10bd0 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e  e. The program n
10be0 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67  ame loops throug
10bf0 68 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  h the master tab
10c00 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20  le and deletes. 
10c10 20 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20     ** every row 
10c20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61  that refers to a
10c30 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61   table of the sa
10c40 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f  me name as the o
10c50 6e 65 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20  ne being.    ** 
10c60 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72  dropped. Trigger
10c70 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65  s are handled se
10c80 70 65 72 61 74 65 6c 79 20 62 65 63 61 75 73 65  perately because
10c90 20 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62   a trigger can b
10ca0 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  e.    ** created
10cb0 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74   in the temp dat
10cc0 61 62 61 73 65 20 74 68 61 74 20 72 65 66 65 72  abase that refer
10cd0 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20  s to a table in 
10ce0 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64  another.    ** d
10cf0 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  atabase..    */.
10d00 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
10d10 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a  dParse(pParse, .
10d20 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20          "DELETE 
10d30 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45  FROM %Q.%s WHERE
10d40 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64   tbl_name=%Q and
10d50 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27   type!='trigger'
10d60 22 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ",.        pDb->
10d70 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
10d80 42 4c 45 28 69 44 62 29 2c 20 70 54 61 62 2d 3e  BLE(iDb), pTab->
10d90 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20  zName);..    /* 
10da0 44 72 6f 70 20 61 6e 79 20 73 74 61 74 69 73 74  Drop any statist
10db0 69 63 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  ics from the sql
10dc0 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 2c  ite_stat1 table,
10dd0 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f   if it exists */
10de0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
10df0 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22 73  FindTable(db, "s
10e00 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 64 62  qlite_stat1", db
10e10 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
10e20 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
10e30 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
10e40 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44  arse,.        "D
10e50 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 73 71  ELETE FROM %Q.sq
10e60 6c 69 74 65 5f 73 74 61 74 31 20 57 48 45 52 45  lite_stat1 WHERE
10e70 20 74 62 6c 3d 25 51 22 2c 20 70 44 62 2d 3e 7a   tbl=%Q", pDb->z
10e80 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
10e90 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  e.      );.    }
10ea0 0a 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65  ..    if( !isVie
10eb0 77 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28  w && !IsVirtual(
10ec0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 64  pTab) ){.      d
10ed0 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72  estroyTable(pPar
10ee0 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d  se, pTab);.    }
10ef0 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ..    /* Remove 
10f00 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
10f10 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e  from SQLite's in
10f20 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e  ternal schema an
10f30 64 20 6d 6f 64 69 66 79 0a 20 20 20 20 2a 2a 20  d modify.    ** 
10f40 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
10f50 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
10f60 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
10f70 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
10f80 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
10f90 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44 62  OP_VDestroy, iDb
10fa0 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  , 0, 0, pTab->zN
10fb0 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ame, 0);.    }. 
10fc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10fd0 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54  dOp4(v, OP_DropT
10fe0 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c  able, iDb, 0, 0,
10ff0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
11000 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61  ;.    sqlite3Cha
11010 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
11020 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71  , iDb);.  }.  sq
11030 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
11040 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74  (db, iDb);..exit
11050 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73  _drop_table:.  s
11060 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
11070 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ete(db, pName);.
11080 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
11090 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
110a0 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
110b0 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74  foreign key on t
110c0 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72  he table.** curr
110d0 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
110e0 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d  truction.  pFrom
110f0 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77  Col determines w
11100 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  hich columns.** 
11110 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  in the current t
11120 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68  able point to th
11130 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20  e foreign key.  
11140 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74  If pFromCol==0 t
11150 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74  hen.** connect t
11160 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61  he key to the la
11170 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74  st column insert
11180 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20  ed.  pTo is the 
11190 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74  name of.** the t
111a0 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f  able referred to
111b0 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c  .  pToCol is a l
111c0 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ist of tables in
111d0 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54   the other.** pT
111e0 6f 20 74 61 62 6c 65 20 74 68 61 74 20 74 68 65  o table that the
111f0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69   foreign key poi
11200 6e 74 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63  nts to.  flags c
11210 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69  ontains all.** i
11220 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
11230 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65   the conflict re
11240 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
11250 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  hms specified.**
11260 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54   in the ON DELET
11270 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64  E, ON UPDATE and
11280 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73   ON INSERT claus
11290 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65  es..**.** An FKe
112a0 79 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  y structure is c
112b0 72 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64  reated and added
112c0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
112d0 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72  rrently.** under
112e0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e   construction in
112f0 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   the pParse->pNe
11300 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a  wTable field..**
11310 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20  .** The foreign 
11320 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72 20 49  key is set for I
11330 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73 73  MMEDIATE process
11340 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75 65  ing.  A subseque
11350 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71  nt call.** to sq
11360 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67  lite3DeferForeig
11370 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68 61  nKey() might cha
11380 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45 46 45  nge this to DEFE
11390 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  RRED..*/.void sq
113a0 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 69  lite3CreateForei
113b0 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a  gnKey(.  Parse *
113c0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
113d0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
113e0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
113f0 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f  pFromCol,  /* Co
11400 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61  lumns in this ta
11410 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74  ble that point t
11420 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  o other table */
11430 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20  .  Token *pTo,  
11440 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
11450 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74 61 62  of the other tab
11460 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
11470 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20   *pToCol,    /* 
11480 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f  Columns in the o
11490 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
114a0 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
114b0 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74       /* Conflict
114c0 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
114d0 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20  rithms. */.){.  
114e0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
114f0 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65  arse->db;.#ifnde
11500 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
11510 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79  REIGN_KEY.  FKey
11520 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 46   *pFKey = 0;.  F
11530 4b 65 79 20 2a 70 4e 65 78 74 54 6f 3b 0a 20 20  Key *pNextTo;.  
11540 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73  Table *p = pPars
11550 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
11560 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74  int nByte;.  int
11570 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a   i;.  int nCol;.
11580 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73    char *z;..  as
11590 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a  sert( pTo!=0 );.
115a0 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 49 4e    if( p==0 || IN
115b0 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20  _DECLARE_VTAB ) 
115c0 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69  goto fk_end;.  i
115d0 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29  f( pFromCol==0 )
115e0 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  {.    int iCol =
115f0 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20   p->nCol-1;.    
11600 69 66 28 20 4e 45 56 45 52 28 69 43 6f 6c 3c 30  if( NEVER(iCol<0
11610 29 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  ) ) goto fk_end;
11620 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  .    if( pToCol 
11630 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72  && pToCol->nExpr
11640 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=1 ){.      sql
11650 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11660 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65  rse, "foreign ke
11670 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20  y on %s".       
11680 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72    " should refer
11690 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f  ence only one co
116a0 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54  lumn of table %T
116b0 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61  ",.         p->a
116c0 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c  Col[iCol].zName,
116d0 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74   pTo);.      got
116e0 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  o fk_end;.    }.
116f0 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20      nCol = 1;.  
11700 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c  }else if( pToCol
11710 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70   && pToCol->nExp
11720 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78  r!=pFromCol->nEx
11730 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pr ){.    sqlite
11740 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
11750 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65  ,.        "numbe
11760 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
11770 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73  foreign key does
11780 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e   not match the n
11790 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20  umber of ".     
117a0 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74     "columns in t
117b0 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61  he referenced ta
117c0 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ble");.    goto 
117d0 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b  fk_end;.  }else{
117e0 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f  .    nCol = pFro
117f0 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  mCol->nExpr;.  }
11800 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
11810 66 28 2a 70 46 4b 65 79 29 20 2b 20 28 6e 43 6f  f(*pFKey) + (nCo
11820 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65  l-1)*sizeof(pFKe
11830 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54  y->aCol[0]) + pT
11840 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20  o->n + 1;.  if( 
11850 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
11860 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d  r(i=0; i<pToCol-
11870 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
11880 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c      nByte += sql
11890 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f  ite3Strlen30(pTo
118a0 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
118b0 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
118c0 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65    pFKey = sqlite
118d0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
118e0 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  , nByte );.  if(
118f0 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20   pFKey==0 ){.   
11900 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
11910 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d  }.  pFKey->pFrom
11920 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70   = p;.  pFKey->p
11930 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46  NextFrom = p->pF
11940 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72  Key;.  z = (char
11950 2a 29 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e  *)&pFKey->aCol[n
11960 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a  Col];.  pFKey->z
11970 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79  To = z;.  memcpy
11980 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d  (z, pTo->z, pTo-
11990 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d  >n);.  z[pTo->n]
119a0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
119b0 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b  equote(z);.  z +
119c0 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46  = pTo->n+1;.  pF
119d0 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  Key->nCol = nCol
119e0 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c  ;.  if( pFromCol
119f0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79  ==0 ){.    pFKey
11a00 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20  ->aCol[0].iFrom 
11a10 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d  = p->nCol-1;.  }
11a20 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
11a30 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
11a40 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
11a50 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
11a60 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
11a70 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
11a80 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c  3StrICmp(p->aCol
11a90 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d  [j].zName, pFrom
11aa0 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
11ab0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
11ac0 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
11ad0 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20  iFrom = j;.     
11ae0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11af0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11b00 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43      if( j>=p->nC
11b10 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ol ){.        sq
11b20 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
11b30 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
11b40 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e   "unknown column
11b50 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69   \"%s\" in forei
11b60 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
11b70 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  n", .          p
11b80 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
11b90 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
11ba0 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20  to fk_end;.     
11bb0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
11bc0 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
11bd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
11be0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
11bf0 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t n = sqlite3Str
11c00 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b  len30(pToCol->a[
11c10 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
11c20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
11c30 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20  zCol = z;.      
11c40 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c  memcpy(z, pToCol
11c50 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29  ->a[i].zName, n)
11c60 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30  ;.      z[n] = 0
11c70 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31  ;.      z += n+1
11c80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46  ;.    }.  }.  pF
11c90 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
11ca0 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41  = 0;.  pFKey->aA
11cb0 63 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28  ction[0] = (u8)(
11cc0 66 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20 20  flags & 0xff);  
11cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20            /* ON 
11ce0 44 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f  DELETE action */
11cf0 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f  .  pFKey->aActio
11d00 6e 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c 61  n[1] = (u8)((fla
11d10 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66  gs >> 8 ) & 0xff
11d20 29 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41  );    /* ON UPDA
11d30 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  TE action */..  
11d40 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
11d50 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
11d60 62 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61  b, 0, p->pSchema
11d70 29 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d  ) );.  pNextTo =
11d80 20 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65 33   (FKey *)sqlite3
11d90 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70  HashInsert(&p->p
11da0 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68  Schema->fkeyHash
11db0 2c 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  , .      pFKey->
11dc0 7a 54 6f 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  zTo, sqlite3Strl
11dd0 65 6e 33 30 28 70 46 4b 65 79 2d 3e 7a 54 6f 29  en30(pFKey->zTo)
11de0 2c 20 28 76 6f 69 64 20 2a 29 70 46 4b 65 79 0a  , (void *)pFKey.
11df0 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 78 74    );.  if( pNext
11e00 54 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a 20 20 20  To==pFKey ){.   
11e10 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
11e20 64 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  d = 1;.    goto 
11e30 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66  fk_end;.  }.  if
11e40 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20 20  ( pNextTo ){.   
11e50 20 61 73 73 65 72 74 28 20 70 4e 65 78 74 54 6f   assert( pNextTo
11e60 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b 0a  ->pPrevTo==0 );.
11e70 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74      pFKey->pNext
11e80 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20 20  To = pNextTo;.  
11e90 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76    pNextTo->pPrev
11ea0 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d 0a  To = pFKey;.  }.
11eb0 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66  .  /* Link the f
11ec0 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68  oreign key to th
11ed0 65 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c  e table as the l
11ee0 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20  ast step..  */. 
11ef0 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65   p->pFKey = pFKe
11f00 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a  y;.  pFKey = 0;.
11f10 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74  .fk_end:.  sqlit
11f20 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 46 4b  e3DbFree(db, pFK
11f30 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21  ey);.#endif /* !
11f40 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
11f50 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29  MIT_FOREIGN_KEY)
11f60 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
11f70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
11f80 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c  pFromCol);.  sql
11f90 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
11fa0 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a  te(db, pToCol);.
11fb0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
11fc0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
11fd0 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c  when an INITIALL
11fe0 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49  Y IMMEDIATE or I
11ff0 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
12000 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73  D.** clause is s
12010 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61  een as part of a
12020 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
12030 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73  inition.  The is
12040 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61  Deferred.** para
12050 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72 20 49  meter is 1 for I
12060 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
12070 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54  D and 0 for INIT
12080 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e  IALLY IMMEDIATE.
12090 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72  .** The behavior
120a0 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
120b0 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f  ently created fo
120c0 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a  reign key is adj
120d0 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69  usted.** accordi
120e0 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ngly..*/.void sq
120f0 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67  lite3DeferForeig
12100 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72  nKey(Parse *pPar
12110 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72  se, int isDeferr
12120 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ed){.#ifndef SQL
12130 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
12140 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54  _KEY.  Table *pT
12150 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  ab;.  FKey *pFKe
12160 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d  y;.  if( (pTab =
12170 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
12180 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79  le)==0 || (pFKey
12190 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d   = pTab->pFKey)=
121a0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
121b0 73 73 65 72 74 28 20 69 73 44 65 66 65 72 72 65  ssert( isDeferre
121c0 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65 72 72  d==0 || isDeferr
121d0 65 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a 20  ed==1 ); /* EV: 
121e0 52 2d 33 30 33 32 33 2d 32 31 39 31 37 20 2a 2f  R-30323-21917 */
121f0 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65  .  pFKey->isDefe
12200 72 72 65 64 20 3d 20 28 75 38 29 69 73 44 65 66  rred = (u8)isDef
12210 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a  erred;.#endif.}.
12220 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
12230 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
12240 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20  rase and refill 
12250 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68  index *pIdx.  Th
12260 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  is is.** used to
12270 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65   initialize a ne
12280 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 65  wly created inde
12290 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74  x or to recomput
122a0 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  e the.** content
122b0 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20   of an index in 
122c0 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45  response to a RE
122d0 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  INDEX command..*
122e0 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50  *.** if memRootP
122f0 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74  age is not negat
12300 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ive, it means th
12310 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  at the index is 
12320 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64  newly.** created
12330 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72 20  .  The register 
12340 73 70 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d  specified by mem
12350 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e  RootPage contain
12360 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61  s the.** root pa
12370 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
12380 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52   index.  If memR
12390 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61 74  ootPage is negat
123a0 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ive, then.** the
123b0 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65   index already e
123c0 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62  xists and must b
123d0 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65  e cleared before
123e0 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20   being refilled 
123f0 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20  and.** the root 
12400 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
12410 68 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65  he index is take
12420 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74  n from pIndex->t
12430 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  num..*/.static v
12440 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c  oid sqlite3Refil
12450 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  lIndex(Parse *pP
12460 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e  arse, Index *pIn
12470 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74  dex, int memRoot
12480 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Page){.  Table *
12490 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70  pTab = pIndex->p
124a0 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74  Table;  /* The t
124b0 61 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64  able that is ind
124c0 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  exed */.  int iT
124d0 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
124e0 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65  b++;     /* Btre
124f0 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f  e cursor used fo
12500 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20  r pTab */.  int 
12510 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iIdx = pParse->n
12520 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74  Tab++;     /* Bt
12530 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  ree cursor used 
12540 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20  for pIndex */.  
12550 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20  int addr1;      
12560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12570 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70  * Address of top
12580 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e   of loop */.  in
12590 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20  t tnum;         
125a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
125b0 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64  Root page of ind
125c0 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ex */.  Vdbe *v;
125d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125e0 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
125f0 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
12600 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
12610 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  e */.  KeyInfo *
12620 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  pKey;           
12630 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f        /* KeyInfo
12640 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20   for index */.  
12650 69 6e 74 20 72 65 67 49 64 78 4b 65 79 3b 20 20  int regIdxKey;  
12660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12670 2a 20 52 65 67 69 73 74 65 72 73 20 63 6f 6e 74  * Registers cont
12680 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78  aining the index
12690 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 72 65   key */.  int re
126a0 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20  gRecord;        
126b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
126c0 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73 73  ster holding ass
126d0 65 6d 62 6c 69 65 64 20 69 6e 64 65 78 20 72 65  emblied index re
126e0 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  cord */.  sqlite
126f0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
12700 64 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  db;      /* The 
12710 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
12720 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ion */.  int iDb
12730 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
12740 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  ToIndex(db, pInd
12750 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23  ex->pSchema);..#
12760 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12770 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
12780 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
12790 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
127a0 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20  SQLITE_REINDEX, 
127b0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
127c0 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  ,.      db->aDb[
127d0 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a  iDb].zName ) ){.
127e0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
127f0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71  #endif..  /* Req
12800 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63  uire a write-loc
12810 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  k on the table t
12820 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f  o perform this o
12830 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  peration */.  sq
12840 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
12850 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
12860 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d  ->tnum, 1, pTab-
12870 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20  >zName);..  v = 
12880 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
12890 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
128a0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
128b0 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d  f( memRootPage>=
128c0 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20  0 ){.    tnum = 
128d0 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d  memRootPage;.  }
128e0 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d  else{.    tnum =
128f0 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20   pIndex->tnum;. 
12900 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12910 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72  dOp2(v, OP_Clear
12920 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  , tnum, iDb);.  
12930 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74  }.  pKey = sqlit
12940 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70  e3IndexKeyinfo(p
12950 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a  Parse, pIndex);.
12960 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12970 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  Op4(v, OP_OpenWr
12980 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c  ite, iIdx, tnum,
12990 20 69 44 62 2c 20 0a 20 20 20 20 20 20 20 20 20   iDb, .         
129a0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
129b0 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49   *)pKey, P4_KEYI
129c0 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
129d0 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e  if( memRootPage>
129e0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
129f0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
12a00 20 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   1);.  }.  sqlit
12a10 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
12a20 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70  se, iTab, iDb, p
12a30 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
12a40 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  );.  addr1 = sql
12a50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12a60 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61  , OP_Rewind, iTa
12a70 62 2c 20 30 29 3b 0a 20 20 72 65 67 52 65 63 6f  b, 0);.  regReco
12a80 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
12a90 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
12aa0 20 20 72 65 67 49 64 78 4b 65 79 20 3d 20 73 71    regIdxKey = sq
12ab0 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64  lite3GenerateInd
12ac0 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49  exKey(pParse, pI
12ad0 6e 64 65 78 2c 20 69 54 61 62 2c 20 72 65 67 52  ndex, iTab, regR
12ae0 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20 69 66 28  ecord, 1);.  if(
12af0 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
12b00 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20  !=OE_None ){.   
12b10 20 63 6f 6e 73 74 20 69 6e 74 20 72 65 67 52 6f   const int regRo
12b20 77 69 64 20 3d 20 72 65 67 49 64 78 4b 65 79 20  wid = regIdxKey 
12b30 2b 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  + pIndex->nColum
12b40 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  n;.    const int
12b50 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j2 = sqlite3Vdb
12b60 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
12b70 2b 20 32 3b 0a 20 20 20 20 76 6f 69 64 20 2a 20  + 2;.    void * 
12b80 63 6f 6e 73 74 20 70 52 65 67 4b 65 79 20 3d 20  const pRegKey = 
12b90 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
12ba0 52 28 72 65 67 49 64 78 4b 65 79 29 3b 0a 0a 20  R(regIdxKey);.. 
12bb0 20 20 20 2f 2a 20 54 68 65 20 72 65 67 69 73 74     /* The regist
12bc0 65 72 73 20 61 63 63 65 73 73 65 64 20 62 79 20  ers accessed by 
12bd0 74 68 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 20  the OP_IsUnique 
12be0 6f 70 63 6f 64 65 20 77 65 72 65 20 61 6c 6c 6f  opcode were allo
12bf0 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 75 73 69  cated.    ** usi
12c00 6e 67 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  ng sqlite3GetTem
12c10 70 52 61 6e 67 65 28 29 20 69 6e 73 69 64 65 20  pRange() inside 
12c20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 47 65  of the sqlite3Ge
12c30 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 29  nerateIndexKey()
12c40 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f  .    ** call abo
12c50 76 65 2e 20 4a 75 73 74 20 62 65 66 6f 72 65 20  ve. Just before 
12c60 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 77 61  that function wa
12c70 73 20 66 72 65 65 64 20 74 68 65 79 20 77 65 72  s freed they wer
12c80 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a  e released.    *
12c90 2a 20 28 6d 61 64 65 20 61 76 61 69 6c 61 62 6c  * (made availabl
12ca0 65 20 74 6f 20 74 68 65 20 63 6f 6d 70 69 6c 65  e to the compile
12cb0 72 20 66 6f 72 20 72 65 75 73 65 29 20 75 73 69  r for reuse) usi
12cc0 6e 67 20 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  ng .    ** sqlit
12cd0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
12ce0 67 65 28 29 2e 20 53 6f 20 69 6e 20 73 6f 6d 65  ge(). So in some
12cf0 20 77 61 79 73 20 68 61 76 69 6e 67 20 74 68 65   ways having the
12d00 20 4f 50 5f 49 73 55 6e 69 71 75 65 0a 20 20 20   OP_IsUnique.   
12d10 20 2a 2a 20 6f 70 63 6f 64 65 20 75 73 65 20 74   ** opcode use t
12d20 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  he values stored
12d30 20 77 69 74 68 69 6e 20 73 65 65 6d 73 20 64 61   within seems da
12d40 6e 67 65 72 6f 75 73 2e 20 48 6f 77 65 76 65 72  ngerous. However
12d50 2c 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20 77  , since.    ** w
12d60 65 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68  e can be sure th
12d70 61 74 20 6e 6f 20 6f 74 68 65 72 20 74 65 6d 70  at no other temp
12d80 20 72 65 67 69 73 74 65 72 73 20 68 61 76 65 20   registers have 
12d90 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 20  been allocated. 
12da0 20 20 20 2a 2a 20 73 69 6e 63 65 20 73 71 6c 69     ** since sqli
12db0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
12dc0 6e 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64  nge() was called
12dd0 2c 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  , it is safe to 
12de0 64 6f 20 73 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20  do so..    */.  
12df0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12e00 4f 70 34 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71  Op4(v, OP_IsUniq
12e10 75 65 2c 20 69 49 64 78 2c 20 6a 32 2c 20 72 65  ue, iIdx, j2, re
12e20 67 52 6f 77 69 64 2c 20 70 52 65 67 4b 65 79 2c  gRowid, pRegKey,
12e30 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20   P4_INT32);.    
12e40 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
12e50 72 61 69 6e 74 28 0a 20 20 20 20 20 20 20 20 70  raint(.        p
12e60 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c  Parse, OE_Abort,
12e70 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e   "indexed column
12e80 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65  s are not unique
12e90 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  ", P4_STATIC);. 
12ea0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
12eb0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
12ec0 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72 65  Insert, iIdx, re
12ed0 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
12ee0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
12ef0 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
12f00 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69  KRESULT);.  sqli
12f10 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
12f20 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
12f30 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ord);.  sqlite3V
12f40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12f50 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
12f60 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  1+1);.  sqlite3V
12f70 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
12f80 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddr1);.  sqlite3
12f90 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
12fa0 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20  _Close, iTab);. 
12fb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12fc0 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
12fd0 69 49 64 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iIdx);.}../*.** 
12fe0 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64  Create a new ind
12ff0 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61  ex for an SQL ta
13000 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61  ble.  pName1.pNa
13010 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20  me2 is the name 
13020 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a  of the index .**
13030 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73   and pTblList is
13040 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
13050 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
13060 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42  o be indexed.  B
13070 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20  oth will .** be 
13080 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61  NULL for a prima
13090 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64  ry key or an ind
130a0 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74  ex that is creat
130b0 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a  ed to satisfy a.
130c0 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  ** UNIQUE constr
130d0 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65  aint.  If pTable
130e0 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20   and pIndex are 
130f0 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65  NULL, use pParse
13100 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61  ->pNewTable.** a
13110 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  s the table to b
13120 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72  e indexed.  pPar
13130 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73  se->pNewTable is
13140 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73   a table that is
13150 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65  .** currently be
13160 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ing constructed 
13170 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  by a CREATE TABL
13180 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
13190 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  ** pList is a li
131a0 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
131b0 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c   be indexed.  pL
131c0 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ist will be NULL
131d0 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61   if this.** is a
131e0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
131f0 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e  unique-constrain
13200 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  t on the most re
13210 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  cent column adde
13220 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c  d.** to the tabl
13230 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
13240 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
13250 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69   .**.** If the i
13260 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20  ndex is created 
13270 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 72 65  successfully, re
13280 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
13290 6f 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 0a  o the new Index.
132a0 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 54 68  ** structure. Th
132b0 69 73 20 69 73 20 75 73 65 64 20 62 79 20 73 71  is is used by sq
132c0 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b  lite3AddPrimaryK
132d0 65 79 28 29 20 74 6f 20 6d 61 72 6b 20 74 68 65  ey() to mark the
132e0 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 74 68 65   index.** as the
132f0 20 74 61 62 6c 65 73 20 70 72 69 6d 61 72 79 20   tables primary 
13300 6b 65 79 20 28 49 6e 64 65 78 2e 61 75 74 6f 49  key (Index.autoI
13310 6e 64 65 78 3d 3d 32 29 2e 0a 2a 2f 0a 49 6e 64  ndex==2)..*/.Ind
13320 65 78 20 2a 73 71 6c 69 74 65 33 43 72 65 61 74  ex *sqlite3Creat
13330 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  eIndex(.  Parse 
13340 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
13350 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  All information 
13360 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65  about this parse
13370 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
13380 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69 72 73  me1,     /* Firs
13390 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20  t part of index 
133a0 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c  name. May be NUL
133b0 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  L */.  Token *pN
133c0 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53 65 63  ame2,     /* Sec
133d0 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65  ond part of inde
133e0 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
133f0 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ULL */.  SrcList
13400 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54   *pTblName, /* T
13410 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55  able to index. U
13420 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
13430 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45  able if 0 */.  E
13440 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
13450 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63    /* A list of c
13460 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
13470 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
13480 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20  Error,       /* 
13490 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e  OE_Abort, OE_Ign
134a0 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c  ore, OE_Replace,
134b0 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20   or OE_None */. 
134c0 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20   Token *pStart, 
134d0 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54      /* The CREAT
134e0 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
134f0 69 6e 73 20 74 68 69 73 20 73 74 61 74 65 6d 65  ins this stateme
13500 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nt */.  Token *p
13510 45 6e 64 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  End,       /* Th
13520 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65  e ")" that close
13530 73 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44  s the CREATE IND
13540 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EX statement */.
13550 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c    int sortOrder,
13560 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64       /* Sort ord
13570 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65  er of primary ke
13580 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55  y when pList==NU
13590 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f  LL */.  int ifNo
135a0 74 45 78 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d  tExist     /* Om
135b0 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65  it error if inde
135c0 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
135d0 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
135e0 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a  pRet = 0;     /*
135f0 20 50 6f 69 6e 74 65 72 20 74 6f 20 72 65 74 75   Pointer to retu
13600 72 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  rn */.  Table *p
13610 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Tab = 0;     /* 
13620 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  Table to be inde
13630 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  xed */.  Index *
13640 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a  pIndex = 0;   /*
13650 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
13660 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68   created */.  ch
13670 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20  ar *zName = 0;  
13680 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
13690 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  e index */.  int
136a0 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
136b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
136c0 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61  haracters in zNa
136d0 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  me */.  int i, j
136e0 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64  ;.  Token nullId
136f0 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65  ;        /* Fake
13700 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d   token for an em
13710 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20  pty ID list */. 
13720 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20   DbFixer sFix;  
13730 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73        /* For ass
13740 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20  igning database 
13750 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20  names to pTable 
13760 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
13770 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74  erMask;   /* 1 t
13780 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20  o honor DESC in 
13790 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e  index.  0 to ign
137a0 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ore. */.  sqlite
137b0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
137c0 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20  db;.  Db *pDb;  
137d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
137e0 65 20 73 70 65 63 69 66 69 63 20 74 61 62 6c 65  e specific table
137f0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
13800 69 6e 64 65 78 65 64 20 64 61 74 61 62 61 73 65  indexed database
13810 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
13820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
13830 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
13840 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e  ase that is bein
13850 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54  g written */.  T
13860 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b  oken *pName = 0;
13870 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
13880 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  ed name of the i
13890 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a  ndex to create *
138a0 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  /.  struct ExprL
138b0 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49  ist_item *pListI
138c0 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  tem; /* For loop
138d0 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a  ing over pList *
138e0 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20  /.  int nCol;.  
138f0 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a  int nExtra = 0;.
13900 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a    char *zExtra;.
13910 0a 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72  .  assert( pStar
13920 74 3d 3d 30 20 7c 7c 20 70 45 6e 64 21 3d 30 20  t==0 || pEnd!=0 
13930 29 3b 20 2f 2a 20 70 45 6e 64 20 6d 75 73 74 20  ); /* pEnd must 
13940 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 70  be non-NULL if p
13950 53 74 61 72 74 20 69 73 20 2a 2f 0a 20 20 61 73  Start is */.  as
13960 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
13970 72 72 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  rr==0 );      /*
13980 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69   Never called wi
13990 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20  th prior errors 
139a0 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  */.  if( db->mal
139b0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49 4e 5f  locFailed || IN_
139c0 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a  DECLARE_VTAB ){.
139d0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
139e0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
139f0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
13a00 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
13a10 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
13a20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
13a30 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20  te_index;.  }.. 
13a40 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
13a50 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
13a60 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
13a70 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20  Return early if 
13a80 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a  not found..  */.
13a90 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d    if( pTblName!=
13aa0 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65  0 ){..    /* Use
13ab0 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e   the two-part in
13ac0 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65  dex name to dete
13ad0 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62 61  rmine the databa
13ae0 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65  se .    ** to se
13af0 61 72 63 68 20 66 6f 72 20 74 68 65 20 74 61 62  arch for the tab
13b00 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20 74 61  le. 'Fix' the ta
13b10 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73  ble name to this
13b20 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72   db.    ** befor
13b30 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65  e looking up the
13b40 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20   table..    */. 
13b50 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
13b60 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20  1 && pName2 );. 
13b70 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
13b80 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
13b90 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
13ba0 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20  e2, &pName);.   
13bb0 20 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74   if( iDb<0 ) got
13bc0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
13bd0 64 65 78 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  dex;..#ifndef SQ
13be0 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42  LITE_OMIT_TEMPDB
13bf0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
13c00 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e  ndex name was un
13c10 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b  qualified, check
13c20 20 69 66 20 74 68 65 20 74 68 65 20 74 61 62 6c   if the the tabl
13c30 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65  e.    ** is a te
13c40 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c  mp table. If so,
13c50 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73   set the databas
13c60 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64  e to 1. Do not d
13c70 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 66  o this.    ** if
13c80 20 69 6e 69 74 69 61 6c 69 73 69 6e 67 20 61 20   initialising a 
13c90 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
13ca0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
13cb0 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
13cc0 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 73  {.      pTab = s
13cd0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f  qlite3SrcListLoo
13ce0 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c  kup(pParse, pTbl
13cf0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
13d00 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26   pName2->n==0 &&
13d10 20 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70   pTab && pTab->p
13d20 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b  Schema==db->aDb[
13d30 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  1].pSchema ){.  
13d40 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20        iDb = 1;. 
13d50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
13d60 64 69 66 0a 0a 20 20 20 20 69 66 28 20 73 71 6c  dif..    if( sql
13d70 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69  ite3FixInit(&sFi
13d80 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20  x, pParse, iDb, 
13d90 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 20  "index", pName) 
13da0 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  &&.        sqlit
13db0 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73 46  e3FixSrcList(&sF
13dc0 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20  ix, pTblName).  
13dd0 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65    ){.      /* Be
13de0 63 61 75 73 65 20 74 68 65 20 70 61 72 73 65 72  cause the parser
13df0 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c   constructs pTbl
13e00 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67  Name from a sing
13e10 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20  le identifier,. 
13e20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46       ** sqlite3F
13e30 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65  ixSrcList can ne
13e40 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20  ver fail. */.   
13e50 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
13e60 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73    }.    pTab = s
13e70 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
13e80 65 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54 62  e(pParse, 0, pTb
13e90 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  lName->a[0].zNam
13ea0 65 2c 20 0a 20 20 20 20 20 20 20 20 70 54 62 6c  e, .        pTbl
13eb0 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
13ec0 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21  base);.    if( !
13ed0 70 54 61 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  pTab || db->mall
13ee0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
13ef0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
13f00 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  x;.    assert( d
13f10 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
13f20 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
13f30 6d 61 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ma );.  }else{. 
13f40 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
13f50 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20  ==0 );.    pTab 
13f60 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
13f70 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 21 70 54  ble;.    if( !pT
13f80 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  ab ) goto exit_c
13f90 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
13fa0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
13fb0 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
13fc0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
13fd0 20 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62 2d    }.  pDb = &db-
13fe0 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 61 73  >aDb[iDb];..  as
13ff0 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
14000 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
14010 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20  e->nErr==0 );.  
14020 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
14030 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  Cmp(pTab->zName,
14040 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d   "sqlite_", 7)==
14050 30 20 0a 20 20 20 20 20 20 20 26 26 20 6d 65 6d  0 .       && mem
14060 63 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65  cmp(&pTab->zName
14070 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c  [7],"altertab_",
14080 39 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  9)!=0 ){.    sql
14090 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
140a0 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
140b0 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
140c0 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
140d0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
140e0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
140f0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
14100 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28  _OMIT_VIEW.  if(
14110 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
14120 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
14130 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
14140 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  iews may not be 
14150 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67  indexed");.    g
14160 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
14170 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69  index;.  }.#endi
14180 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
14190 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
141a0 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  LE.  if( IsVirtu
141b0 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
141c0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
141d0 70 50 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c  pParse, "virtual
141e0 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20   tables may not 
141f0 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20  be indexed");.  
14200 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
14210 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65  te_index;.  }.#e
14220 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ndif..  /*.  ** 
14230 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66  Find the name of
14240 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b   the index.  Mak
14250 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
14260 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74  not already anot
14270 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  her.  ** index o
14280 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  r table with the
14290 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20   same name.  .  
142a0 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f  **.  ** Exceptio
142b0 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65  n:  If we are re
142c0 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20  ading the names 
142d0 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64  of permanent ind
142e0 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  ices from the.  
142f0 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ** sqlite_master
14300 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20   table (because 
14310 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
14320 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73  ss changed the s
14330 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20  chema) and.  ** 
14340 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  one of the index
14350 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20   names collides 
14360 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66  with the name of
14370 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
14380 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78  le or.  ** index
14390 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63  , then we will c
143a0 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65  ontinue to proce
143b0 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  ss this index.. 
143c0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d   **.  ** If pNam
143d0 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
143e0 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64  at we are.  ** d
143f0 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72  ealing with a pr
14400 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49  imary key or UNI
14410 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
14420 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65   We have to inve
14430 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20  nt our.  ** own 
14440 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  name..  */.  if(
14450 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e   pName ){.    zN
14460 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
14470 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
14480 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  Name);.    if( z
14490 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65  Name==0 ) goto e
144a0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
144b0 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
144c0 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63  _OK!=sqlite3Chec
144d0 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72  kObjectName(pPar
144e0 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  se, zName) ){.  
144f0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
14500 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
14510 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  }.    if( !db->i
14520 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
14530 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
14540 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
14550 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  , 0)!=0 ){.     
14560 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14570 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72  sg(pParse, "ther
14580 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74  e is already a t
14590 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20  able named %s", 
145a0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
145b0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
145c0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
145d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
145e0 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
145f0 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a  b, zName, pDb->z
14600 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
14610 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73    if( !ifNotExis
14620 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
14630 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14640 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61  rse, "index %s a
14650 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
14660 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
14670 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
14680 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
14690 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
146a0 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65   int n;.    Inde
146b0 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f  x *pLoop;.    fo
146c0 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49  r(pLoop=pTab->pI
146d0 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70  ndex, n=1; pLoop
146e0 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
146f0 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  Next, n++){}.   
14700 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
14710 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c  MPrintf(db, "sql
14720 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73  ite_autoindex_%s
14730 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  _%d", pTab->zNam
14740 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a  e, n);.    if( z
14750 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
14760 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
14770 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
14780 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66   }..  /* Check f
14790 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  or authorization
147a0 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e   to create an in
147b0 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  dex..  */.#ifnde
147c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
147d0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
147e0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
147f0 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65  zDb = pDb->zName
14800 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
14810 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
14820 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
14830 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
14840 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  Db), 0, zDb) ){.
14850 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
14860 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
14870 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49    }.    i = SQLI
14880 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b  TE_CREATE_INDEX;
14890 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  .    if( !OMIT_T
148a0 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
148b0 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ) i = SQLITE_CRE
148c0 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a  ATE_TEMP_INDEX;.
148d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
148e0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
148f0 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d   i, zName, pTab-
14900 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
14910 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
14920 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
14930 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
14940 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30    /* If pList==0
14950 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  , it means this 
14960 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
14970 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69  ed to make a pri
14980 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75  mary.  ** key ou
14990 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f  t of the last co
149a0 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68  lumn added to th
149b0 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
149c0 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a  nstruction..  **
149d0 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b   So create a fak
149e0 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61  e list to simula
149f0 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20  te this..  */.  
14a00 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
14a10 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70      nullId.z = p
14a20 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e  Tab->aCol[pTab->
14a30 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20  nCol-1].zName;. 
14a40 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 71     nullId.n = sq
14a50 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 28 63  lite3Strlen30((c
14a60 68 61 72 2a 29 6e 75 6c 6c 49 64 2e 7a 29 3b 0a  har*)nullId.z);.
14a70 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
14a80 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
14a90 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b  d(pParse, 0, 0);
14aa0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
14ab0 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
14ac0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
14ad0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
14ae0 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  etName(pParse, p
14af0 4c 69 73 74 2c 20 26 6e 75 6c 6c 49 64 2c 20 30  List, &nullId, 0
14b00 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  );.    pList->a[
14b10 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 28  0].sortOrder = (
14b20 75 38 29 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  u8)sortOrder;.  
14b30 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  }..  /* Figure o
14b40 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65  ut how many byte
14b50 73 20 6f 66 20 73 70 61 63 65 20 61 72 65 20 72  s of space are r
14b60 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65  equired to store
14b70 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a   explicitly.  **
14b80 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 6c 61   specified colla
14b90 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
14ba0 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  mes..  */.  for(
14bb0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
14bc0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
14bd0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69  xpr *pExpr = pLi
14be0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
14bf0 20 20 20 20 69 66 28 20 70 45 78 70 72 20 29 7b      if( pExpr ){
14c00 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
14c10 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70  pColl = pExpr->p
14c20 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 2f 2a 20 45  Coll;.      /* E
14c30 69 74 68 65 72 20 70 43 6f 6c 6c 21 3d 30 20 6f  ither pColl!=0 o
14c40 72 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 4f  r there was an O
14c50 4f 4d 20 66 61 69 6c 75 72 65 2e 20 20 42 75 74  OM failure.  But
14c60 20 69 66 20 61 6e 20 4f 4f 4d 0a 20 20 20 20 20   if an OOM.     
14c70 20 2a 2a 20 66 61 69 6c 75 72 65 20 77 65 20 68   ** failure we h
14c80 61 76 65 20 71 75 69 74 20 62 65 66 6f 72 65 20  ave quit before 
14c90 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 70 6f  reaching this po
14ca0 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  int. */.      if
14cb0 28 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20  ( ALWAYS(pColl) 
14cc0 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 78 74 72  ){.        nExtr
14cd0 61 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74 65  a += (1 + sqlite
14ce0 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d  3Strlen30(pColl-
14cf0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
14d00 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
14d10 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  * .  ** Allocate
14d20 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63   the index struc
14d30 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e  ture. .  */.  nN
14d40 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
14d50 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20  len30(zName);.  
14d60 6e 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  nCol = pList->nE
14d70 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20  xpr;.  pIndex = 
14d80 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
14d90 65 72 6f 28 64 62 2c 20 0a 20 20 20 20 20 20 73  ero(db, .      s
14da0 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 20  izeof(Index) +  
14db0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14dc0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 20  ndex structure  
14dd0 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
14de0 69 6e 74 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20  int)*nCol +     
14df0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
14e00 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20  iColumn   */.   
14e10 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28     sizeof(int)*(
14e20 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20 20 20  nCol+1) +       
14e30 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73  /* Index.aiRowEs
14e40 74 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a  t   */.      siz
14e50 65 6f 66 28 63 68 61 72 20 2a 29 2a 6e 43 6f 6c  eof(char *)*nCol
14e60 20 2b 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64   +        /* Ind
14e70 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f  ex.azColl     */
14e80 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38  .      sizeof(u8
14e90 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20  )*nCol +        
14ea0 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f      /* Index.aSo
14eb0 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20  rtOrder */.     
14ec0 20 6e 4e 61 6d 65 20 2b 20 31 20 2b 20 20 20 20   nName + 1 +    
14ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14ee0 20 49 6e 64 65 78 2e 7a 4e 61 6d 65 20 20 20 20   Index.zName    
14ef0 20 20 2a 2f 0a 20 20 20 20 20 20 6e 45 78 74 72    */.      nExtr
14f00 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a               
14f10 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
14f20 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
14f30 6d 65 73 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66  mes */.  );.  if
14f40 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
14f50 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  ed ){.    goto e
14f60 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
14f70 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 2d 3e  ;.  }.  pIndex->
14f80 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a  azColl = (char**
14f90 29 28 26 70 49 6e 64 65 78 5b 31 5d 29 3b 0a 20  )(&pIndex[1]);. 
14fa0 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
14fb0 6e 20 3d 20 28 69 6e 74 20 2a 29 28 26 70 49 6e  n = (int *)(&pIn
14fc0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c  dex->azColl[nCol
14fd0 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69  ]);.  pIndex->ai
14fe0 52 6f 77 45 73 74 20 3d 20 28 75 6e 73 69 67 6e  RowEst = (unsign
14ff0 65 64 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61  ed *)(&pIndex->a
15000 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 5d 29 3b 0a  iColumn[nCol]);.
15010 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f    pIndex->aSortO
15020 72 64 65 72 20 3d 20 28 75 38 20 2a 29 28 26 70  rder = (u8 *)(&p
15030 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 5b  Index->aiRowEst[
15040 6e 43 6f 6c 2b 31 5d 29 3b 0a 20 20 70 49 6e 64  nCol+1]);.  pInd
15050 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61  ex->zName = (cha
15060 72 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 53  r *)(&pIndex->aS
15070 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 29 3b  ortOrder[nCol]);
15080 0a 20 20 7a 45 78 74 72 61 20 3d 20 28 63 68 61  .  zExtra = (cha
15090 72 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 7a 4e  r *)(&pIndex->zN
150a0 61 6d 65 5b 6e 4e 61 6d 65 2b 31 5d 29 3b 0a 20  ame[nName+1]);. 
150b0 20 6d 65 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e   memcpy(pIndex->
150c0 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  zName, zName, nN
150d0 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78  ame+1);.  pIndex
150e0 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b  ->pTable = pTab;
150f0 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  .  pIndex->nColu
15100 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  mn = pList->nExp
15110 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  r;.  pIndex->onE
15120 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72 72  rror = (u8)onErr
15130 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75  or;.  pIndex->au
15140 74 6f 49 6e 64 65 78 20 3d 20 28 75 38 29 28 70  toIndex = (u8)(p
15150 4e 61 6d 65 3d 3d 30 29 3b 0a 20 20 70 49 6e 64  Name==0);.  pInd
15160 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62  ex->pSchema = db
15170 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
15180 6d 61 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ma;.  assert( sq
15190 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
151a0 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
151b0 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
151c0 74 6f 20 73 65 65 20 69 66 20 77 65 20 73 68 6f  to see if we sho
151d0 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72  uld honor DESC r
151e0 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78  equests on index
151f0 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20   columns.  */.  
15200 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
15210 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  ->file_format>=4
15220 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65   ){.    sortOrde
15230 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a  rMask = -1;   /*
15240 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20   Honor DESC */. 
15250 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74   }else{.    sort
15260 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20  OrderMask = 0;  
15270 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43    /* Ignore DESC
15280 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63   */.  }..  /* Sc
15290 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  an the names of 
152a0 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
152b0 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
152c0 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20  ndexed and.  ** 
152d0 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20  load the column 
152e0 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65  indices into the
152f0 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
15300 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  .  Report an err
15310 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63  or.  ** if any c
15320 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75  olumn is not fou
15330 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f  nd..  **.  ** TO
15340 44 4f 3a 20 20 41 64 64 20 61 20 74 65 73 74 20  DO:  Add a test 
15350 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
15360 74 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d  t the same colum
15370 6e 20 69 73 20 6e 6f 74 20 6e 61 6d 65 64 0a 20  n is not named. 
15380 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   ** more than on
15390 63 65 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  ce within the sa
153a0 6d 65 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20  me index.  Only 
153b0 74 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e  the first instan
153c0 63 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63  ce of.  ** the c
153d0 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65 72 20  olumn will ever 
153e0 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20 6f  be used by the o
153f0 70 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74 65 20  ptimizer.  Note 
15400 74 68 61 74 20 75 73 69 6e 67 20 74 68 65 0a 20  that using the. 
15410 20 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20   ** same column 
15420 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 63  more than once c
15430 61 6e 6e 6f 74 20 62 65 20 61 6e 20 65 72 72 6f  annot be an erro
15440 72 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77  r because that w
15450 6f 75 6c 64 20 0a 20 20 2a 2a 20 62 72 65 61 6b  ould .  ** break
15460 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
15470 74 69 62 69 6c 69 74 79 20 2d 20 69 74 20 6e 65  tibility - it ne
15480 65 64 73 20 74 6f 20 62 65 20 61 20 77 61 72 6e  eds to be a warn
15490 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ing..  */.  for(
154a0 69 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70  i=0, pListItem=p
154b0 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74  List->a; i<pList
154c0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c  ->nExpr; i++, pL
154d0 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  istItem++){.    
154e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
154f0 4e 61 6d 65 20 3d 20 70 4c 69 73 74 49 74 65 6d  Name = pListItem
15500 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c  ->zName;.    Col
15510 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20  umn *pTabCol;.  
15520 20 20 69 6e 74 20 72 65 71 75 65 73 74 65 64 53    int requestedS
15530 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 63 68  ortOrder;.    ch
15540 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20  ar *zColl;      
15550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15560 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  Collation sequen
15570 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20  ce name */..    
15580 66 6f 72 28 6a 3d 30 2c 20 70 54 61 62 43 6f 6c  for(j=0, pTabCol
15590 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70  =pTab->aCol; j<p
155a0 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20  Tab->nCol; j++, 
155b0 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  pTabCol++){.    
155c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
155d0 49 43 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70  ICmp(zColName, p
155e0 54 61 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d  TabCol->zName)==
155f0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
15600 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62  .    if( j>=pTab
15610 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
15620 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15630 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
15640 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20  s has no column 
15650 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20  named %s",.     
15660 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20     pTab->zName, 
15670 7a 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20  zColName);.     
15680 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63   pParse->checkSc
15690 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20  hema = 1;.      
156a0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
156b0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
156c0 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
156d0 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 2f  mn[i] = j;.    /
156e0 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f 6e 20  * Justification 
156f0 6f 66 20 74 68 65 20 41 4c 57 41 59 53 28 70 4c  of the ALWAYS(pL
15700 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  istItem->pExpr->
15710 70 43 6f 6c 6c 29 3a 20 20 42 65 63 61 75 73 65  pColl):  Because
15720 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 77   of.    ** the w
15730 61 79 20 74 68 65 20 22 69 64 78 6c 69 73 74 22  ay the "idxlist"
15740 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 69 73   non-terminal is
15750 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
15760 74 68 65 20 70 61 72 73 65 72 2c 0a 20 20 20 20  the parser,.    
15770 2a 2a 20 69 66 20 70 4c 69 73 74 49 74 65 6d 2d  ** if pListItem-
15780 3e 70 45 78 70 72 20 69 73 20 6e 6f 74 20 6e 75  >pExpr is not nu
15790 6c 6c 20 74 68 65 6e 20 65 69 74 68 65 72 20 70  ll then either p
157a0 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d  ListItem->pExpr-
157b0 3e 70 43 6f 6c 6c 0a 20 20 20 20 2a 2a 20 6d 75  >pColl.    ** mu
157c0 73 74 20 65 78 69 73 74 20 6f 72 20 65 6c 73 65  st exist or else
157d0 20 74 68 65 72 65 20 6d 75 73 74 20 68 61 76 65   there must have
157e0 20 62 65 65 6e 20 61 6e 20 4f 4f 4d 20 65 72 72   been an OOM err
157f0 6f 72 2e 20 20 42 75 74 20 69 66 20 74 68 65 72  or.  But if ther
15800 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 61 6e 20  e.    ** was an 
15810 4f 4f 4d 20 65 72 72 6f 72 2c 20 77 65 20 77 6f  OOM error, we wo
15820 75 6c 64 20 6e 65 76 65 72 20 72 65 61 63 68 20  uld never reach 
15830 74 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20  this point. */. 
15840 20 20 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d     if( pListItem
15850 2d 3e 70 45 78 70 72 20 26 26 20 41 4c 57 41 59  ->pExpr && ALWAY
15860 53 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  S(pListItem->pEx
15870 70 72 2d 3e 70 43 6f 6c 6c 29 20 29 7b 0a 20 20  pr->pColl) ){.  
15880 20 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20      int nColl;. 
15890 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69       zColl = pLi
158a0 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70  stItem->pExpr->p
158b0 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Coll->zName;.   
158c0 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     nColl = sqlit
158d0 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c  e3Strlen30(zColl
158e0 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 61 73 73  ) + 1;.      ass
158f0 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f  ert( nExtra>=nCo
15900 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  ll );.      memc
15910 70 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c  py(zExtra, zColl
15920 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , nColl);.      
15930 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a  zColl = zExtra;.
15940 20 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20        zExtra += 
15950 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78  nColl;.      nEx
15960 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20  tra -= nColl;.  
15970 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
15980 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Coll = pTab->aCo
15990 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[j].zColl;.    
159a0 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 7b 0a    if( !zColl ){.
159b0 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20          zColl = 
159c0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 2d 3e 7a  db->pDfltColl->z
159d0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Name;.      }.  
159e0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d    }.    if( !db-
159f0 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21 73  >init.busy && !s
15a00 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
15a10 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
15a20 6c 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  l) ){.      goto
15a30 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
15a40 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
15a50 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20  ndex->azColl[i] 
15a60 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71  = zColl;.    req
15a70 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 20  uestedSortOrder 
15a80 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72  = pListItem->sor
15a90 74 4f 72 64 65 72 20 26 20 73 6f 72 74 4f 72 64  tOrder & sortOrd
15aa0 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64  erMask;.    pInd
15ab0 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ex->aSortOrder[i
15ac0 5d 20 3d 20 28 75 38 29 72 65 71 75 65 73 74 65  ] = (u8)requeste
15ad0 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a  dSortOrder;.  }.
15ae0 20 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74    sqlite3Default
15af0 52 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a  RowEst(pIndex);.
15b00 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61  .  if( pTab==pPa
15b10 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29  rse->pNewTable )
15b20 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f  {.    /* This ro
15b30 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63  utine has been c
15b40 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
15b50 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
15b60 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72  ex as a.    ** r
15b70 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41  esult of a PRIMA
15b80 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
15b90 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c   clause on a col
15ba0 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20  umn definition, 
15bb0 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d  or.    ** a PRIM
15bc0 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
15bd0 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69  E clause followi
15be0 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65  ng the column de
15bf0 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a  finitions..    *
15c00 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20  * i.e. one of:. 
15c10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45     **.    ** CRE
15c20 41 54 45 20 54 41 42 4c 45 20 74 28 78 20 50 52  ATE TABLE t(x PR
15c30 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20  IMARY KEY, y);. 
15c40 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42     ** CREATE TAB
15c50 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55  LE t(x, y, UNIQU
15c60 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a  E(x, y));.    **
15c70 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77  .    ** Either w
15c80 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65  ay, check to see
15c90 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c   if the table al
15ca0 72 65 61 64 79 20 68 61 73 20 73 75 63 68 20 61  ready has such a
15cb0 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20  n index. If.    
15cc0 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74  ** so, don't bot
15cd0 68 65 72 20 63 72 65 61 74 69 6e 67 20 74 68 69  her creating thi
15ce0 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79  s one. This only
15cf0 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20   applies to.    
15d00 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
15d10 20 63 72 65 61 74 65 64 20 69 6e 64 69 63 65 73   created indices
15d20 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61  . Users can do a
15d30 73 20 74 68 65 79 20 77 69 73 68 20 77 69 74 68  s they wish with
15d40 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74  .    ** explicit
15d50 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a   indices..    **
15d60 0a 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51  .    ** Two UNIQ
15d70 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45  UE or PRIMARY KE
15d80 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  Y constraints ar
15d90 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75  e considered equ
15da0 69 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28  ivalent.    ** (
15db0 61 6e 64 20 74 68 75 73 20 73 75 70 70 72 65 73  and thus suppres
15dc0 73 69 6e 67 20 74 68 65 20 73 65 63 6f 6e 64 20  sing the second 
15dd0 6f 6e 65 29 20 65 76 65 6e 20 69 66 20 74 68 65  one) even if the
15de0 79 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74  y have different
15df0 0a 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64  .    ** sort ord
15e00 65 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ers..    **.    
15e10 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
15e20 64 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74  different collat
15e30 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 6f 72  ing sequences or
15e40 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   if the columns 
15e50 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  of.    ** the co
15e60 6e 73 74 72 61 69 6e 74 20 6f 63 63 75 72 20 69  nstraint occur i
15e70 6e 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65  n different orde
15e80 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e  rs, then the con
15e90 73 74 72 61 69 6e 74 73 20 61 72 65 0a 20 20 20  straints are.   
15ea0 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 64   ** considered d
15eb0 69 73 74 69 6e 63 74 20 61 6e 64 20 62 6f 74 68  istinct and both
15ec0 20 72 65 73 75 6c 74 20 69 6e 20 73 65 70 61 72   result in separ
15ed0 61 74 65 20 69 6e 64 69 63 65 73 2e 0a 20 20 20  ate indices..   
15ee0 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
15ef0 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
15f00 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
15f10 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
15f20 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
15f30 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65  nt k;.      asse
15f40 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  rt( pIdx->onErro
15f50 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20  r!=OE_None );.  
15f60 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
15f70 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20  ->autoIndex );. 
15f80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
15f90 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  dex->onError!=OE
15fa0 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20  _None );..      
15fb0 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  if( pIdx->nColum
15fc0 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  n!=pIndex->nColu
15fd0 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  mn ) continue;. 
15fe0 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
15ff0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b  pIdx->nColumn; k
16000 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ++){.        con
16010 73 74 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20  st char *z1;.   
16020 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
16030 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 69 66 28  *z2;.        if(
16040 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
16050 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f  k]!=pIndex->aiCo
16060 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b  lumn[k] ) break;
16070 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 49  .        z1 = pI
16080 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20  dx->azColl[k];. 
16090 20 20 20 20 20 20 20 7a 32 20 3d 20 70 49 6e 64         z2 = pInd
160a0 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20  ex->azColl[k];. 
160b0 20 20 20 20 20 20 20 69 66 28 20 7a 31 21 3d 7a         if( z1!=z
160c0 32 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  2 && sqlite3StrI
160d0 43 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20 62 72  Cmp(z1, z2) ) br
160e0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
160f0 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e     if( k==pIdx->
16100 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  nColumn ){.     
16110 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45     if( pIdx->onE
16120 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e  rror!=pIndex->on
16130 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  Error ){.       
16140 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74     /* This const
16150 72 61 69 6e 74 20 63 72 65 61 74 65 73 20 74 68  raint creates th
16160 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20  e same index as 
16170 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20  a previous.     
16180 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69       ** constrai
16190 6e 74 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d  nt specified som
161a0 65 77 68 65 72 65 20 69 6e 20 74 68 65 20 43 52  ewhere in the CR
161b0 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
161c0 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20  ment..          
161d0 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f  ** However the O
161e0 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
161f0 65 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  es are different
16200 2e 20 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a  . If both this .
16210 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
16220 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20  straint and the 
16230 70 72 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c  previous equival
16240 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68  ent constraint h
16250 61 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20  ave explicit.   
16260 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e         ** ON CON
16270 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74 68  FLICT clauses th
16280 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20  is is an error. 
16290 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74  Otherwise, use t
162a0 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
162b0 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69  explicitly speci
162c0 66 69 65 64 20 62 65 68 61 76 69 6f 75 72 20 66  fied behaviour f
162d0 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  or the index..  
162e0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
162f0 20 20 20 20 20 69 66 28 20 21 28 70 49 64 78 2d       if( !(pIdx-
16300 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
16310 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e  ault || pIndex->
16320 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
16330 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ult) ){.        
16340 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
16350 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
16360 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f               "co
16370 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e  nflicting ON CON
16380 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 73 70  FLICT clauses sp
16390 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20  ecified", 0);.  
163a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
163b0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e      if( pIdx->on
163c0 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
163d0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
163e0 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d   pIdx->onError =
163f0 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
16400 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
16410 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16420 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
16430 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
16440 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
16450 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64  Link the new Ind
16460 65 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  ex structure to 
16470 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f  its table and to
16480 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20   the other.  ** 
16490 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
164a0 73 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a  se structures. .
164b0 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
164c0 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
164d0 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 61 73  Index *p;.    as
164e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
164f0 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
16500 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68   0, pIndex->pSch
16510 65 6d 61 29 20 29 3b 0a 20 20 20 20 70 20 3d 20  ema) );.    p = 
16520 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
16530 74 28 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  t(&pIndex->pSche
16540 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20 20  ma->idxHash, .  
16550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16560 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
16570 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74  zName, sqlite3St
16580 72 6c 65 6e 33 30 28 70 49 6e 64 65 78 2d 3e 7a  rlen30(pIndex->z
16590 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20  Name),.         
165a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165b0 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66   pIndex);.    if
165c0 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ( p ){.      ass
165d0 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29  ert( p==pIndex )
165e0 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73  ;  /* Malloc mus
165f0 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f  t have failed */
16600 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  .      db->mallo
16610 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
16620 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
16630 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
16640 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
16650 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
16660 68 61 6e 67 65 73 3b 0a 20 20 20 20 69 66 28 20  hanges;.    if( 
16670 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20  pTblName!=0 ){. 
16680 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75       pIndex->tnu
16690 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  m = db->init.new
166a0 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tnum;.    }.  }.
166b0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d  .  /* If the db-
166c0 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20  >init.busy is 0 
166d0 74 68 65 6e 20 63 72 65 61 74 65 20 74 68 65 20  then create the 
166e0 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20  index on disk.  
166f0 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76  This.  ** involv
16700 65 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 69  es writing the i
16710 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61  ndex into the ma
16720 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66  ster table and f
16730 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20  illing in the.  
16740 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74 68  ** index with th
16750 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e current table 
16760 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20  contents..  **. 
16770 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69 74   ** The db->init
16780 2e 62 75 73 79 20 69 73 20 30 20 77 68 65 6e 20  .busy is 0 when 
16790 74 68 65 20 75 73 65 72 20 66 69 72 73 74 20 65  the user first e
167a0 6e 74 65 72 73 20 61 20 43 52 45 41 54 45 20 49  nters a CREATE I
167b0 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61  NDEX .  ** comma
167c0 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75  nd.  db->init.bu
167d0 73 79 20 69 73 20 31 20 77 68 65 6e 20 61 20 64  sy is 1 when a d
167e0 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65  atabase is opene
167f0 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41  d and .  ** CREA
16800 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
16810 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f 75 74  nts are read out
16820 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 74   of the master t
16830 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74  able.  In.  ** t
16840 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 20 74  he latter case t
16850 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  he index already
16860 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c   exists on disk,
16870 20 77 68 69 63 68 20 69 73 20 77 68 79 0a 20 20   which is why.  
16880 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74  ** we don't want
16890 20 74 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e   to recreate it.
168a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54  .  **.  ** If pT
168b0 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61  blName==0 it mea
168c0 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  ns this index is
168d0 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61 20   generated as a 
168e0 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a  primary key.  **
168f0 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
16900 72 61 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54  raint of a CREAT
16910 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
16920 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74 61  t.  Since the ta
16930 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73  ble.  ** has jus
16940 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20  t been created, 
16950 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64  it contains no d
16960 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ata and the inde
16970 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  x initialization
16980 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62  .  ** step can b
16990 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a  e skipped..  */.
169a0 20 20 65 6c 73 65 7b 20 2f 2a 20 69 66 28 20 64    else{ /* if( d
169b0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
169c0 29 20 2a 2f 0a 20 20 20 20 56 64 62 65 20 2a 76  ) */.    Vdbe *v
169d0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d  ;.    char *zStm
169e0 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20  t;.    int iMem 
169f0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
16a00 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  ;..    v = sqlit
16a10 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
16a20 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
16a30 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
16a40 74 65 5f 69 6e 64 65 78 3b 0a 0a 0a 20 20 20 20  te_index;...    
16a50 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 72 6f  /* Create the ro
16a60 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65 20 69  otpage for the i
16a70 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ndex.    */.    
16a80 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
16a90 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
16aa0 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 1, iDb);.    
16ab0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16ac0 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e  2(v, OP_CreateIn
16ad0 64 65 78 2c 20 69 44 62 2c 20 69 4d 65 6d 29 3b  dex, iDb, iMem);
16ae0 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20  ..    /* Gather 
16af0 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78  the complete tex
16b00 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
16b10 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
16b20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  into.    ** the 
16b30 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20  zStmt variable. 
16b40 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
16b50 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 61 73  tart ){.      as
16b60 73 65 72 74 28 20 70 45 6e 64 21 3d 30 20 29 3b  sert( pEnd!=0 );
16b70 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65  .      /* A name
16b80 64 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20  d index with an 
16b90 65 78 70 6c 69 63 69 74 20 43 52 45 41 54 45 20  explicit CREATE 
16ba0 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
16bb0 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  */.      zStmt =
16bc0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
16bd0 64 62 2c 20 22 43 52 45 41 54 45 25 73 20 49 4e  db, "CREATE%s IN
16be0 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20  DEX %.*s",.     
16bf0 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e     onError==OE_N
16c00 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49  one ? "" : " UNI
16c10 51 55 45 22 2c 0a 20 20 20 20 20 20 20 20 70 45  QUE",.        pE
16c20 6e 64 2d 3e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a  nd->z - pName->z
16c30 20 2b 20 31 2c 0a 20 20 20 20 20 20 20 20 70 4e   + 1,.        pN
16c40 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c  ame->z);.    }el
16c50 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
16c60 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
16c70 63 72 65 61 74 65 64 20 62 79 20 61 20 50 52 49  created by a PRI
16c80 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
16c90 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  UE constraint */
16ca0 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20  .      /* zStmt 
16cb0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
16cc0 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a  (""); */.      z
16cd0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Stmt = 0;.    }.
16ce0 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65  .    /* Add an e
16cf0 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d  ntry in sqlite_m
16d00 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20 69  aster for this i
16d10 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ndex.    */.    
16d20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
16d30 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
16d40 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
16d50 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69   %Q.%s VALUES('i
16d60 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c  ndex',%Q,%Q,#%d,
16d70 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64  %Q);",.        d
16d80 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
16d90 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
16da0 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70 49  iDb),.        pI
16db0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  ndex->zName,.   
16dc0 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
16dd0 2c 0a 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a  ,.        iMem,.
16de0 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20          zStmt.  
16df0 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
16e00 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74  DbFree(db, zStmt
16e10 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20  );..    /* Fill 
16e20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 64  the index with d
16e30 61 74 61 20 61 6e 64 20 72 65 70 61 72 73 65 20  ata and reparse 
16e40 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65  the schema. Code
16e50 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20   an OP_Expire.  
16e60 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61    ** to invalida
16e70 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69  te all pre-compi
16e80 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
16e90 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
16ea0 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  TblName ){.     
16eb0 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
16ec0 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
16ed0 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20  ex, iMem);.     
16ee0 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
16ef0 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
16f00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16f10 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
16f20 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44  _ParseSchema, iD
16f30 62 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  b, 0, 0,.       
16f40 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
16f50 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27 20  (db, "name='%q' 
16f60 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27  AND type='index'
16f70 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ", pIndex->zName
16f80 29 2c 20 0a 20 20 20 20 20 20 20 20 20 50 34 5f  ), .         P4_
16f90 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
16fa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16fb0 31 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20  1(v, OP_Expire, 
16fc0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  0);.    }.  }.. 
16fd0 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20   /* When adding 
16fe0 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20  an index to the 
16ff0 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20  list of indices 
17000 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b  for a table, mak
17010 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20  e.  ** sure all 
17020 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20  indices labeled 
17030 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20  OE_Replace come 
17040 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20  after all those 
17050 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f  labeled.  ** OE_
17060 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73  Ignore.  This is
17070 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 74   necessary for t
17080 68 65 20 63 6f 72 72 65 63 74 20 63 6f 6e 73 74  he correct const
17090 72 61 69 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a  raint check.  **
170a0 20 70 72 6f 63 65 73 73 69 6e 67 20 28 69 6e 20   processing (in 
170b0 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43  sqlite3GenerateC
170c0 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28  onstraintChecks(
170d0 29 29 20 61 73 20 70 61 72 74 20 6f 66 0a 20 20  )) as part of.  
170e0 2a 2a 20 55 50 44 41 54 45 20 61 6e 64 20 49 4e  ** UPDATE and IN
170f0 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  SERT statements.
17100 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62    .  */.  if( db
17110 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70  ->init.busy || p
17120 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  TblName==0 ){.  
17130 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f    if( onError!=O
17140 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61  E_Replace || pTa
17150 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20  b->pIndex==0.   
17160 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70        || pTab->p
17170 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
17180 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20  OE_Replace){.   
17190 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
171a0 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
171b0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e  .      pTab->pIn
171c0 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  dex = pIndex;.  
171d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
171e0 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70  ndex *pOther = p
171f0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
17200 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72     while( pOther
17210 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65  ->pNext && pOthe
17220 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f  r->pNext->onErro
17230 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b  r!=OE_Replace ){
17240 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65 72 20  .        pOther 
17250 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b  = pOther->pNext;
17260 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
17270 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
17280 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
17290 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78      pOther->pNex
172a0 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  t = pIndex;.    
172b0 7d 0a 20 20 20 20 70 52 65 74 20 3d 20 70 49 6e  }.    pRet = pIn
172c0 64 65 78 3b 0a 20 20 20 20 70 49 6e 64 65 78 20  dex;.    pIndex 
172d0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  = 0;.  }..  /* C
172e0 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65  lean up before e
172f0 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63  xiting */.exit_c
17300 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69  reate_index:.  i
17310 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
17320 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
17330 62 2c 20 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41  b, pIndex->zColA
17340 66 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ff);.    sqlite3
17350 44 62 46 72 65 65 28 64 62 2c 20 70 49 6e 64 65  DbFree(db, pInde
17360 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  x);.  }.  sqlite
17370 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
17380 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71  db, pList);.  sq
17390 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
173a0 74 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29  te(db, pTblName)
173b0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
173c0 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
173d0 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
173e0 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49  /*.** Fill the I
173f0 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20  ndex.aiRowEst[] 
17400 61 72 72 61 79 20 77 69 74 68 20 64 65 66 61 75  array with defau
17410 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  lt information -
17420 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
17430 74 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e 20  to be used when 
17440 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20  we have not run 
17450 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d  the ANALYZE comm
17460 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77  and..**.** aiRow
17470 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73  Est[0] is suppos
17480 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  e to contain the
17490 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
174a0 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  nts in the index
174b0 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f  ..** Since we do
174c0 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73   not know, guess
174d0 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52   1 million.  aiR
174e0 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65  owEst[1] is an e
174f0 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a  stimate of the.*
17500 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
17510 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68   in the table th
17520 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72  at match any par
17530 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66  ticular value of
17540 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f   the.** first co
17550 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
17560 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20  x.  aiRowEst[2] 
17570 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  is an estimate o
17580 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  f the number.** 
17590 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74  of rows that mat
175a0 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61  ch any particula
175b0 72 20 63 6f 6d 62 69 6e 69 61 74 69 6f 6e 20 6f  r combiniation o
175c0 66 20 74 68 65 20 66 69 72 73 74 20 32 20 63 6f  f the first 2 co
175d0 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20  lumns.** of the 
175e0 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66  index.  And so f
175f0 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61  orth.  It must a
17600 6c 77 61 79 73 20 62 65 20 74 68 65 20 63 61 73  lways be the cas
17610 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20  e that.*.**     
17620 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e        aiRowEst[N
17630 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d  ]<=aiRowEst[N-1]
17640 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69  .**           ai
17650 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a  RowEst[N]>=1.**.
17660 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68  ** Apart from th
17670 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74  at, we have litt
17680 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69  le to go on besi
17690 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73  des intuition as
176a0 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77   to.** how aiRow
176b0 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20  Est[] should be 
176c0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68  initialized.  Th
176d0 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61  e numbers genera
176e0 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20  ted here.** are 
176f0 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c  based on typical
17700 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e   values found in
17710 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e   actual indices.
17720 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
17730 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e  DefaultRowEst(In
17740 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e  dex *pIdx){.  un
17750 73 69 67 6e 65 64 20 2a 61 20 3d 20 70 49 64 78  signed *a = pIdx
17760 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20 20 69 6e  ->aiRowEst;.  in
17770 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  t i;.  unsigned 
17780 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 61 21 3d  n;.  assert( a!=
17790 30 20 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 49  0 );.  a[0] = pI
177a0 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f 77  dx->pTable->nRow
177b0 45 73 74 3b 0a 20 20 69 66 28 20 61 5b 30 5d 3c  Est;.  if( a[0]<
177c0 31 30 20 29 20 61 5b 30 5d 20 3d 20 31 30 3b 0a  10 ) a[0] = 10;.
177d0 20 20 6e 20 3d 20 31 30 3b 0a 20 20 66 6f 72 28    n = 10;.  for(
177e0 69 3d 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 43  i=1; i<=pIdx->nC
177f0 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
17800 20 61 5b 69 5d 20 3d 20 6e 3b 0a 20 20 20 20 69   a[i] = n;.    i
17810 66 28 20 6e 3e 35 20 29 20 6e 2d 2d 3b 0a 20 20  f( n>5 ) n--;.  
17820 7d 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e  }.  if( pIdx->on
17830 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
17840 7b 0a 20 20 20 20 61 5b 70 49 64 78 2d 3e 6e 43  {.    a[pIdx->nC
17850 6f 6c 75 6d 6e 5d 20 3d 20 31 3b 0a 20 20 7d 0a  olumn] = 1;.  }.
17860 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
17870 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20  utine will drop 
17880 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65  an existing name
17890 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72  d index.  This r
178a0 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d  outine.** implem
178b0 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e  ents the DROP IN
178c0 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  DEX statement..*
178d0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
178e0 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  opIndex(Parse *p
178f0 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
17900 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45 78 69  pName, int ifExi
17910 73 74 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  sts){.  Index *p
17920 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76  Index;.  Vdbe *v
17930 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
17940 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
17950 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73 73 65  int iDb;..  asse
17960 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
17970 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 4e 65 76 65  ==0 );   /* Neve
17980 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 72  r called with pr
17990 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ior errors */.  
179a0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
179b0 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
179c0 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
179d0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
179e0 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  pName->nSrc==1 )
179f0 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
17a00 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
17a10 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
17a20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
17a30 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
17a40 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
17a50 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e  FindIndex(db, pN
17a60 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ame->a[0].zName,
17a70 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
17a80 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  tabase);.  if( p
17a90 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Index==0 ){.    
17aa0 69 66 28 20 21 69 66 45 78 69 73 74 73 20 29 7b  if( !ifExists ){
17ab0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
17ac0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
17ad0 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
17ae0 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20  S", pName, 0);. 
17af0 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
17b00 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
17b10 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
17b20 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
17b30 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75    if( pIndex->au
17b40 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73  toIndex ){.    s
17b50 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
17b60 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73  Parse, "index as
17b70 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e  sociated with UN
17b80 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72  IQUE ".      "or
17b90 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
17ba0 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62  straint cannot b
17bb0 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a  e dropped", 0);.
17bc0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
17bd0 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
17be0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
17bf0 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
17c00 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b  Index->pSchema);
17c10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17c20 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
17c30 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
17c40 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
17c50 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62  P_INDEX;.    Tab
17c60 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
17c70 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63  x->pTable;.    c
17c80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
17c90 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
17ca0 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
17cb0 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
17cc0 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20  MA_TABLE(iDb);. 
17cd0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
17ce0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
17cf0 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
17d00 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  Tab, 0, zDb) ){.
17d10 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
17d20 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
17d30 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  }.    if( !OMIT_
17d40 54 45 4d 50 44 42 20 26 26 20 69 44 62 20 29 20  TEMPDB && iDb ) 
17d50 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
17d60 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  OP_TEMP_INDEX;. 
17d70 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
17d80 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
17d90 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  code, pIndex->zN
17da0 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
17db0 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
17dc0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
17dd0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
17de0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
17df0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
17e00 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61  move the index a
17e10 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  nd from the mast
17e20 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20  er table */.  v 
17e30 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
17e40 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
17e50 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
17e60 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
17e70 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
17e80 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
17e90 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
17ea0 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45  se,.       "DELE
17eb0 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
17ec0 45 52 45 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20  ERE name=%Q AND 
17ed0 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20  type='index'",. 
17ee0 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
17ef0 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
17f00 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20  _TABLE(iDb),.   
17f10 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
17f20 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  e.    );.    if(
17f30 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
17f40 65 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 74  e(db, "sqlite_st
17f50 61 74 31 22 2c 20 64 62 2d 3e 61 44 62 5b 69 44  at1", db->aDb[iD
17f60 62 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  b].zName) ){.   
17f70 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
17f80 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
17f90 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
17fa0 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61  OM %Q.sqlite_sta
17fb0 74 31 20 57 48 45 52 45 20 69 64 78 3d 25 51 22  t1 WHERE idx=%Q"
17fc0 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ,.        db->aD
17fd0 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 70 49  b[iDb].zName, pI
17fe0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  ndex->zName.    
17ff0 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73    );.    }.    s
18000 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
18010 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
18020 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  .    destroyRoot
18030 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Page(pParse, pIn
18040 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  dex->tnum, iDb);
18050 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18060 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f  AddOp4(v, OP_Dro
18070 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20  pIndex, iDb, 0, 
18080 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  0, pIndex->zName
18090 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f  , 0);.  }..exit_
180a0 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71  drop_index:.  sq
180b0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
180c0 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d  te(db, pName);.}
180d0 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69  ../*.** pArray i
180e0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
180f0 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63  n array of objec
18100 74 73 2e 20 20 45 61 63 68 20 6f 62 6a 65 63 74  ts.  Each object
18110 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61 79   in the.** array
18120 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74 65   is szEntry byte
18130 73 20 69 6e 20 73 69 7a 65 2e 20 20 54 68 69 73  s in size.  This
18140 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74   routine allocat
18150 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6f 62 6a 65  es a new.** obje
18160 63 74 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66  ct on the end of
18170 20 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a   the array..**.*
18180 2a 20 2a 70 6e 45 6e 74 72 79 20 69 73 20 74 68  * *pnEntry is th
18190 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
181a0 69 65 73 20 61 6c 72 65 61 64 79 20 69 6e 20 75  ies already in u
181b0 73 65 2e 20 20 2a 70 6e 41 6c 6c 6f 63 20 69 73  se.  *pnAlloc is
181c0 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73  .** the previous
181d0 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 69 7a  ly allocated siz
181e0 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e 20  e of the array. 
181f0 20 69 6e 69 74 53 69 7a 65 20 69 73 20 74 68 65   initSize is the
18200 0a 2a 2a 20 73 75 67 67 65 73 74 65 64 20 69 6e  .** suggested in
18210 69 74 69 61 6c 20 61 72 72 61 79 20 73 69 7a 65  itial array size
18220 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a   allocation..**.
18230 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20  ** The index of 
18240 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73  the new entry is
18250 20 72 65 74 75 72 6e 65 64 20 69 6e 20 2a 70 49   returned in *pI
18260 64 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  dx..**.** This r
18270 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61  outine returns a
18280 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
18290 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73  array of objects
182a0 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 69 67 68 74  .  This.** might
182b0 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
182c0 74 68 65 20 70 41 72 72 61 79 20 70 61 72 61 6d  the pArray param
182d0 65 74 65 72 20 6f 72 20 69 74 20 6d 69 67 68 74  eter or it might
182e0 20 62 65 20 61 20 64 69 66 66 65 72 65 6e 74 0a   be a different.
182f0 2a 2a 20 70 6f 69 6e 74 65 72 20 69 66 20 74 68  ** pointer if th
18300 65 20 61 72 72 61 79 20 77 61 73 20 72 65 73 69  e array was resi
18310 7a 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  zed..*/.void *sq
18320 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
18330 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  te(.  sqlite3 *d
18340 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65  b,      /* Conne
18350 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20  ction to notify 
18360 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  of malloc failur
18370 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  es */.  void *pA
18380 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72  rray,     /* Arr
18390 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20  ay of objects.  
183a0 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63  Might be realloc
183b0 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ated */.  int sz
183c0 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53  Entry,      /* S
183d0 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65  ize of each obje
183e0 63 74 20 69 6e 20 74 68 65 20 61 72 72 61 79 20  ct in the array 
183f0 2a 2f 0a 20 20 69 6e 74 20 69 6e 69 74 53 69 7a  */.  int initSiz
18400 65 2c 20 20 20 20 20 2f 2a 20 53 75 67 67 65 73  e,     /* Sugges
18410 74 65 64 20 69 6e 69 74 69 61 6c 20 61 6c 6c 6f  ted initial allo
18420 63 61 74 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d 65  cation, in eleme
18430 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  nts */.  int *pn
18440 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75  Entry,     /* Nu
18450 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20  mber of objects 
18460 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
18470 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 41 6c 6c   */.  int *pnAll
18480 6f 63 2c 20 20 20 20 20 2f 2a 20 43 75 72 72 65  oc,     /* Curre
18490 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  nt size of the a
184a0 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65 6c  llocation, in el
184b0 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  ements */.  int 
184c0 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a  *pIdx         /*
184d0 20 57 72 69 74 65 20 74 68 65 20 69 6e 64 65 78   Write the index
184e0 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68   of a new slot h
184f0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ere */.){.  char
18500 20 2a 7a 3b 0a 20 20 69 66 28 20 2a 70 6e 45 6e   *z;.  if( *pnEn
18510 74 72 79 20 3e 3d 20 2a 70 6e 41 6c 6c 6f 63 20  try >= *pnAlloc 
18520 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65  ){.    void *pNe
18530 77 3b 0a 20 20 20 20 69 6e 74 20 6e 65 77 53 69  w;.    int newSi
18540 7a 65 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20  ze;.    newSize 
18550 3d 20 28 2a 70 6e 41 6c 6c 6f 63 29 2a 32 20 2b  = (*pnAlloc)*2 +
18560 20 69 6e 69 74 53 69 7a 65 3b 0a 20 20 20 20 70   initSize;.    p
18570 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
18580 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72 61  ealloc(db, pArra
18590 79 2c 20 6e 65 77 53 69 7a 65 2a 73 7a 45 6e 74  y, newSize*szEnt
185a0 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ry);.    if( pNe
185b0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70  w==0 ){.      *p
185c0 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Idx = -1;.      
185d0 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20  return pArray;. 
185e0 20 20 20 7d 0a 20 20 20 20 2a 70 6e 41 6c 6c 6f     }.    *pnAllo
185f0 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
18600 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77  locSize(db, pNew
18610 29 2f 73 7a 45 6e 74 72 79 3b 0a 20 20 20 20 70  )/szEntry;.    p
18620 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20  Array = pNew;.  
18630 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70  }.  z = (char*)p
18640 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28  Array;.  memset(
18650 26 7a 5b 2a 70 6e 45 6e 74 72 79 20 2a 20 73 7a  &z[*pnEntry * sz
18660 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74  Entry], 0, szEnt
18670 72 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 2a  ry);.  *pIdx = *
18680 70 6e 45 6e 74 72 79 3b 0a 20 20 2b 2b 2a 70 6e  pnEntry;.  ++*pn
18690 45 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e 20  Entry;.  return 
186a0 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pArray;.}../*.**
186b0 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c   Append a new el
186c0 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76  ement to the giv
186d0 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61  en IdList.  Crea
186e0 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20  te a new IdList 
186f0 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a  if.** need be..*
18700 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73  *.** A new IdLis
18710 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
18720 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
18730 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c  () fails..*/.IdL
18740 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
18750 73 74 41 70 70 65 6e 64 28 73 71 6c 69 74 65 33  stAppend(sqlite3
18760 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c   *db, IdList *pL
18770 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
18780 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  en){.  int i;.  
18790 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
187a0 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
187b0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
187c0 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69 73  db, sizeof(IdLis
187d0 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
187e0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
187f0 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  0;.    pList->nA
18800 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lloc = 0;.  }.  
18810 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74  pList->a = sqlit
18820 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
18830 0a 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20  .      db,.     
18840 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20   pList->a,.     
18850 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61   sizeof(pList->a
18860 5b 30 5d 29 2c 0a 20 20 20 20 20 20 35 2c 0a 20  [0]),.      5,. 
18870 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64       &pList->nId
18880 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e  ,.      &pList->
18890 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 26 69  nAlloc,.      &i
188a0 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30 20  .  );.  if( i<0 
188b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64  ){.    sqlite3Id
188c0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
188d0 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72  List);.    retur
188e0 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
188f0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
18900 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
18910 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b  ken(db, pToken);
18920 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
18930 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
18940 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76   an IdList..*/.v
18950 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73  oid sqlite3IdLis
18960 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
18970 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69  *db, IdList *pLi
18980 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
18990 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
189a0 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
189b0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
189c0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
189d0 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
189e0 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
189f0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
18a00 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  ree(db, pList->a
18a10 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
18a20 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  ee(db, pList);.}
18a30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
18a40 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  he index in pLis
18a50 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66  t of the identif
18a60 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20  ier named zId.  
18a70 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20  Return -1.** if 
18a80 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e  not found..*/.in
18a90 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  t sqlite3IdListI
18aa0 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69  ndex(IdList *pLi
18ab0 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
18ac0 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  zName){.  int i;
18ad0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
18ae0 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66  ) return -1;.  f
18af0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
18b00 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
18b10 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
18b20 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
18b30 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
18b40 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a  ) return i;.  }.
18b50 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
18b60 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68 65  /*.** Expand the
18b70 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
18b80 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   for the given S
18b90 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62 79  rcList object by
18ba0 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45 78  .** creating nEx
18bb0 74 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62 65  tra new slots be
18bc0 67 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61 72  ginning at iStar
18bd0 74 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a 65  t.  iStart is ze
18be0 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77  ro based..** New
18bf0 20 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f 65   slots are zeroe
18c00 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  d..**.** For exa
18c10 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61 20  mple, suppose a 
18c20 53 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c  SrcList initiall
18c30 79 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65  y contains two e
18c40 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20  ntries: A,B..** 
18c50 54 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77 20  To append 3 new 
18c60 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68 65  entries onto the
18c70 20 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a   end, do this:.*
18c80 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 53  *.**    sqlite3S
18c90 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
18ca0 2c 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20 32  , pSrclist, 3, 2
18cb0 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  );.**.** After t
18cc0 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69 74  he call above it
18cd0 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20   would contain: 
18ce0 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c   A, B, nil, nil,
18cf0 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20   nil..** If the 
18d00 69 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74 20  iStart argument 
18d10 68 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74 65  had been 1 inste
18d20 61 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74 68  ad of 2, then th
18d30 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c  e result.** woul
18d40 64 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41 2c  d have been:  A,
18d50 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20   nil, nil, nil, 
18d60 42 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20 74  B.  To prepend t
18d70 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a  he new slots,.**
18d80 20 74 68 65 20 69 53 74 61 72 74 20 76 61 6c 75   the iStart valu
18d90 65 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20 54  e would be 0.  T
18da0 68 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20 77  he result then w
18db0 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c  ould.** be: nil,
18dc0 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e   nil, nil, A, B.
18dd0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
18de0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
18df0 69 6c 73 20 74 68 65 20 53 72 63 4c 69 73 74 20  ils the SrcList 
18e00 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 20 54  is unchanged.  T
18e10 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63  he.** db->malloc
18e20 46 61 69 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c  Failed flag will
18e30 20 62 65 20 73 65 74 20 74 6f 20 74 72 75 65 2e   be set to true.
18e40 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  .*/.SrcList *sql
18e50 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
18e60 67 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ge(.  sqlite3 *d
18e70 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b,       /* Data
18e80 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
18e90 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d  to notify of OOM
18ea0 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63   errors */.  Src
18eb0 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
18ec0 2f 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20 74  /* The SrcList t
18ed0 6f 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f  o be enlarged */
18ee0 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
18ef0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
18f00 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20  of new slots to 
18f10 61 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d  add to pSrc->a[]
18f20 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
18f30 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
18f40 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f  x in pSrc->a[] o
18f50 66 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f 74  f first new slot
18f60 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
18f70 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
18f80 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67  cking on calling
18f90 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
18fa0 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3e   assert( iStart>
18fb0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
18fc0 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61  nExtra>=1 );.  a
18fd0 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29  ssert( pSrc!=0 )
18fe0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
18ff0 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29  rt<=pSrc->nSrc )
19000 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
19010 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 63   additional spac
19020 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20  e if needed */. 
19030 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 2b   if( pSrc->nSrc+
19040 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41 6c  nExtra>pSrc->nAl
19050 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69  loc ){.    SrcLi
19060 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e  st *pNew;.    in
19070 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72 63 2d  t nAlloc = pSrc-
19080 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a 20 20  >nSrc+nExtra;.  
19090 20 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20 20 20    int nGot;.    
190a0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
190b0 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63  Realloc(db, pSrc
190c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
190d0 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b   sizeof(*pSrc) +
190e0 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65   (nAlloc-1)*size
190f0 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29  of(pSrc->a[0]) )
19100 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
19110 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
19120 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
19130 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  led );.      ret
19140 75 72 6e 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a  urn pSrc;.    }.
19150 20 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77 3b      pSrc = pNew;
19160 0a 20 20 20 20 6e 47 6f 74 20 3d 20 28 73 71 6c  .    nGot = (sql
19170 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65  ite3DbMallocSize
19180 28 64 62 2c 20 70 4e 65 77 29 20 2d 20 73 69 7a  (db, pNew) - siz
19190 65 6f 66 28 2a 70 53 72 63 29 29 2f 73 69 7a 65  eof(*pSrc))/size
191a0 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2b 31  of(pSrc->a[0])+1
191b0 3b 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c  ;.    pSrc->nAll
191c0 6f 63 20 3d 20 28 75 31 36 29 6e 47 6f 74 3b 0a  oc = (u16)nGot;.
191d0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65    }..  /* Move e
191e0 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74 68  xisting slots th
191f0 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74 68  at come after th
19200 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65 64  e newly inserted
19210 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20   slots.  ** out 
19220 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20 20  of the way */.  
19230 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
19240 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20 69  -1; i>=iStart; i
19250 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61  --){.    pSrc->a
19260 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53 72  [i+nExtra] = pSr
19270 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70  c->a[i];.  }.  p
19280 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 28 69 31  Src->nSrc += (i1
19290 36 29 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a 20  6)nExtra;..  /* 
192a0 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c 79 20 61  Zero the newly a
192b0 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20 2a  llocated slots *
192c0 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 72 63  /.  memset(&pSrc
192d0 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20  ->a[iStart], 0, 
192e0 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
192f0 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66 6f  ])*nExtra);.  fo
19300 72 28 69 3d 69 53 74 61 72 74 3b 20 69 3c 69 53  r(i=iStart; i<iS
19310 74 61 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b 2b  tart+nExtra; i++
19320 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69  ){.    pSrc->a[i
19330 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a  ].iCursor = -1;.
19340 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e    }..  /* Return
19350 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
19360 65 20 65 6e 6c 61 72 67 65 64 20 53 72 63 4c 69  e enlarged SrcLi
19370 73 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  st */.  return p
19380 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  Src;.}.../*.** A
19390 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c  ppend a new tabl
193a0 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69  e name to the gi
193b0 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72  ven SrcList.  Cr
193c0 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69  eate a new SrcLi
193d0 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
193e0 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
193f0 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  s created in the
19400 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66   SrcList even if
19410 20 70 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c 2e   pTable is NULL.
19420 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73 74  .**.** A SrcList
19430 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
19440 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69   NULL if there i
19450 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20  s an OOM error. 
19460 20 54 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a   The returned.**
19470 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20 62   SrcList might b
19480 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
19490 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 77  e SrcList that w
194a0 61 73 20 69 6e 70 75 74 20 6f 72 20 69 74 20 6d  as input or it m
194b0 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e 65 77  ight be.** a new
194c0 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f 4f 4d   one.  If an OOM
194d0 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75   error does occu
194e0 72 73 2c 20 74 68 65 6e 20 74 68 65 20 70 72 69  rs, then the pri
194f0 6f 72 20 76 61 6c 75 65 20 6f 66 20 70 4c 69 73  or value of pLis
19500 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 70  t.** that is inp
19510 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ut to this routi
19520 6e 65 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  ne is automatica
19530 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a  lly freed..**.**
19540 20 49 66 20 70 44 61 74 61 62 61 73 65 20 69 73   If pDatabase is
19550 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65   not null, it me
19560 61 6e 73 20 74 68 61 74 20 74 68 65 20 74 61 62  ans that the tab
19570 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e  le has an option
19580 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e  al.** database n
19590 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b  ame prefix.  Lik
195a0 65 20 74 68 69 73 3a 20 20 22 64 61 74 61 62 61  e this:  "databa
195b0 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20  se.table".  The 
195c0 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69  pDatabase.** poi
195d0 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65  nts to the table
195e0 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54   name and the pT
195f0 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74  able points to t
19600 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
19610 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74  ..** The SrcList
19620 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64  .a[].zName field
19630 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
19640 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77  the table name w
19650 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f  hich might.** co
19660 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28  me from pTable (
19670 69 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20  if pDatabase is 
19680 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44  NULL) or from pD
19690 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72  atabase.  .** Sr
196a0 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62  cList.a[].zDatab
196b0 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69  ase is filled wi
196c0 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
196d0 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65  name from pTable
196e0 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c  ,.** or with NUL
196f0 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65  L if no database
19700 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a   is specified..*
19710 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f  *.** In other wo
19720 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b  rds, if call lik
19730 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
19740 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
19750 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42  ListAppend(D,A,B
19760 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ,0);.**.** Then 
19770 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d  B is a table nam
19780 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
19790 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65  se name is unspe
197a0 63 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c  cified.  If call
197b0 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a  ed.** like this:
197c0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  .**.**         s
197d0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
197e0 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a  end(D,A,B,C);.**
197f0 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68  .** Then C is th
19800 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
19810 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62 61   B is the databa
19820 73 65 20 6e 61 6d 65 2e 20 20 49 66 20 43 20 69  se name.  If C i
19830 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74 68 65  s defined.** the
19840 6e 20 73 6f 20 69 73 20 42 2e 20 20 49 6e 20 6f  n so is B.  In o
19850 74 68 65 72 20 77 6f 72 64 73 2c 20 77 65 20 6e  ther words, we n
19860 65 76 65 72 20 68 61 76 65 20 61 20 63 61 73 65  ever have a case
19870 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   where:.**.**   
19880 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
19890 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 30  ListAppend(D,A,0
198a0 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20  ,C);.**.** Both 
198b0 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61  pTable and pData
198c0 62 61 73 65 20 61 72 65 20 61 73 73 75 6d 65 64  base are assumed
198d0 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20 20   to be quoted.  
198e0 54 68 65 79 20 61 72 65 20 64 65 71 75 6f 74 65  They are dequote
198f0 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65 69 6e  d.** before bein
19900 67 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 53  g added to the S
19910 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c 69  rcList..*/.SrcLi
19920 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
19930 73 74 41 70 70 65 6e 64 28 0a 20 20 73 71 6c 69  stAppend(.  sqli
19940 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
19950 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  /* Connection to
19960 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f   notify of mallo
19970 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20  c failures */.  
19980 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  SrcList *pList, 
19990 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f      /* Append to
199a0 20 74 68 69 73 20 53 72 63 4c 69 73 74 2e 20 4e   this SrcList. N
199b0 55 4c 4c 20 63 72 65 61 74 65 73 20 61 20 6e 65  ULL creates a ne
199c0 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54  w SrcList */.  T
199d0 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20  oken *pTable,   
199e0 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61     /* Table to a
199f0 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ppend */.  Token
19a00 20 2a 70 44 61 74 61 62 61 73 65 20 20 20 20 2f   *pDatabase    /
19a10 2a 20 44 61 74 61 62 61 73 65 20 6f 66 20 74 68  * Database of th
19a20 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  e table */.){.  
19a30 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
19a40 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73  tem *pItem;.  as
19a50 73 65 72 74 28 20 70 44 61 74 61 62 61 73 65 3d  sert( pDatabase=
19a60 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d 30 20  =0 || pTable!=0 
19a70 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61  );  /* Cannot ha
19a80 76 65 20 43 20 77 69 74 68 6f 75 74 20 42 20 2a  ve C without B *
19a90 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  /.  if( pList==0
19aa0 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
19ab0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
19ac0 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 53  ero(db, sizeof(S
19ad0 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  rcList) );.    i
19ae0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
19af0 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73  turn 0;.    pLis
19b00 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20  t->nAlloc = 1;. 
19b10 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c   }.  pList = sql
19b20 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
19b30 67 65 28 64 62 2c 20 70 4c 69 73 74 2c 20 31 2c  ge(db, pList, 1,
19b40 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20   pList->nSrc);. 
19b50 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
19b60 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
19b70 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
19b80 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
19b90 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
19ba0 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74    pItem = &pList
19bb0 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d  ->a[pList->nSrc-
19bc0 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62  1];.  if( pDatab
19bd0 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65  ase && pDatabase
19be0 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44  ->z==0 ){.    pD
19bf0 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d  atabase = 0;.  }
19c00 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
19c10 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70   ){.    Token *p
19c20 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65  Temp = pDatabase
19c30 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20  ;.    pDatabase 
19c40 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54  = pTable;.    pT
19c50 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20  able = pTemp;.  
19c60 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  }.  pItem->zName
19c70 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
19c80 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62  omToken(db, pTab
19c90 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44  le);.  pItem->zD
19ca0 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65  atabase = sqlite
19cb0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
19cc0 62 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20  b, pDatabase);. 
19cd0 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
19ce0 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56  ../*.** Assign V
19cf0 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78 20  dbeCursor index 
19d00 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20 74  numbers to all t
19d10 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69  ables in a SrcLi
19d20 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  st.*/.void sqlit
19d30 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
19d40 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50  ursors(Parse *pP
19d50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
19d60 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
19d70 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
19d80 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
19d90 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20  assert(pList || 
19da0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
19db0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
19dc0 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
19dd0 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(i=0, pItem=pL
19de0 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d  ist->a; i<pList-
19df0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
19e00 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m++){.      if( 
19e10 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d  pItem->iCursor>=
19e20 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
19e30 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20   pItem->iCursor 
19e40 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
19e50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
19e60 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
19e70 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
19e80 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
19e90 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  s(pParse, pItem-
19ea0 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b  >pSelect->pSrc);
19eb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19ec0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
19ed0 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63  te an entire Src
19ee0 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61  List including a
19ef0 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74  ll its substruct
19f00 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ure..*/.void sql
19f10 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
19f20 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  e(sqlite3 *db, S
19f30 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
19f40 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
19f50 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
19f60 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69  pItem;.  if( pLi
19f70 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
19f80 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
19f90 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
19fa0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
19fb0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
19fc0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
19fd0 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  Item->zDatabase)
19fe0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
19ff0 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
1a000 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
1a010 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
1a020 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
1a030 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1a040 62 2c 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78  b, pItem->zIndex
1a050 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
1a060 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 49  leteTable(db, pI
1a070 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20  tem->pTab);.    
1a080 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
1a090 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
1a0a0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c  Select);.    sql
1a0b0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1a0c0 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a  b, pItem->pOn);.
1a0d0 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
1a0e0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  tDelete(db, pIte
1a0f0 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a  m->pUsing);.  }.
1a100 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1a110 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  db, pList);.}../
1a120 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1a130 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
1a140 68 65 20 70 61 72 73 65 72 20 74 6f 20 61 64 64  he parser to add
1a150 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74   a new term to t
1a160 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20 67  he.** end of a g
1a170 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61 75  rowing FROM clau
1a180 73 65 2e 20 20 54 68 65 20 22 70 22 20 70 61 72  se.  The "p" par
1a190 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 70 61  ameter is the pa
1a1a0 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52 4f  rt of.** the FRO
1a1b0 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20 68 61  M clause that ha
1a1c0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
1a1d0 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22 70 22  onstructed.  "p"
1a1e0 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74   is NULL.** if t
1a1f0 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
1a200 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f   term of the FRO
1a210 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61 62 6c  M clause.  pTabl
1a220 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 0a  e and pDatabase.
1a230 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65 20  ** are the name 
1a240 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  of the table and
1a250 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20   database named 
1a260 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1a270 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61 74  se term..** pDat
1a280 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20 69 66  abase is NULL if
1a290 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
1a2a0 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  me qualifier is 
1a2b0 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a 2a  missing - the.**
1a2c0 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20 49 66   usual case.  If
1a2d0 20 74 68 65 20 74 65 72 6d 20 68 61 73 20 61 20   the term has a 
1a2e0 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41 6c 69  alias, then pAli
1a2f0 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  as points to the
1a300 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e  .** alias token.
1a310 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 69 73    If the term is
1a320 20 61 20 73 75 62 71 75 65 72 79 2c 20 74 68 65   a subquery, the
1a330 6e 20 70 53 75 62 71 75 65 72 79 20 69 73 20 74  n pSubquery is t
1a340 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  he.** SELECT sta
1a350 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20  tement that the 
1a360 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64 65 73  subquery encodes
1a370 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20 61 6e  .  The pTable an
1a380 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 70  d.** pDatabase p
1a390 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 4e 55  arameters are NU
1a3a0 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72 69 65  LL for subquerie
1a3b0 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e 64 20  s.  The pOn and 
1a3c0 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65  pUsing.** parame
1a3d0 74 65 72 73 20 61 72 65 20 74 68 65 20 63 6f 6e  ters are the con
1a3e0 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e 20 61  tent of the ON a
1a3f0 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
1a400 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
1a410 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77 68 69   new SrcList whi
1a420 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20 74 68  ch encodes is th
1a430 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68 65 20  e FROM with the 
1a440 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65  new.** term adde
1a450 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  d..*/.SrcList *s
1a460 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
1a470 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50  endFromTerm(.  P
1a480 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1a490 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
1a4a0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
1a4b0 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20 20 20  rcList *p,      
1a4c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65         /* The le
1a4d0 66 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 46  ft part of the F
1a4e0 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72 65 61  ROM clause alrea
1a4f0 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b  dy seen */.  Tok
1a500 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20  en *pTable,     
1a510 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1a520 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61 64 64  the table to add
1a530 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   to the FROM cla
1a540 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  use */.  Token *
1a550 70 44 61 74 61 62 61 73 65 2c 20 20 20 20 20 20  pDatabase,      
1a560 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1a570 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
1a580 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20  ing pTable */.  
1a590 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20  Token *pAlias,  
1a5a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
1a5b0 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
1a5c0 66 20 74 68 65 20 41 53 20 73 75 62 65 78 70 72  f the AS subexpr
1a5d0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65  ession */.  Sele
1a5e0 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c 20 20  ct *pSubquery,  
1a5f0 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75 65 72      /* A subquer
1a600 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20  y used in place 
1a610 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20  of a table name 
1a620 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20  */.  Expr *pOn, 
1a630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a640 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66  The ON clause of
1a650 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c   a join */.  IdL
1a660 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20 20 20  ist *pUsing     
1a670 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53 49 4e       /* The USIN
1a680 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f  G clause of a jo
1a690 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  in */.){.  struc
1a6a0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1a6b0 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
1a6c0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1a6d0 62 3b 0a 20 20 69 66 28 20 21 70 20 26 26 20 28  b;.  if( !p && (
1a6e0 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29 20 29  pOn || pUsing) )
1a6f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
1a700 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
1a710 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69 73 20   JOIN clause is 
1a720 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20  required before 
1a730 25 73 22 2c 20 0a 20 20 20 20 20 20 28 70 4f 6e  %s", .      (pOn
1a740 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49 4e 47   ? "ON" : "USING
1a750 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 67 6f  ").    );.    go
1a760 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65  to append_from_e
1a770 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  rror;.  }.  p = 
1a780 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1a790 70 65 6e 64 28 64 62 2c 20 70 2c 20 70 54 61 62  pend(db, p, pTab
1a7a0 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a  le, pDatabase);.
1a7b0 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45    if( p==0 || NE
1a7c0 56 45 52 28 70 2d 3e 6e 53 72 63 3d 3d 30 29 20  VER(p->nSrc==0) 
1a7d0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65  ){.    goto appe
1a7e0 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20  nd_from_error;. 
1a7f0 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d   }.  pItem = &p-
1a800 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20  >a[p->nSrc-1];. 
1a810 20 61 73 73 65 72 74 28 20 70 41 6c 69 61 73 21   assert( pAlias!
1a820 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 41 6c 69  =0 );.  if( pAli
1a830 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74  as->n ){.    pIt
1a840 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c  em->zAlias = sql
1a850 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1a860 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20  n(db, pAlias);. 
1a870 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c   }.  pItem->pSel
1a880 65 63 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b  ect = pSubquery;
1a890 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20  .  pItem->pOn = 
1a8a0 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55  pOn;.  pItem->pU
1a8b0 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20  sing = pUsing;. 
1a8c0 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70   return p;.. app
1a8d0 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a  end_from_error:.
1a8e0 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29    assert( p==0 )
1a8f0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
1a900 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a  elete(db, pOn);.
1a910 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
1a920 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69 6e 67  elete(db, pUsing
1a930 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
1a940 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75  ctDelete(db, pSu
1a950 62 71 75 65 72 79 29 3b 0a 20 20 72 65 74 75 72  bquery);.  retur
1a960 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n 0;.}../*.** Ad
1a970 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  d an INDEXED BY 
1a980 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63  or NOT INDEXED c
1a990 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d 6f 73  lause to the mos
1a9a0 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
1a9b0 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20   .** element of 
1a9c0 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20  the source-list 
1a9d0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
1a9e0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
1a9f0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
1aa00 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 50  cListIndexedBy(P
1aa10 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
1aa20 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20  cList *p, Token 
1aa30 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a 20 20  *pIndexedBy){.  
1aa40 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 65 64  assert( pIndexed
1aa50 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  By!=0 );.  if( p
1aa60 20 26 26 20 41 4c 57 41 59 53 28 70 2d 3e 6e 53   && ALWAYS(p->nS
1aa70 72 63 3e 30 29 20 29 7b 0a 20 20 20 20 73 74 72  rc>0) ){.    str
1aa80 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1aa90 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b   *pItem = &p->a[
1aaa0 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20  p->nSrc-1];.    
1aab0 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 6e  assert( pItem->n
1aac0 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 26 26 20  otIndexed==0 && 
1aad0 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 3d 3d 30  pItem->zIndex==0
1aae0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64   );.    if( pInd
1aaf0 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20  exedBy->n==1 && 
1ab00 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29  !pIndexedBy->z )
1ab10 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f  {.      /* A "NO
1ab20 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75 73  T INDEXED" claus
1ab30 65 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e 20  e was supplied. 
1ab40 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20 20  See parse.y .   
1ab50 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20     ** construct 
1ab60 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66 6f  "indexed_opt" fo
1ab70 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20  r details. */.  
1ab80 20 20 20 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e      pItem->notIn
1ab90 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  dexed = 1;.    }
1aba0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
1abb0 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69  m->zIndex = sqli
1abc0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1abd0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e  (pParse->db, pIn
1abe0 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a  dexedBy);.    }.
1abf0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65    }.}../*.** Whe
1ac00 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61 20  n building up a 
1ac10 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74  FROM clause in t
1ac20 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 20 6a  he parser, the j
1ac30 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20  oin operator.** 
1ac40 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74 74  is initially att
1ac50 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66  ached to the lef
1ac60 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74 20  t operand.  But 
1ac70 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
1ac80 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74 68  or.** expects th
1ac90 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
1aca0 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69 67  to be on the rig
1acb0 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  ht operand.  Thi
1acc0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69  s routine.** Shi
1acd0 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65  fts all join ope
1ace0 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74  rators from left
1acf0 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61 6e   to right for an
1ad00 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20   entire FROM.** 
1ad10 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78  clause..**.** Ex
1ad20 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20 74  ample: Suppose t
1ad30 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20  he join is like 
1ad40 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
1ad50 20 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c 20        A natural 
1ad60 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a  cross join B.**.
1ad70 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20  ** The operator 
1ad80 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f 73  is "natural cros
1ad90 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41 20  s join".  The A 
1ada0 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20 61  and B operands a
1adb0 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  re stored.** in 
1adc0 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61  p->a[0] and p->a
1add0 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65 6c  [1], respectivel
1ade0 79 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  y.  The parser i
1adf0 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73 20  nitially stores 
1ae00 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20  the.** operator 
1ae10 77 69 74 68 20 41 2e 20 20 54 68 69 73 20 72 6f  with A.  This ro
1ae20 75 74 69 6e 65 20 73 68 69 66 74 73 20 74 68 61  utine shifts tha
1ae30 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72 20  t operator over 
1ae40 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  to B..*/.void sq
1ae50 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68 69 66  lite3SrcListShif
1ae60 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69 73  tJoinType(SrcLis
1ae70 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 26  t *p){.  if( p &
1ae80 26 20 70 2d 3e 61 20 29 7b 0a 20 20 20 20 69 6e  & p->a ){.    in
1ae90 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70  t i;.    for(i=p
1aea0 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69  ->nSrc-1; i>0; i
1aeb0 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b  --){.      p->a[
1aec0 69 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d  i].jointype = p-
1aed0 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65  >a[i-1].jointype
1aee0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61  ;.    }.    p->a
1aef0 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30  [0].jointype = 0
1af00 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  ;.  }.}../*.** B
1af10 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  egin a transacti
1af20 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
1af30 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69  e3BeginTransacti
1af40 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
1af50 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73  , int type){.  s
1af60 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
1af70 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a  be *v;.  int i;.
1af80 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1af90 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  e!=0 );.  db = p
1afa0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73  Parse->db;.  ass
1afb0 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 2f 2a  ert( db!=0 );./*
1afc0 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 30 5d    if( db->aDb[0]
1afd0 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  .pBt==0 ) return
1afe0 3b 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  ; */.  if( sqlit
1aff0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1b000 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
1b010 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c  ACTION, "BEGIN",
1b020 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65   0, 0) ){.    re
1b030 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20  turn;.  }.  v = 
1b040 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1b050 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76  Parse);.  if( !v
1b060 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1b070 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52   type!=TK_DEFERR
1b080 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ED ){.    for(i=
1b090 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
1b0a0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
1b0b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b0c0 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  P_Transaction, i
1b0d0 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c  , (type==TK_EXCL
1b0e0 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 20  USIVE)+1);.     
1b0f0 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
1b100 42 74 72 65 65 28 76 2c 20 69 29 3b 0a 20 20 20  Btree(v, i);.   
1b110 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
1b120 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b130 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20  _AutoCommit, 0, 
1b140 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  0);.}../*.** Com
1b150 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  mit a transactio
1b160 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
1b170 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69  3CommitTransacti
1b180 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
1b190 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1b1a0 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
1b1b0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d  assert( pParse!=
1b1c0 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  0 );.  db = pPar
1b1d0 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
1b1e0 28 20 64 62 21 3d 30 20 29 3b 0a 2f 2a 20 20 69  ( db!=0 );./*  i
1b1f0 66 28 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  f( db->aDb[0].pB
1b200 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 2a  t==0 ) return; *
1b210 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  /.  if( sqlite3A
1b220 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
1b230 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
1b240 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30  ION, "COMMIT", 0
1b250 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , 0) ){.    retu
1b260 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71  rn;.  }.  v = sq
1b270 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1b280 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
1b290 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1b2a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74  AddOp2(v, OP_Aut
1b2b0 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a  oCommit, 1, 0);.
1b2c0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c    }.}../*.** Rol
1b2d0 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74  lback a transact
1b2e0 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
1b2f0 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73  te3RollbackTrans
1b300 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
1b310 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
1b320 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
1b330 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
1b340 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20  se!=0 );.  db = 
1b350 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
1b360 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 2f  sert( db!=0 );./
1b370 2a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 30  *  if( db->aDb[0
1b380 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
1b390 6e 3b 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  n; */.  if( sqli
1b3a0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1b3b0 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
1b3c0 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41  SACTION, "ROLLBA
1b3d0 43 4b 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  CK", 0, 0) ){.  
1b3e0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1b3f0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1b400 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1b410 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
1b420 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b430 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
1b440 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 1);.  }.}../*.
1b450 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1b460 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
1b470 65 20 70 61 72 73 65 72 20 77 68 65 6e 20 69 74  e parser when it
1b480 20 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e   parses a comman
1b490 64 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20  d to create,.** 
1b4a0 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
1b4b0 61 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70  ack an SQL savep
1b4c0 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  oint. .*/.void s
1b4d0 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28  qlite3Savepoint(
1b4e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1b4f0 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e  nt op, Token *pN
1b500 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
1b510 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
1b520 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
1b530 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  e->db, pName);. 
1b540 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
1b550 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
1b560 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1b570 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
1b580 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
1b590 41 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63  ATION.    static
1b5a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f   const char * co
1b5b0 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45  nst az[] = { "BE
1b5c0 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c  GIN", "RELEASE",
1b5d0 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20   "ROLLBACK" };. 
1b5e0 20 20 20 61 73 73 65 72 74 28 20 21 53 41 56 45     assert( !SAVE
1b5f0 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53  POINT_BEGIN && S
1b600 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
1b610 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54  ==1 && SAVEPOINT
1b620 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a  _ROLLBACK==2 );.
1b630 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21  #endif.    if( !
1b640 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68  v || sqlite3Auth
1b650 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1b660 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20  LITE_SAVEPOINT, 
1b670 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30  az[op], zName, 0
1b680 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
1b690 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
1b6a0 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  >db, zName);.   
1b6b0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
1b6c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1b6d0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76  AddOp4(v, OP_Sav
1b6e0 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30  epoint, op, 0, 0
1b6f0 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41  , zName, P4_DYNA
1b700 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  MIC);.  }.}../*.
1b710 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
1b720 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69   TEMP database i
1b730 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c  s open and avail
1b740 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52  able for use.  R
1b750 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d  eturn.** the num
1b760 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
1b770 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20  Leave any error 
1b780 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20  messages in the 
1b790 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
1b7a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b7b0 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65  OpenTempDatabase
1b7c0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
1b7d0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1b7e0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
1b7f0 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  f( db->aDb[1].pB
1b800 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d  t==0 && !pParse-
1b810 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
1b820 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72 65  int rc;.    Btre
1b830 65 20 2a 70 42 74 3b 0a 20 20 20 20 73 74 61 74  e *pBt;.    stat
1b840 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61  ic const int fla
1b850 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  gs = .          
1b860 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1b870 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20  WRITE |.        
1b880 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
1b890 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  EATE |.         
1b8a0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
1b8b0 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20  LUSIVE |.       
1b8c0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
1b8d0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20  ELETEONCLOSE |. 
1b8e0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1b8f0 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20  OPEN_TEMP_DB;.. 
1b900 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1b910 74 72 65 65 4f 70 65 6e 28 30 2c 20 64 62 2c 20  treeOpen(0, db, 
1b920 26 70 42 74 2c 20 30 2c 20 66 6c 61 67 73 29 3b  &pBt, 0, flags);
1b930 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1b940 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b950 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1b960 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
1b970 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
1b980 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20  ary database ". 
1b990 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72         "file for
1b9a0 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61   storing tempora
1b9b0 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20  ry tables");.   
1b9c0 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
1b9d0 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
1b9e0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62   1;.    }.    db
1b9f0 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20 3d 20 70  ->aDb[1].pBt = p
1ba00 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
1ba10 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
1ba20 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51  ma );.    if( SQ
1ba30 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69  LITE_NOMEM==sqli
1ba40 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
1ba50 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65 78  ize(pBt, db->nex
1ba60 74 50 61 67 65 73 69 7a 65 2c 20 2d 31 2c 20 30  tPagesize, -1, 0
1ba70 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d  ) ){.      db->m
1ba80 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
1ba90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1baa0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1bab0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1bac0 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
1bad0 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72  de that will ver
1bae0 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63  ify the schema c
1baf0 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a  ookie and start.
1bb00 2a 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  ** a read-transa
1bb10 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61  ction for all na
1bb20 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
1bb30 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  es..**.** It is 
1bb40 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
1bb50 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  ll schema cookie
1bb60 73 20 62 65 20 76 65 72 69 66 69 65 64 20 61 6e  s be verified an
1bb70 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72  d all.** read tr
1bb80 61 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74  ansactions be st
1bb90 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79  arted before any
1bba0 74 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65  thing else happe
1bbb0 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42  ns in.** the VDB
1bbc0 45 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20  E program.  But 
1bbd0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
1bbe0 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
1bbf0 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63   much other.** c
1bc00 6f 64 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e  ode has been gen
1bc10 65 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65  erated.  So here
1bc20 20 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a   is what we do:.
1bc30 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
1bc40 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e  time this routin
1bc50 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20  e is called, we 
1bc60 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20  code an OP_Goto 
1bc70 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d  that.** will jum
1bc80 70 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e  p to a subroutin
1bc90 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
1bca0 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68  the program.  Th
1bcb0 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20  en we.** record 
1bcc0 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20 74  every database t
1bcd0 68 61 74 20 6e 65 65 64 73 20 69 74 73 20 73 63  hat needs its sc
1bce0 68 65 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e  hema verified in
1bcf0 20 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e   the.** pParse->
1bd00 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64  cookieMask field
1bd10 2e 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20  .  Later, after 
1bd20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68  all other code h
1bd30 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72  as been.** gener
1bd40 61 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75  ated, the subrou
1bd50 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74  tine that does t
1bd60 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  he cookie verifi
1bd70 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73  cations and.** s
1bd80 74 61 72 74 73 20 74 68 65 20 74 72 61 6e 73 61  tarts the transa
1bd90 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63  ctions will be c
1bda0 6f 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f  oded and the OP_
1bdb0 47 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a  Goto P2 value.**
1bdc0 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f   will be made to
1bdd0 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73   point to that s
1bde0 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
1bdf0 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68  generation of th
1be00 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69  e.** cookie veri
1be10 66 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74  fication subrout
1be20 69 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73  ine code happens
1be30 20 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73   in sqlite3Finis
1be40 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a  hCoding()..**.**
1be50 20 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20 63   If iDb<0 then c
1be60 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20  ode the OP_Goto 
1be70 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65 74  only - don't set
1be80 20 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79 20   flag to verify 
1be90 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e  the.** schema on
1bea0 20 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e 20   any databases. 
1beb0 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
1bec0 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68  d to position th
1bed0 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72  e OP_Goto.** ear
1bee0 6c 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c 20  ly in the code, 
1bef0 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69  before we know i
1bf00 66 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 74  f any database t
1bf10 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75 73  ables will be us
1bf20 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
1bf30 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
1bf40 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  ema(Parse *pPars
1bf50 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50  e, int iDb){.  P
1bf60 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
1bf70 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
1bf80 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
1bf90 0a 20 20 69 66 28 20 70 54 6f 70 6c 65 76 65 6c  .  if( pToplevel
1bfa0 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20  ->cookieGoto==0 
1bfb0 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
1bfc0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1bfd0 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20  pToplevel);.    
1bfe0 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
1bff0 6e 3b 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79  n;  /* This only
1c000 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 72   happens if ther
1c010 65 20 77 61 73 20 61 20 70 72 69 6f 72 20 65 72  e was a prior er
1c020 72 6f 72 20 2a 2f 0a 20 20 20 20 70 54 6f 70 6c  ror */.    pTopl
1c030 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  evel->cookieGoto
1c040 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1c050 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
1c060 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a 20 20   0, 0)+1;.  }.  
1c070 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20  if( iDb>=0 ){.  
1c080 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1c090 70 54 6f 70 6c 65 76 65 6c 2d 3e 64 62 3b 0a 20  pToplevel->db;. 
1c0a0 20 20 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b     yDbMask mask;
1c0b0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  ..    assert( iD
1c0c0 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20  b<db->nDb );.   
1c0d0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
1c0e0 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20  [iDb].pBt!=0 || 
1c0f0 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73  iDb==1 );.    as
1c100 73 65 72 74 28 20 69 44 62 3c 53 51 4c 49 54 45  sert( iDb<SQLITE
1c110 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2b 32 20  _MAX_ATTACHED+2 
1c120 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
1c130 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
1c140 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
1c150 29 20 29 3b 0a 20 20 20 20 6d 61 73 6b 20 3d 20  ) );.    mask = 
1c160 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 44  ((yDbMask)1)<<iD
1c170 62 3b 0a 20 20 20 20 69 66 28 20 28 70 54 6f 70  b;.    if( (pTop
1c180 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73  level->cookieMas
1c190 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a  k & mask)==0 ){.
1c1a0 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d        pToplevel-
1c1b0 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d  >cookieMask |= m
1c1c0 61 73 6b 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c  ask;.      pTopl
1c1d0 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75  evel->cookieValu
1c1e0 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62  e[iDb] = db->aDb
1c1f0 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73  [iDb].pSchema->s
1c200 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20  chema_cookie;.  
1c210 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
1c220 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
1c230 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c240 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
1c250 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20  e(pToplevel);.  
1c260 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1c270 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1c280 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74  e VDBE code that
1c290 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f   prepares for do
1c2a0 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  ing an operation
1c2b0 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63   that.** might c
1c2c0 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61  hange the databa
1c2d0 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
1c2e0 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20  outine starts a 
1c2f0 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  new transaction 
1c300 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c  if we are not al
1c310 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20  ready within.** 
1c320 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  a transaction.  
1c330 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64  If we are alread
1c340 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  y within a trans
1c350 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63  action, then a c
1c360 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20  heckpoint.** is 
1c370 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53 74  set if the setSt
1c380 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65  atement paramete
1c390 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68  r is true.  A ch
1c3a0 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a  eckpoint should.
1c3b0 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70  ** be set for op
1c3c0 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69  erations that mi
1c3d0 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f  ght fail (due to
1c3e0 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70   a constraint) p
1c3f0 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61  art of.** the wa
1c400 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68  y through and wh
1c410 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  ich will need to
1c420 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65   undo some write
1c430 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  s without having
1c440 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20   to.** rollback 
1c450 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61  the whole transa
1c460 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72  ction.  For oper
1c470 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c  ations where all
1c480 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20   constraints.** 
1c490 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62  can be checked b
1c4a0 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
1c4b0 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68  s are made to th
1c4c0 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69  e database, it i
1c4d0 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73  s never.** neces
1c4e0 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77  sary to undo a w
1c4f0 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65  rite and the che
1c500 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e  ckpoint should n
1c510 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ot be set..*/.vo
1c520 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57  id sqlite3BeginW
1c530 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61  riteOperation(Pa
1c540 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1c550 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69   setStatement, i
1c560 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65  nt iDb){.  Parse
1c570 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
1c580 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
1c590 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  el(pParse);.  sq
1c5a0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
1c5b0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
1c5c0 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d  b);.  pToplevel-
1c5d0 3e 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20 28 28  >writeMask |= ((
1c5e0 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 44 62 3b  yDbMask)1)<<iDb;
1c5f0 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73  .  pToplevel->is
1c600 4d 75 6c 74 69 57 72 69 74 65 20 7c 3d 20 73 65  MultiWrite |= se
1c610 74 53 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f  tStatement;.}../
1c620 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
1c630 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  at the statement
1c640 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
1c650 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6d 69   construction mi
1c660 67 68 74 20 77 72 69 74 65 0a 2a 2a 20 6d 6f 72  ght write.** mor
1c670 65 20 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72 79  e than one entry
1c680 20 28 65 78 61 6d 70 6c 65 3a 20 64 65 6c 65 74   (example: delet
1c690 69 6e 67 20 6f 6e 65 20 72 6f 77 20 74 68 65 6e  ing one row then
1c6a0 20 69 6e 73 65 72 74 69 6e 67 20 61 6e 6f 74 68   inserting anoth
1c6b0 65 72 2c 0a 2a 2a 20 69 6e 73 65 72 74 69 6e 67  er,.** inserting
1c6c0 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 69   multiple rows i
1c6d0 6e 20 61 20 74 61 62 6c 65 2c 20 6f 72 20 69 6e  n a table, or in
1c6e0 73 65 72 74 69 6e 67 20 61 20 72 6f 77 20 61 6e  serting a row an
1c6f0 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 2e  d index entries.
1c700 29 0a 2a 2a 20 49 66 20 61 6e 20 61 62 6f 72 74  ).** If an abort
1c710 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 73 6f   occurs after so
1c720 6d 65 20 6f 66 20 74 68 65 73 65 20 77 72 69 74  me of these writ
1c730 65 73 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65  es have complete
1c740 64 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 0a  d, then it will.
1c750 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20  ** be necessary 
1c760 74 6f 20 75 6e 64 6f 20 74 68 65 20 63 6f 6d 70  to undo the comp
1c770 6c 65 74 65 64 20 77 72 69 74 65 73 2e 0a 2a 2f  leted writes..*/
1c780 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 75 6c  .void sqlite3Mul
1c790 74 69 57 72 69 74 65 28 50 61 72 73 65 20 2a 70  tiWrite(Parse *p
1c7a0 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20  Parse){.  Parse 
1c7b0 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
1c7c0 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
1c7d0 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f  l(pParse);.  pTo
1c7e0 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57  plevel->isMultiW
1c7f0 72 69 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20  rite = 1;.}../* 
1c800 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  .** The code gen
1c810 65 72 61 74 6f 72 20 63 61 6c 6c 73 20 74 68 69  erator calls thi
1c820 73 20 72 6f 75 74 69 6e 65 20 69 66 20 69 73 20  s routine if is 
1c830 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 69  discovers that i
1c840 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65  t is.** possible
1c850 20 74 6f 20 61 62 6f 72 74 20 61 20 73 74 61 74   to abort a stat
1c860 65 6d 65 6e 74 20 70 72 69 6f 72 20 74 6f 20 63  ement prior to c
1c870 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 6e 20 6f  ompletion.  In o
1c880 72 64 65 72 20 74 6f 20 0a 2a 2a 20 70 65 72 66  rder to .** perf
1c890 6f 72 6d 20 74 68 69 73 20 61 62 6f 72 74 20 77  orm this abort w
1c8a0 69 74 68 6f 75 74 20 63 6f 72 72 75 70 74 69 6e  ithout corruptin
1c8b0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  g the database, 
1c8c0 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 0a  we need to make.
1c8d0 2a 2a 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ** sure that the
1c8e0 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 72   statement is pr
1c8f0 6f 74 65 63 74 65 64 20 62 79 20 61 20 73 74 61  otected by a sta
1c900 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
1c910 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69  on..**.** Techni
1c920 63 61 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79 20 6e  cally, we only n
1c930 65 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 6d  eed to set the m
1c940 61 79 41 62 6f 72 74 20 66 6c 61 67 20 69 66 20  ayAbort flag if 
1c950 74 68 65 0a 2a 2a 20 69 73 4d 75 6c 74 69 57 72  the.** isMultiWr
1c960 69 74 65 20 66 6c 61 67 20 77 61 73 20 70 72 65  ite flag was pre
1c970 76 69 6f 75 73 6c 79 20 73 65 74 2e 20 20 54 68  viously set.  Th
1c980 65 72 65 20 69 73 20 61 20 74 69 6d 65 20 64 65  ere is a time de
1c990 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 73 75 63 68  pendency.** such
1c9a0 20 74 68 61 74 20 74 68 65 20 61 62 6f 72 74 20   that the abort 
1c9b0 6d 75 73 74 20 6f 63 63 75 72 20 61 66 74 65 72  must occur after
1c9c0 20 74 68 65 20 6d 75 6c 74 69 77 72 69 74 65 2e   the multiwrite.
1c9d0 20 20 54 68 69 73 20 6d 61 6b 65 73 0a 2a 2a 20    This makes.** 
1c9e0 73 6f 6d 65 20 73 74 61 74 65 6d 65 6e 74 73 20  some statements 
1c9f0 69 6e 76 6f 6c 76 69 6e 67 20 74 68 65 20 52 45  involving the RE
1ca00 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74 20 72  PLACE conflict r
1ca10 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
1ca20 74 68 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69 74 74  thm.** go a litt
1ca30 6c 65 20 66 61 73 74 65 72 2e 20 20 42 75 74 20  le faster.  But 
1ca40 74 61 6b 69 6e 67 20 61 64 76 61 6e 74 61 67 65  taking advantage
1ca50 20 6f 66 20 74 68 69 73 20 74 69 6d 65 20 64 65   of this time de
1ca60 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65  pendency.** make
1ca70 73 20 69 74 20 6d 6f 72 65 20 64 69 66 66 69 63  s it more diffic
1ca80 75 6c 74 20 74 6f 20 70 72 6f 76 65 20 74 68 61  ult to prove tha
1ca90 74 20 74 68 65 20 63 6f 64 65 20 69 73 20 63 6f  t the code is co
1caa0 72 72 65 63 74 20 28 69 6e 20 0a 2a 2a 20 70 61  rrect (in .** pa
1cab0 72 74 69 63 75 6c 61 72 2c 20 69 74 20 70 72 65  rticular, it pre
1cac0 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 77 72  vents us from wr
1cad0 69 74 69 6e 67 20 61 6e 20 65 66 66 65 63 74 69  iting an effecti
1cae0 76 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  ve.** implementa
1caf0 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 41  tion of sqlite3A
1cb00 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 29  ssertMayAbort())
1cb10 20 61 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20   and so we have 
1cb20 63 68 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b  chosen.** to tak
1cb30 65 20 74 68 65 20 73 61 66 65 20 72 6f 75 74 65  e the safe route
1cb40 20 61 6e 64 20 73 6b 69 70 20 74 68 65 20 6f 70   and skip the op
1cb50 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  timization..*/.v
1cb60 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 79 41 62  oid sqlite3MayAb
1cb70 6f 72 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ort(Parse *pPars
1cb80 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  e){.  Parse *pTo
1cb90 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
1cba0 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
1cbb0 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76  arse);.  pToplev
1cbc0 65 6c 2d 3e 6d 61 79 41 62 6f 72 74 20 3d 20 31  el->mayAbort = 1
1cbd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  ;.}../*.** Code 
1cbe0 61 6e 20 4f 50 5f 48 61 6c 74 20 74 68 61 74 20  an OP_Halt that 
1cbf0 63 61 75 73 65 73 20 74 68 65 20 76 64 62 65 20  causes the vdbe 
1cc00 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  to return an SQL
1cc10 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 2a  ITE_CONSTRAINT.*
1cc20 2a 20 65 72 72 6f 72 2e 20 54 68 65 20 6f 6e 45  * error. The onE
1cc30 72 72 6f 72 20 70 61 72 61 6d 65 74 65 72 20 64  rror parameter d
1cc40 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20  etermines which 
1cc50 28 69 66 20 61 6e 79 29 20 6f 66 20 74 68 65 20  (if any) of the 
1cc60 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64  statement.** and
1cc70 2f 6f 72 20 63 75 72 72 65 6e 74 20 74 72 61 6e  /or current tran
1cc80 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
1cc90 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  d back..*/.void 
1cca0 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
1ccb0 72 61 69 6e 74 28 50 61 72 73 65 20 2a 70 50 61  raint(Parse *pPa
1ccc0 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72  rse, int onError
1ccd0 2c 20 63 68 61 72 20 2a 70 34 2c 20 69 6e 74 20  , char *p4, int 
1cce0 70 34 74 79 70 65 29 7b 0a 20 20 56 64 62 65 20  p4type){.  Vdbe 
1ccf0 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
1cd00 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
1cd10 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41  f( onError==OE_A
1cd20 62 6f 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  bort ){.    sqli
1cd30 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
1cd40 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  se);.  }.  sqlit
1cd50 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1cd60 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f  OP_Halt, SQLITE_
1cd70 43 4f 4e 53 54 52 41 49 4e 54 2c 20 6f 6e 45 72  CONSTRAINT, onEr
1cd80 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34 74 79  ror, 0, p4, p4ty
1cd90 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  pe);.}../*.** Ch
1cda0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49  eck to see if pI
1cdb0 6e 64 65 78 20 75 73 65 73 20 74 68 65 20 63 6f  ndex uses the co
1cdc0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1cdd0 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a   pColl.  Return.
1cde0 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20 64 6f  ** true if it do
1cdf0 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  es and false if 
1ce00 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a  it does not..*/.
1ce10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ce20 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
1ce30 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e  ic int collation
1ce40 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72  Match(const char
1ce50 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a   *zColl, Index *
1ce60 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69  pIndex){.  int i
1ce70 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c  ;.  assert( zCol
1ce80 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  l!=0 );.  for(i=
1ce90 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f  0; i<pIndex->nCo
1cea0 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
1ceb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1cec0 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
1ced0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  ];.    assert( z
1cee0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 30  !=0 );.    if( 0
1cef0 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
1cf00 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  (z, zColl) ){.  
1cf10 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1cf20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1cf30 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
1cf40 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c  .** Recompute al
1cf50 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61  l indices of pTa
1cf60 62 20 74 68 61 74 20 75 73 65 20 74 68 65 20 63  b that use the c
1cf70 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1cf80 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70  e pColl..** If p
1cf90 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63  Coll==0 then rec
1cfa0 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
1cfb0 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23  es of pTab..*/.#
1cfc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1cfd0 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
1cfe0 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61  c void reindexTa
1cff0 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
1d000 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
1d010 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
1d020 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  l){.  Index *pIn
1d030 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
1d040 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
1d050 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
1d060 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e  ab */..  for(pIn
1d070 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  dex=pTab->pIndex
1d080 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
1d090 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b  =pIndex->pNext){
1d0a0 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d  .    if( zColl==
1d0b0 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61  0 || collationMa
1d0c0 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65  tch(zColl, pInde
1d0d0 78 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  x) ){.      int 
1d0e0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
1d0f0 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
1d100 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
1d110 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  hema);.      sql
1d120 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
1d130 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
1d140 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  0, iDb);.      s
1d150 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
1d160 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
1d170 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , -1);.    }.  }
1d180 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1d190 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
1d1a0 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61  ndices of all ta
1d1b0 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61  bles in all data
1d1c0 62 61 73 65 73 20 77 68 65 72 65 20 74 68 65 0a  bases where the.
1d1d0 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20 74  ** indices use t
1d1e0 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
1d1f0 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66  uence pColl.  If
1d200 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72   pColl==0 then r
1d210 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20  ecompute.** all 
1d220 69 6e 64 69 63 65 73 20 65 76 65 72 79 77 68 65  indices everywhe
1d230 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  re..*/.#ifndef S
1d240 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
1d250 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  EX.static void r
1d260 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
1d270 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
1d280 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c  har const *zColl
1d290 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  ){.  Db *pDb;   
1d2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2b0 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74   /* A single dat
1d2c0 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  abase */.  int i
1d2d0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
1d2e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
1d2f0 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d  tabase index num
1d300 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ber */.  sqlite3
1d310 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1d320 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  b;   /* The data
1d330 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1d340 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b  */.  HashElem *k
1d350 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d360 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1d370 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70  over tables in p
1d380 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  Db */.  Table *p
1d390 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
1d3a0 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
1d3b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
1d3c0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
1d3d0 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c  ite3BtreeHoldsAl
1d3e0 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 20  lMutexes(db) ); 
1d3f0 20 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72 20 73   /* Needed for s
1d400 63 68 65 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a  chema access */.
1d410 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62    for(iDb=0, pDb
1d420 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62  =db->aDb; iDb<db
1d430 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44  ->nDb; iDb++, pD
1d440 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  b++){.    assert
1d450 28 20 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20  ( pDb!=0 );.    
1d460 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68  for(k=sqliteHash
1d470 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68  First(&pDb->pSch
1d480 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20  ema->tblHash);  
1d490 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e  k; k=sqliteHashN
1d4a0 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70  ext(k)){.      p
1d4b0 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71  Tab = (Table*)sq
1d4c0 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b  liteHashData(k);
1d4d0 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 54 61  .      reindexTa
1d4e0 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
1d4f0 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a  , zColl);.    }.
1d500 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
1d510 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1d520 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45  e for the REINDE
1d530 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  X command..**.**
1d540 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
1d550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d560 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a             -- 1.
1d570 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
1d580 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20  X  <collation>  
1d590 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
1d5a0 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  2.**        REIN
1d5b0 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  DEX  ?<database>
1d5c0 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d  .?<tablename>  -
1d5d0 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 3.**        RE
1d5e0 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73  INDEX  ?<databas
1d5f0 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20  e>.?<indexname> 
1d600 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d   -- 4.**.** Form
1d610 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e   1 causes all in
1d620 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74  dices in all att
1d630 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
1d640 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a  to be rebuilt..*
1d650 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64  * Form 2 rebuild
1d660 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e  s all indices in
1d670 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74   all databases t
1d680 68 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65  hat use the name
1d690 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66  d.** collating f
1d6a0 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20  unction.  Forms 
1d6b0 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20  3 and 4 rebuild 
1d6c0 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  the named index 
1d6d0 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65  or all.** indice
1d6e0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1d6f0 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  h the named tabl
1d700 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
1d710 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
1d720 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  X.void sqlite3Re
1d730 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  index(Parse *pPa
1d740 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  rse, Token *pNam
1d750 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  e1, Token *pName
1d760 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  2){.  CollSeq *p
1d770 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
1d780 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
1d790 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65  equence to be re
1d7a0 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c  indexed, or NULL
1d7b0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20   */.  char *z;  
1d7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7d0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74    /* Name of a t
1d7e0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f  able or index */
1d7f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1d800 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Db;            /
1d810 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
1d820 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c  tabase */.  Tabl
1d830 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
1d840 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62          /* A tab
1d850 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
1d860 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  se */.  Index *p
1d870 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
1d880 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
1d890 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1d8a0 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44  pTab */.  int iD
1d8b0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1d8c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1d8d0 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62  abase index numb
1d8e0 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
1d8f0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1d900 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
1d910 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1d920 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e  /.  Token *pObjN
1d930 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
1d940 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
1d950 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f  able or index to
1d960 20 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f   be reindexed */
1d970 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
1d980 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
1d990 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1d9a0 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
1d9b0 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a  ror message.  **
1d9c0 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61   and code in pPa
1d9d0 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  rse and return N
1d9e0 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51  ULL. */.  if( SQ
1d9f0 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
1da00 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
1da10 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
1da20 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61  ;.  }..  if( pNa
1da30 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  me1==0 ){.    re
1da40 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
1da50 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72  Parse, 0);.    r
1da60 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69  eturn;.  }else i
1da70 66 28 20 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d  f( NEVER(pName2=
1da80 3d 30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a  =0) || pName2->z
1da90 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
1daa0 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65  *zColl;.    asse
1dab0 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b  rt( pName1->z );
1dac0 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c  .    zColl = sql
1dad0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1dae0 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e  n(pParse->db, pN
1daf0 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 21  ame1);.    if( !
1db00 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a  zColl ) return;.
1db10 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1db20 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
1db30 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c  b, ENC(db), zCol
1db40 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  l, 0);.    if( p
1db50 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65  Coll ){.      re
1db60 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
1db70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  Parse, zColl);. 
1db80 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
1db90 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  ee(db, zColl);. 
1dba0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
1dbb0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
1dbc0 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
1dbd0 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
1dbe0 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
1dbf0 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
1dc00 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d  pName2, &pObjNam
1dc10 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20  e);.  if( iDb<0 
1dc20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20  ) return;.  z = 
1dc30 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1dc40 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d  oken(db, pObjNam
1dc50 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  e);.  if( z==0 )
1dc60 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d   return;.  zDb =
1dc70 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
1dc80 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  ame;.  pTab = sq
1dc90 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
1dca0 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66  b, z, zDb);.  if
1dcb0 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65  ( pTab ){.    re
1dcc0 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73  indexTable(pPars
1dcd0 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20  e, pTab, 0);.   
1dce0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1dcf0 62 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74 75 72  b, z);.    retur
1dd00 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20  n;.  }.  pIndex 
1dd10 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
1dd20 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a  ex(db, z, zDb);.
1dd30 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1dd40 64 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 49  db, z);.  if( pI
1dd50 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  ndex ){.    sqli
1dd60 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
1dd70 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
1dd80 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
1dd90 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
1dda0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
1ddb0 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  1);.    return;.
1ddc0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72    }.  sqlite3Err
1ddd0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
1dde0 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66  nable to identif
1ddf0 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20  y the object to 
1de00 62 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a  be reindexed");.
1de10 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1de20 52 65 74 75 72 6e 20 61 20 64 79 6e 61 6d 69 63  Return a dynamic
1de30 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 4b 65 79  ly allocated Key
1de40 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
1de50 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 0a  hat can be used.
1de60 2a 2a 20 77 69 74 68 20 4f 50 5f 4f 70 65 6e 52  ** with OP_OpenR
1de70 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65 6e 57 72  ead or OP_OpenWr
1de80 69 74 65 20 74 6f 20 61 63 63 65 73 73 20 64 61  ite to access da
1de90 74 61 62 61 73 65 20 69 6e 64 65 78 20 70 49 64  tabase index pId
1dea0 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  x..**.** If succ
1deb0 65 73 73 66 75 6c 2c 20 61 20 70 6f 69 6e 74 65  essful, a pointe
1dec0 72 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74 72  r to the new str
1ded0 75 63 74 75 72 65 20 69 73 20 72 65 74 75 72 6e  ucture is return
1dee0 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
1def0 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69  .** the caller i
1df00 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1df10 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  r calling sqlite
1df20 33 44 62 46 72 65 65 28 64 62 2c 20 29 20 6f 6e  3DbFree(db, ) on
1df30 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 0a 2a   the returned .*
1df40 2a 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 61 6e  * pointer. If an
1df50 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 6f   error occurs (o
1df60 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 6f 72 20  ut of memory or 
1df70 6d 69 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6f  missing collatio
1df80 6e 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65 29 2c  n .** sequence),
1df90 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
1dfa0 64 20 61 6e 64 20 74 68 65 20 73 74 61 74 65 20  d and the state 
1dfb0 6f 66 20 70 50 61 72 73 65 20 75 70 64 61 74 65  of pParse update
1dfc0 64 20 74 6f 20 72 65 66 6c 65 63 74 0a 2a 2a 20  d to reflect.** 
1dfd0 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 4b 65  the error..*/.Ke
1dfe0 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 49 6e  yInfo *sqlite3In
1dff0 64 65 78 4b 65 79 69 6e 66 6f 28 50 61 72 73 65  dexKeyinfo(Parse
1e000 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
1e010 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b  *pIdx){.  int i;
1e020 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49  .  int nCol = pI
1e030 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69  dx->nColumn;.  i
1e040 6e 74 20 6e 42 79 74 65 73 20 3d 20 73 69 7a 65  nt nBytes = size
1e050 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e  of(KeyInfo) + (n
1e060 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 43 6f  Col-1)*sizeof(Co
1e070 6c 6c 53 65 71 2a 29 20 2b 20 6e 43 6f 6c 3b 0a  llSeq*) + nCol;.
1e080 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1e090 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65  pParse->db;.  Ke
1e0a0 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 28 4b  yInfo *pKey = (K
1e0b0 65 79 49 6e 66 6f 20 2a 29 73 71 6c 69 74 65 33  eyInfo *)sqlite3
1e0c0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
1e0d0 20 6e 42 79 74 65 73 29 3b 0a 0a 20 20 69 66 28   nBytes);..  if(
1e0e0 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 70 4b 65   pKey ){.    pKe
1e0f0 79 2d 3e 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  y->db = pParse->
1e100 64 62 3b 0a 20 20 20 20 70 4b 65 79 2d 3e 61 53  db;.    pKey->aS
1e110 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 20 2a  ortOrder = (u8 *
1e120 29 26 28 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 6e  )&(pKey->aColl[n
1e130 43 6f 6c 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  Col]);.    asser
1e140 74 28 20 26 70 4b 65 79 2d 3e 61 53 6f 72 74 4f  t( &pKey->aSortO
1e150 72 64 65 72 5b 6e 43 6f 6c 5d 3d 3d 26 28 28 28  rder[nCol]==&(((
1e160 75 38 20 2a 29 70 4b 65 79 29 5b 6e 42 79 74 65  u8 *)pKey)[nByte
1e170 73 5d 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  s]) );.    for(i
1e180 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
1e190 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  {.      char *zC
1e1a0 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f  oll = pIdx->azCo
1e1b0 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73  ll[i];.      ass
1e1c0 65 72 74 28 20 7a 43 6f 6c 6c 20 29 3b 0a 20 20  ert( zColl );.  
1e1d0 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b      pKey->aColl[
1e1e0 69 5d 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  i] = sqlite3Loca
1e1f0 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
1e200 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , zColl);.      
1e210 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pKey->aSortOrder
1e220 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72  [i] = pIdx->aSor
1e230 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d  tOrder[i];.    }
1e240 0a 20 20 20 20 70 4b 65 79 2d 3e 6e 46 69 65 6c  .    pKey->nFiel
1e250 64 20 3d 20 28 75 31 36 29 6e 43 6f 6c 3b 0a 20  d = (u16)nCol;. 
1e260 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65   }..  if( pParse
1e270 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71  ->nErr ){.    sq
1e280 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1e290 70 4b 65 79 29 3b 0a 20 20 20 20 70 4b 65 79 20  pKey);.    pKey 
1e2a0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1e2b0 6e 20 70 4b 65 79 3b 0a 7d 0a                    n pKey;.}.