/ Hex Artifact Content
Login

Artifact 74baa2d6d63535c9fc82e0d51d3e5d1145614473:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t.h"../*.** This
02f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
0300: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 53 51  ed when a new SQ
0310: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 62  L statement is b
0320: 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62  eginning to.** b
0330: 65 20 70 61 72 73 65 64 2e 20 20 49 6e 69 74 69  e parsed.  Initi
0340: 61 6c 69 7a 65 20 74 68 65 20 70 50 61 72 73 65  alize the pParse
0350: 20 73 74 72 75 63 74 75 72 65 20 61 73 20 6e 65   structure as ne
0360: 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eded..*/.void sq
0370: 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73 65 28  lite3BeginParse(
0380: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
0390: 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67 29 7b  nt explainFlag){
03a0: 0a 20 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  .  pParse->expla
03b0: 69 6e 20 3d 20 28 75 38 29 65 78 70 6c 61 69 6e  in = (u8)explain
03c0: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
03d0: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  nVar = 0;.}..#if
03e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
03f0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0400: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 4c 6f 63  .** The TableLoc
0410: 6b 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  k structure is o
0420: 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65 20  nly used by the 
0430: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0440: 28 29 20 61 6e 64 0a 2a 2a 20 63 6f 64 65 54 61  () and.** codeTa
0450: 62 6c 65 4c 6f 63 6b 73 28 29 20 66 75 6e 63 74  bleLocks() funct
0460: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ions..*/.struct 
0470: 54 61 62 6c 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  TableLock {.  in
0480: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
0490: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
04a0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
04b0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f  e table to be lo
04c0: 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  cked */.  int iT
04d0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ab;            /
04e0: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
04f0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0500: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
0510: 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20  8 isWriteLock;  
0520: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
0530: 77 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c  write lock.  Fal
0540: 73 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f  se for a read lo
0550: 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ck */.  const ch
0560: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
0570: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
0580: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  e */.};../*.** R
0590: 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
05a0: 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6c  hat we want to l
05b0: 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20 72  ock a table at r
05c0: 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a 2a  un-time.  .**.**
05d0: 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   The table to be
05e0: 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f 74   locked has root
05f0: 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20 69   page iTab and i
0600: 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61 62  s found in datab
0610: 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72 65  ase iDb..** A re
0620: 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c 6f  ad or a write lo
0630: 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e 20  ck can be taken 
0640: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73 57  depending on isW
0650: 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ritelock..**.** 
0660: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
0670: 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66 61  t records the fa
0680: 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ct that the lock
0690: 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54 68   is desired.  Th
06a0: 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61 6b  e.** code to mak
06b0: 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75 72  e the lock occur
06c0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
06d0: 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74 6f   a later call to
06e0: 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  .** codeTableLoc
06f0: 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75 72  ks() which occur
0700: 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  s during sqlite3
0710: 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
0720: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  */.void sqlite3T
0730: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72 73  ableLock(.  Pars
0740: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
0750: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0760: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
0770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
0780: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
0790: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
07a0: 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 20  e table to lock 
07b0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
07c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
07d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
07e0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c  he table to be l
07f0: 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69 73  ocked */.  u8 is
0800: 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f 2a  WriteLock,    /*
0810: 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69 74   True for a writ
0820: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73  e lock */.  cons
0830: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 2f  t char *zName  /
0840: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
0850: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
0860: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
0870: 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
0880: 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
0890: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
08a0: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 3b  i;.  int nBytes;
08b0: 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 3b  .  TableLock *p;
08c0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
08d0: 30 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  0 );..  for(i=0;
08e0: 20 69 3c 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54   i<pToplevel->nT
08f0: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0900: 20 20 20 20 70 20 3d 20 26 70 54 6f 70 6c 65 76      p = &pToplev
0910: 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69  el->aTableLock[i
0920: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 44  ];.    if( p->iD
0930: 62 3d 3d 69 44 62 20 26 26 20 70 2d 3e 69 54 61  b==iDb && p->iTa
0940: 62 3d 3d 69 54 61 62 20 29 7b 0a 20 20 20 20 20  b==iTab ){.     
0950: 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20   p->isWriteLock 
0960: 3d 20 28 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63  = (p->isWriteLoc
0970: 6b 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b  k || isWriteLock
0980: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
0990: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42  .    }.  }..  nB
09a0: 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 54 61  ytes = sizeof(Ta
09b0: 62 6c 65 4c 6f 63 6b 29 20 2a 20 28 70 54 6f 70  bleLock) * (pTop
09c0: 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63  level->nTableLoc
09d0: 6b 2b 31 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  k+1);.  pTopleve
09e0: 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 0a  l->aTableLock =.
09f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52        sqlite3DbR
0a00: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 54 6f  eallocOrFree(pTo
0a10: 70 6c 65 76 65 6c 2d 3e 64 62 2c 20 70 54 6f 70  plevel->db, pTop
0a20: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
0a30: 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  k, nBytes);.  if
0a40: 28 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61  ( pToplevel->aTa
0a50: 62 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  bleLock ){.    p
0a60: 20 3d 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61   = &pToplevel->a
0a70: 54 61 62 6c 65 4c 6f 63 6b 5b 70 54 6f 70 6c 65  TableLock[pTople
0a80: 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b  vel->nTableLock+
0a90: 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d  +];.    p->iDb =
0aa0: 20 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61   iDb;.    p->iTa
0ab0: 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d  b = iTab;.    p-
0ac0: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69  >isWriteLock = i
0ad0: 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20  sWriteLock;.    
0ae0: 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  p->zName = zName
0af0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
0b00: 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65  Toplevel->nTable
0b10: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 70 54  Lock = 0;.    pT
0b20: 6f 70 6c 65 76 65 6c 2d 3e 64 62 2d 3e 6d 61 6c  oplevel->db->mal
0b30: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
0b40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
0b50: 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b   an OP_TableLock
0b60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
0b70: 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b   each table lock
0b80: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 61  ed by the.** sta
0b90: 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75 72  tement (configur
0ba0: 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
0bb0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
0bc0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ))..*/.static vo
0bd0: 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  id codeTableLock
0be0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  s(Parse *pParse)
0bf0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0c00: 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70 56  e *pVdbe; ..  pV
0c10: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dbe = sqlite3Get
0c20: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
0c30: 61 73 73 65 72 74 28 20 70 56 64 62 65 21 3d 30  assert( pVdbe!=0
0c40: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47 65   ); /* sqlite3Ge
0c50: 74 56 64 62 65 20 63 61 6e 6e 6f 74 20 66 61 69  tVdbe cannot fai
0c60: 6c 3a 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  l: VDBE already 
0c70: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20  allocated */..  
0c80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
0c90: 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69  e->nTableLock; i
0ca0: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f  ++){.    TableLo
0cb0: 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d  ck *p = &pParse-
0cc0: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
0cd0: 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e      int p1 = p->
0ce0: 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  iDb;.    sqlite3
0cf0: 56 64 62 65 41 64 64 4f 70 34 28 70 56 64 62 65  VdbeAddOp4(pVdbe
0d00: 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20  , OP_TableLock, 
0d10: 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e  p1, p->iTab, p->
0d20: 69 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20  isWriteLock,.   
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f     p->zName, P4_
0d50: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  STATIC);.  }.}.#
0d60: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63  else.  #define c
0d70: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29  odeTableLocks(x)
0d80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0d90: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0da0: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0db0: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0dc0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0dd0: 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45  arsed and a VDBE
0de0: 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63   program to exec
0df0: 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ute that stateme
0e00: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0e10: 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72  repared.  This r
0e20: 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20  outine puts the 
0e30: 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65  finishing touche
0e40: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  s on the.** VDBE
0e50: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73   program and res
0e60: 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73  ets the pParse s
0e70: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
0e80: 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a   next.** parse..
0e90: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0ea0: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0eb0: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0ec0: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
0ed0: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
0ee0: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
0ef0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69  /.void sqlite3Fi
0f00: 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65  nishCoding(Parse
0f10: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
0f20: 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
0f30: 20 2a 76 3b 0a 0a 20 20 64 62 20 3d 20 70 50 61   *v;..  db = pPa
0f40: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64  rse->db;.  if( d
0f50: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0f60: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
0f70: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29  pParse->nested )
0f80: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
0f90: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
0fa0: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65 67 69  turn;..  /* Begi
0fb0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
0fc0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
0fd0: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
0fe0: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
0ff0: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1000: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1010: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1020: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1030: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1040: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1050: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1060: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
1070: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
1080: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1090: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
10a0: 48 61 6c 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  Halt);..    /* T
10b0: 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b 20 63  he cookie mask c
10c0: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69 74 20  ontains one bit 
10d0: 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73  for each databas
10e0: 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20 20 20  e file open..   
10f0: 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20 66 6f   ** (Bit 0 is fo
1100: 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20 69 73  r main, bit 1 is
1110: 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64 20 73   for temp, and s
1120: 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74 73 20  o forth.)  Bits 
1130: 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 66  are.    ** set f
1140: 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65  or each database
1150: 20 74 68 61 74 20 69 73 20 75 73 65 64 2e 20 20   that is used.  
1160: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1170: 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a 2a 20   start a.    ** 
1180: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 65  transaction on e
1190: 61 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73  ach used databas
11a0: 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66 79 20  e and to verify 
11b0: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
11c0: 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61 63 68  e.    ** on each
11d0: 20 75 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a   used database..
11e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
11f0: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
1200: 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 79 44 62  o>0 ){.      yDb
1210: 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 20 20 20  Mask mask;.     
1220: 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20   int iDb;.      
1230: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
1240: 65 72 65 28 76 2c 20 70 50 61 72 73 65 2d 3e 63  ere(v, pParse->c
1250: 6f 6f 6b 69 65 47 6f 74 6f 2d 31 29 3b 0a 20 20  ookieGoto-1);.  
1260: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 6d      for(iDb=0, m
1270: 61 73 6b 3d 31 3b 20 69 44 62 3c 64 62 2d 3e 6e  ask=1; iDb<db->n
1280: 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44  Db; mask<<=1, iD
1290: 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  b++){.        if
12a0: 28 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65  ( (mask & pParse
12b0: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30  ->cookieMask)==0
12c0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
12d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12e0: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
12f0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1300: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 4f  e3VdbeAddOp2(v,O
1310: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  P_Transaction, i
1320: 44 62 2c 20 28 6d 61 73 6b 20 26 20 70 50 61 72  Db, (mask & pPar
1330: 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d  se->writeMask)!=
1340: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
1350: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
1360: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
1370: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
1380: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
1390: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
13a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13b0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 56 65  eAddOp3(v, OP_Ve
13c0: 72 69 66 79 43 6f 6f 6b 69 65 2c 0a 20 20 20 20  rifyCookie,.    
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 20 20 20 20 69 44 62 2c 20 70 50 61          iDb, pPa
13f0: 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65  rse->cookieValue
1400: 5b 69 44 62 5d 2c 0a 20 20 20 20 20 20 20 20 20  [iDb],.         
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
1430: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
1440: 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  tion);.        }
1450: 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
1460: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1470: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
1480: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  {.        int i;
1490: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
14a0: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61  ; i<pParse->nVta
14b0: 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  bLock; i++){.   
14c0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 76 74 61         char *vta
14d0: 62 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  b = (char *)sqli
14e0: 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c  te3GetVTable(db,
14f0: 20 70 50 61 72 73 65 2d 3e 61 70 56 74 61 62 4c   pParse->apVtabL
1500: 6f 63 6b 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ock[i]);.       
1510: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1520: 64 4f 70 34 28 76 2c 20 4f 50 5f 56 42 65 67 69  dOp4(v, OP_VBegi
1530: 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 76 74 61 62  n, 0, 0, 0, vtab
1540: 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20  , P4_VTAB);.    
1550: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
1560: 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 20  arse->nVtabLock 
1570: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  = 0;.      }.#en
1580: 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  dif..      /* On
1590: 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69  ce all the cooki
15a0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72  es have been ver
15b0: 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61  ified and transa
15c0: 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a  ctions opened, .
15d0: 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20        ** obtain 
15e0: 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62  the required tab
15f0: 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69  le-locks. This i
1600: 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
1610: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73   the .      ** s
1620: 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74  hared-cache feat
1630: 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  ure is enabled..
1640: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
1650: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50  odeTableLocks(pP
1660: 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  arse);..      /*
1670: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20   Initialize any 
1680: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61  AUTOINCREMENT da
1690: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65  ta structures re
16a0: 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  quired..      */
16b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75  .      sqlite3Au
16c0: 74 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e  toincrementBegin
16d0: 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20  (pParse);..     
16e0: 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a 75 6d   /* Finally, jum
16f0: 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65  p back to the be
1700: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 65  ginning of the e
1710: 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65 2e 20  xecutable code. 
1720: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1730: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1740: 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65  _Goto, 0, pParse
1750: 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29 3b 0a 20  ->cookieGoto);. 
1760: 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20     }.  }...  /* 
1770: 47 65 74 20 74 68 65 20 56 44 42 45 20 70 72 6f  Get the VDBE pro
1780: 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72 20 65  gram ready for e
1790: 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20  xecution.  */.  
17a0: 69 66 28 20 76 20 26 26 20 41 4c 57 41 59 53 28  if( v && ALWAYS(
17b0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 29  pParse->nErr==0)
17c0: 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
17d0: 61 69 6c 65 64 20 29 7b 0a 23 69 66 64 65 66 20  ailed ){.#ifdef 
17e0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
17f0: 20 46 49 4c 45 20 2a 74 72 61 63 65 20 3d 20 28   FILE *trace = (
1800: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1810: 54 45 5f 56 64 62 65 54 72 61 63 65 29 21 3d 30  TE_VdbeTrace)!=0
1820: 20 3f 20 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20   ? stdout : 0;. 
1830: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72     sqlite3VdbeTr
1840: 61 63 65 28 76 2c 20 74 72 61 63 65 29 3b 0a 23  ace(v, trace);.#
1850: 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
1860: 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  ( pParse->iCache
1870: 4c 65 76 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20  Level==0 );  /* 
1880: 44 69 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d  Disables and re-
1890: 65 6e 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f  enables match */
18a0: 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75  .    /* A minimu
18b0: 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73 6f 72 20  m of one cursor 
18c0: 69 73 20 72 65 71 75 69 72 65 64 20 69 66 20 61  is required if a
18d0: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 69 73 20  utoincrement is 
18e0: 75 73 65 64 0a 20 20 20 20 2a 20 20 53 65 65 20  used.    *  See 
18f0: 74 69 63 6b 65 74 20 5b 61 36 39 36 33 37 39 63  ticket [a696379c
1900: 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20  1f08866] */.    
1910: 69 66 28 20 70 50 61 72 73 65 2d 3e 70 41 69 6e  if( pParse->pAin
1920: 63 21 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e  c!=0 && pParse->
1930: 6e 54 61 62 3d 3d 30 20 29 20 70 50 61 72 73 65  nTab==0 ) pParse
1940: 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 20 20  ->nTab = 1;.    
1950: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
1960: 65 61 64 79 28 76 2c 20 70 50 61 72 73 65 29 3b  eady(v, pParse);
1970: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
1980: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1990: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61     pParse->colNa
19a0: 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65  mesSet = 0;.  }e
19b0: 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  lse{.    pParse-
19c0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52  >rc = SQLITE_ERR
19d0: 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65  OR;.  }.  pParse
19e0: 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20 70 50  ->nTab = 0;.  pP
19f0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a  arse->nMem = 0;.
1a00: 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d    pParse->nSet =
1a10: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56   0;.  pParse->nV
1a20: 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ar = 0;.  pParse
1a30: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20 30  ->cookieMask = 0
1a40: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  ;.  pParse->cook
1a50: 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f  ieGoto = 0;.}../
1a60: 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70 61 72  *.** Run the par
1a70: 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ser and code gen
1a80: 65 72 61 74 6f 72 20 72 65 63 75 72 73 69 76 65  erator recursive
1a90: 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ly in order to g
1aa0: 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20  enerate.** code 
1ab0: 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74 61 74  for the SQL stat
1ac0: 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f  ement given onto
1ad0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1ae0: 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a  pParse context.*
1af0: 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  * currently unde
1b00: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
1b10: 20 57 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   When the parser
1b20: 20 69 73 20 72 75 6e 20 72 65 63 75 72 73 69 76   is run recursiv
1b30: 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c  ely.** this way,
1b40: 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61   the final OP_Ha
1b50: 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65 6e 64  lt is not append
1b60: 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69 6e 69  ed and other ini
1b70: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61  tialization.** a
1b80: 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  nd finalization 
1b90: 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74 74 65  steps are omitte
1ba0: 64 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20  d because those 
1bb0: 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62 79 20  are handling by 
1bc0: 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74  the.** outermost
1bd0: 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e   parser..**.** N
1be0: 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  ot everything is
1bf0: 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68 69 73   nestable.  This
1c00: 20 66 61 63 69 6c 69 74 79 20 69 73 20 64 65 73   facility is des
1c10: 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69 74 0a  igned to permit.
1c20: 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  ** INSERT, UPDAT
1c30: 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20 6f 70  E, and DELETE op
1c40: 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e 73 74  erations against
1c50: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20   SQLITE_MASTER. 
1c60: 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69 66 20   Use.** care if 
1c70: 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20 74 72  you decide to tr
1c80: 79 20 74 6f 20 75 73 65 20 74 68 69 73 20 72 6f  y to use this ro
1c90: 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f  utine for some o
1ca0: 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a  ther purposes..*
1cb0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4e 65  /.void sqlite3Ne
1cc0: 73 74 65 64 50 61 72 73 65 28 50 61 72 73 65 20  stedParse(Parse 
1cd0: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
1ce0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
1cf0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
1d00: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
1d10: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
1d20: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  = 0;.  sqlite3 *
1d30: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1d40: 0a 23 20 64 65 66 69 6e 65 20 53 41 56 45 5f 53  .# define SAVE_S
1d50: 5a 20 20 28 73 69 7a 65 6f 66 28 50 61 72 73 65  Z  (sizeof(Parse
1d60: 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 50 61 72  ) - offsetof(Par
1d70: 73 65 2c 6e 56 61 72 29 29 0a 20 20 63 68 61 72  se,nVar)).  char
1d80: 20 73 61 76 65 42 75 66 5b 53 41 56 45 5f 53 5a   saveBuf[SAVE_SZ
1d90: 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  ];..  if( pParse
1da0: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
1db0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1dc0: 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20  e->nested<10 ); 
1dd0: 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75   /* Nesting shou
1de0: 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69  ld only be of li
1df0: 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20  mited depth */. 
1e00: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
1e10: 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d  ormat);.  zSql =
1e20: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
1e30: 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  (db, zFormat, ap
1e40: 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
1e50: 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
1e60: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20  {.    return;   
1e70: 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74  /* A malloc must
1e80: 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a   have failed */.
1e90: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65    }.  pParse->ne
1ea0: 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79  sted++;.  memcpy
1eb0: 28 73 61 76 65 42 75 66 2c 20 26 70 50 61 72 73  (saveBuf, &pPars
1ec0: 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45 5f 53 5a  e->nVar, SAVE_SZ
1ed0: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61  );.  memset(&pPa
1ee0: 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c 20 53 41  rse->nVar, 0, SA
1ef0: 56 45 5f 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65  VE_SZ);.  sqlite
1f00: 33 52 75 6e 50 61 72 73 65 72 28 70 50 61 72 73  3RunParser(pPars
1f10: 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72 4d 73  e, zSql, &zErrMs
1f20: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
1f30: 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
1f40: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1f50: 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d  e(db, zSql);.  m
1f60: 65 6d 63 70 79 28 26 70 50 61 72 73 65 2d 3e 6e  emcpy(&pParse->n
1f70: 56 61 72 2c 20 73 61 76 65 42 75 66 2c 20 53 41  Var, saveBuf, SA
1f80: 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73 65  VE_SZ);.  pParse
1f90: 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f  ->nested--;.}../
1fa0: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
1fb0: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
1fc0: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
1fd0: 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
1fe0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c  database.** tabl
1ff0: 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  e given the name
2000: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
2010: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
2020: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
2030: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  ** database cont
2040: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
2050: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
2060: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  f not found..**.
2070: 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20  ** If zDatabase 
2080: 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61  is 0, all databa
2090: 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64  ses are searched
20a0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61   for the table a
20b0: 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  nd the.** first 
20c0: 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 69  matching table i
20d0: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f  s returned.  (No
20e0: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 75   checking for du
20f0: 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a  plicate table.**
2100: 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29   names is done.)
2110: 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64    The search ord
2120: 65 72 20 69 73 20 54 45 4d 50 20 66 69 72 73 74  er is TEMP first
2130: 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65  , then MAIN, the
2140: 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61  n any.** auxilia
2150: 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64  ry databases add
2160: 65 64 20 75 73 69 6e 67 20 74 68 65 20 41 54 54  ed using the ATT
2170: 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  ACH command..**.
2180: 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
2190: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29  te3LocateTable()
21a0: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
21b0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71 6c  te3FindTable(sql
21c0: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
21d0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
21e0: 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61  st char *zDataba
21f0: 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20  se){.  Table *p 
2200: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
2210: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 61 73 73  int nName;.  ass
2220: 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20 29 3b  ert( zName!=0 );
2230: 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  nName = sqlit
2240: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
2250: 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65  );.  /* All mute
2260: 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  xes are required
2270: 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
2280: 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77  ss.  Make sure w
2290: 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a  e hold them. */.
22a0: 20 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62    assert( zDatab
22b0: 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase!=0 || sqlite
22c0: 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
22d0: 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20 66  texes(db) );.  f
22e0: 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42  or(i=OMIT_TEMPDB
22f0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
2300: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28  ){.    int j = (
2310: 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20  i<2) ? i^1 : i; 
2320: 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50    /* Search TEMP
2330: 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a   before MAIN */.
2340: 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73      if( zDatabas
2350: 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  e!=0 && sqlite3S
2360: 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65  trICmp(zDatabase
2370: 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61  , db->aDb[j].zNa
2380: 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  me) ) continue;.
2390: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
23a0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
23b0: 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a  ld(db, j, 0) );.
23c0: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48      p = sqlite3H
23d0: 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62  ashFind(&db->aDb
23e0: 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  [j].pSchema->tbl
23f0: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Hash, zName, nNa
2400: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  me);.    if( p )
2410: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
2420: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
2430: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
2440: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
2450: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
2460: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
2470: 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69  base.** table gi
2480: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
2490: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
24a0: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
24b0: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  name of the.** d
24c0: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
24d0: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
24e0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
24f0: 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c  t found.  Also l
2500: 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  eave an.** error
2510: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
2520: 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
2530: 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
2540: 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
2550: 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74  outine and sqlit
2560: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73  e3FindTable() is
2570: 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f   that this.** ro
2580: 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20  utine leaves an 
2590: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
25a0: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
25b0: 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65   where.** sqlite
25c0: 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65  3FindTable() doe
25d0: 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20  s not..*/.Table 
25e0: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61  *sqlite3LocateTa
25f0: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
2600: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
2610: 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69 63   context in whic
2620: 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f  h to report erro
2630: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  rs */.  int isVi
2640: 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew,            /
2650: 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69 6e  * True if lookin
2660: 67 20 66 6f 72 20 61 20 56 49 45 57 20 72 61 74  g for a VIEW rat
2670: 68 65 72 20 74 68 61 6e 20 61 20 54 41 42 4c 45  her than a TABLE
2680: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2690: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20   *zName,     /* 
26a0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
26b0: 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  e we are looking
26c0: 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   for */.  const 
26d0: 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20 20  char *zDbase    
26e0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
26f0: 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68 74  database.  Might
2700: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   be NULL */.){. 
2710: 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a   Table *p;..  /*
2720: 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
2730: 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
2740: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
2750: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
2760: 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
2770: 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
2780: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
2790: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
27a0: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
27b0: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
27c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
27d0: 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  }..  p = sqlite3
27e0: 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
27f0: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  ->db, zName, zDb
2800: 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ase);.  if( p==0
2810: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
2820: 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69 65  ar *zMsg = isVie
2830: 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65  w ? "no such vie
2840: 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61  w" : "no such ta
2850: 62 6c 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44  ble";.    if( zD
2860: 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71  base ){.      sq
2870: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2880: 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73  arse, "%s: %s.%s
2890: 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c  ", zMsg, zDbase,
28a0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
28b0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
28c0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
28d0: 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67  , "%s: %s", zMsg
28e0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  , zName);.    }.
28f0: 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
2900: 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d  kSchema = 1;.  }
2910: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
2920: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
2930: 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65   table identifie
2940: 64 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54  d by *p..**.** T
2950: 68 69 73 20 69 73 20 61 20 77 72 61 70 70 65 72  his is a wrapper
2960: 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 4c   around sqlite3L
2970: 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 20 54 68  ocateTable(). Th
2980: 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
2990: 77 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 4c  ween.** sqlite3L
29a0: 6f 63 61 74 65 54 61 62 6c 65 28 29 20 61 6e 64  ocateTable() and
29b0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
29c0: 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63  s that this func
29d0: 74 69 6f 6e 20 72 65 73 74 72 69 63 74 73 0a 2a  tion restricts.*
29e0: 2a 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20  * the search to 
29f0: 73 63 68 65 6d 61 20 28 70 2d 3e 70 53 63 68 65  schema (p->pSche
2a00: 6d 61 29 20 69 66 20 69 74 20 69 73 20 6e 6f 74  ma) if it is not
2a10: 20 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68 65 6d   NULL. p->pSchem
2a20: 61 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f 6e 2d  a may be.** non-
2a30: 4e 55 4c 4c 20 69 66 20 69 74 20 69 73 20 70 61  NULL if it is pa
2a40: 72 74 20 6f 66 20 61 20 76 69 65 77 20 6f 72 20  rt of a view or 
2a50: 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20  trigger program 
2a60: 64 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65 65 0a  definition. See.
2a70: 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63  ** sqlite3FixSrc
2a80: 4c 69 73 74 28 29 20 66 6f 72 20 64 65 74 61 69  List() for detai
2a90: 6c 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  ls..*/.Table *sq
2aa0: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
2ab0: 49 74 65 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Item(.  Parse *p
2ac0: 50 61 72 73 65 2c 20 0a 20 20 69 6e 74 20 69 73  Parse, .  int is
2ad0: 56 69 65 77 2c 20 0a 20 20 73 74 72 75 63 74 20  View, .  struct 
2ae0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 0a  SrcList_item *p.
2af0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
2b00: 2a 7a 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20  *zDb;.  assert( 
2b10: 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20 7c 7c  p->pSchema==0 ||
2b20: 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30   p->zDatabase==0
2b30: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 63   );.  if( p->pSc
2b40: 68 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e 74 20  hema ){.    int 
2b50: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
2b60: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
2b70: 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d  e->db, p->pSchem
2b80: 61 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 70 50  a);.    zDb = pP
2b90: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
2ba0: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73  b].zName;.  }els
2bb0: 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20 70 2d 3e  e{.    zDb = p->
2bc0: 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a 20  zDatabase;.  }. 
2bd0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4c   return sqlite3L
2be0: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
2bf0: 65 2c 20 69 73 56 69 65 77 2c 20 70 2d 3e 7a 4e  e, isView, p->zN
2c00: 61 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a 2f 2a  ame, zDb);.}../*
2c10: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
2c20: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
2c30: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
2c40: 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c  s .** a particul
2c50: 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74  ar index given t
2c60: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
2c70: 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65  index.** and the
2c80: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
2c90: 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61  abase that conta
2ca0: 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ins the index..*
2cb0: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
2cc0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
2cd0: 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69  * If zDatabase i
2ce0: 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73  s 0, all databas
2cf0: 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20  es are searched 
2d00: 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  for the.** table
2d10: 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d   and the first m
2d20: 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73  atching index is
2d30: 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20   returned.  (No 
2d40: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20  checking.** for 
2d50: 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20  duplicate index 
2d60: 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20  names is done.) 
2d70: 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65   The search orde
2d80: 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72  r is.** TEMP fir
2d90: 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74  st, then MAIN, t
2da0: 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72  hen any auxiliar
2db0: 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65  y databases adde
2dc0: 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41  d.** using the A
2dd0: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TTACH command..*
2de0: 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33  /.Index *sqlite3
2df0: 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65  FindIndex(sqlite
2e00: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
2e10: 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20  r *zName, const 
2e20: 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e  char *zDb){.  In
2e30: 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e  dex *p = 0;.  in
2e40: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  t i;.  int nName
2e50: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2e60: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 2f 2a 20  30(zName);.  /* 
2e70: 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72 65 20  All mutexes are 
2e80: 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 63 68  required for sch
2e90: 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d 61 6b  ema access.  Mak
2ea0: 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64 20 74  e sure we hold t
2eb0: 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  hem. */.  assert
2ec0: 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73 71 6c 69  ( zDb!=0 || sqli
2ed0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c  te3BtreeHoldsAll
2ee0: 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20  Mutexes(db) );. 
2ef0: 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50   for(i=OMIT_TEMP
2f00: 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  DB; i<db->nDb; i
2f10: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d  ++){.    int j =
2f20: 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69   (i<2) ? i^1 : i
2f30: 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d  ;  /* Search TEM
2f40: 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f  P before MAIN */
2f50: 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63  .    Schema *pSc
2f60: 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 6a  hema = db->aDb[j
2f70: 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 61  ].pSchema;.    a
2f80: 73 73 65 72 74 28 20 70 53 63 68 65 6d 61 20 29  ssert( pSchema )
2f90: 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26 26  ;.    if( zDb &&
2fa0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2fb0: 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e  zDb, db->aDb[j].
2fc0: 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75  zName) ) continu
2fd0: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  e;.    assert( s
2fe0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
2ff0: 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20  xHeld(db, j, 0) 
3000: 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  );.    p = sqlit
3010: 65 33 48 61 73 68 46 69 6e 64 28 26 70 53 63 68  e3HashFind(&pSch
3020: 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e  ema->idxHash, zN
3030: 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20  ame, nName);.   
3040: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
3050: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
3060: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d  }../*.** Reclaim
3070: 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64   the memory used
3080: 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a   by an index.*/.
3090: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
30a0: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
30b0: 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 23 69  b, Index *p){.#i
30c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30d0: 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71 6c 69  T_ANALYZE.  sqli
30e0: 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78 53 61  te3DeleteIndexSa
30f0: 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a 23 65  mples(db, p);.#e
3100: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62  ndif.  sqlite3Db
3110: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c  Free(db, p->zCol
3120: 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Aff);.  sqlite3D
3130: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
3140: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69  ./*.** For the i
3150: 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49 64 78  ndex called zIdx
3160: 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20 66 6f  Name which is fo
3170: 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  und in the datab
3180: 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69  ase iDb,.** unli
3190: 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20 66 72  ke that index fr
31a0: 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74 68 65  om its Table the
31b0: 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64  n remove the ind
31c0: 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69  ex from.** the i
31d0: 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 20  ndex hash table 
31e0: 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d  and free all mem
31f0: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 61  ory structures a
3200: 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
3210: 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a  h the index..*/.
3220: 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69  void sqlite3Unli
3230: 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
3240: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
3250: 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61  t iDb, const cha
3260: 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20  r *zIdxName){.  
3270: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
3280: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 48 61 73 68   int len;.  Hash
3290: 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73 73 65   *pHash;..  asse
32a0: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
32b0: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
32c0: 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48 61 73  Db, 0) );.  pHas
32d0: 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  h = &db->aDb[iDb
32e0: 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ].pSchema->idxHa
32f0: 73 68 3b 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69  sh;.  len = sqli
3300: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 64 78  te3Strlen30(zIdx
3310: 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 20  Name);.  pIndex 
3320: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
3330: 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64 78 4e  ert(pHash, zIdxN
3340: 61 6d 65 2c 20 6c 65 6e 2c 20 30 29 3b 0a 20 20  ame, len, 0);.  
3350: 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e 64 65  if( ALWAYS(pInde
3360: 78 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  x) ){.    if( pI
3370: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
3380: 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a  ndex==pIndex ){.
3390: 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54        pIndex->pT
33a0: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70  able->pIndex = p
33b0: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
33c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
33d0: 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 2f  ndex *p;.      /
33e0: 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f 6e 20  * Justification 
33f0: 6f 66 20 41 4c 57 41 59 53 28 29 3b 20 20 54 68  of ALWAYS();  Th
3400: 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20  e index must be 
3410: 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 0a 20  on the list of. 
3420: 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e       ** indices.
3430: 20 2a 2f 0a 20 20 20 20 20 20 70 20 3d 20 70 49   */.      p = pI
3440: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
3450: 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c  ndex;.      whil
3460: 65 28 20 41 4c 57 41 59 53 28 70 29 20 26 26 20  e( ALWAYS(p) && 
3470: 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78  p->pNext!=pIndex
3480: 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74   ){ p = p->pNext
3490: 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c  ; }.      if( AL
34a0: 57 41 59 53 28 70 20 26 26 20 70 2d 3e 70 4e 65  WAYS(p && p->pNe
34b0: 78 74 3d 3d 70 49 6e 64 65 78 29 20 29 7b 0a 20  xt==pIndex) ){. 
34c0: 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
34d0: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
34e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
34f0: 20 20 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c     freeIndex(db,
3500: 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20   pIndex);.  }.  
3510: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
3520: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
3530: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b  s;.}../*.** Look
3540: 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 69 73   through the lis
3550: 74 20 6f 66 20 6f 70 65 6e 20 64 61 74 61 62 61  t of open databa
3560: 73 65 20 66 69 6c 65 73 20 69 6e 20 64 62 2d 3e  se files in db->
3570: 61 44 62 5b 5d 20 61 6e 64 20 69 66 0a 2a 2a 20  aDb[] and if.** 
3580: 61 6e 79 20 68 61 76 65 20 62 65 65 6e 20 63 6c  any have been cl
3590: 6f 73 65 64 2c 20 72 65 6d 6f 76 65 20 74 68 65  osed, remove the
35a0: 6d 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 2e  m from the list.
35b0: 20 20 52 65 61 6c 6c 6f 63 61 74 65 20 74 68 65    Reallocate the
35c0: 0a 2a 2a 20 64 62 2d 3e 61 44 62 5b 5d 20 73 74  .** db->aDb[] st
35d0: 72 75 63 74 75 72 65 20 74 6f 20 61 20 73 6d 61  ructure to a sma
35e0: 6c 6c 65 72 20 73 69 7a 65 2c 20 69 66 20 70 6f  ller size, if po
35f0: 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 6e  ssible..**.** En
3600: 74 72 79 20 30 20 28 74 68 65 20 22 6d 61 69 6e  try 0 (the "main
3610: 22 20 64 61 74 61 62 61 73 65 29 20 61 6e 64 20  " database) and 
3620: 65 6e 74 72 79 20 31 20 28 74 68 65 20 22 74 65  entry 1 (the "te
3630: 6d 70 22 20 64 61 74 61 62 61 73 65 29 0a 2a 2a  mp" database).**
3640: 20 61 72 65 20 6e 65 76 65 72 20 63 61 6e 64 69   are never candi
3650: 64 61 74 65 73 20 66 6f 72 20 62 65 69 6e 67 20  dates for being 
3660: 63 6f 6c 6c 61 70 73 65 64 2e 0a 2a 2f 0a 76 6f  collapsed..*/.vo
3670: 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70  id sqlite3Collap
3680: 73 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28  seDatabaseArray(
3690: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
36a0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28  int i, j;.  for(
36b0: 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62  i=j=2; i<db->nDb
36c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
36d0: 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  ct Db *pDb = &db
36e0: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
36f0: 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b  ( pDb->pBt==0 ){
3700: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
3710: 46 72 65 65 28 64 62 2c 20 70 44 62 2d 3e 7a 4e  Free(db, pDb->zN
3720: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  ame);.      pDb-
3730: 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  >zName = 0;.    
3740: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
3750: 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b  }.    if( j<i ){
3760: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a  .      db->aDb[j
3770: 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a  ] = db->aDb[i];.
3780: 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20      }.    j++;. 
3790: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d   }.  memset(&db-
37a0: 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d  >aDb[j], 0, (db-
37b0: 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64  >nDb-j)*sizeof(d
37c0: 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64  b->aDb[j]));.  d
37d0: 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66  b->nDb = j;.  if
37e0: 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20  ( db->nDb<=2 && 
37f0: 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62  db->aDb!=db->aDb
3800: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65  Static ){.    me
3810: 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74  mcpy(db->aDbStat
3820: 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73  ic, db->aDb, 2*s
3830: 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d  izeof(db->aDb[0]
3840: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  ));.    sqlite3D
3850: 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61 44  bFree(db, db->aD
3860: 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20  b);.    db->aDb 
3870: 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b  = db->aDbStatic;
3880: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
3890: 73 65 74 20 74 68 65 20 73 63 68 65 6d 61 20 66  set the schema f
38a0: 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
38b0: 61 74 20 69 6e 64 65 78 20 69 44 62 2e 20 20 41  at index iDb.  A
38c0: 6c 73 6f 20 72 65 73 65 74 20 74 68 65 0a 2a 2a  lso reset the.**
38d0: 20 54 45 4d 50 20 73 63 68 65 6d 61 2e 0a 2a 2f   TEMP schema..*/
38e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73  .void sqlite3Res
38f0: 65 74 4f 6e 65 53 63 68 65 6d 61 28 73 71 6c 69  etOneSchema(sqli
3900: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
3910: 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20 20  ){.  Db *pDb;.  
3920: 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e  assert( iDb<db->
3930: 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 73  nDb );..  /* Cas
3940: 65 20 31 3a 20 20 52 65 73 65 74 20 74 68 65 20  e 1:  Reset the 
3950: 73 69 6e 67 6c 65 20 73 63 68 65 6d 61 20 69 64  single schema id
3960: 65 6e 74 69 66 69 65 64 20 62 79 20 69 44 62 20  entified by iDb 
3970: 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  */.  pDb = &db->
3980: 61 44 62 5b 69 44 62 5d 3b 0a 20 20 61 73 73 65  aDb[iDb];.  asse
3990: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
39a0: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
39b0: 44 62 2c 20 30 29 20 29 3b 0a 20 20 61 73 73 65  Db, 0) );.  asse
39c0: 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  rt( pDb->pSchema
39d0: 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
39e0: 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d  SchemaClear(pDb-
39f0: 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 20 20 2f 2a  >pSchema);..  /*
3a00: 20 49 66 20 61 6e 79 20 64 61 74 61 62 61 73 65   If any database
3a10: 20 6f 74 68 65 72 20 74 68 61 6e 20 54 45 4d 50   other than TEMP
3a20: 20 69 73 20 72 65 73 65 74 2c 20 74 68 65 6e 20   is reset, then 
3a30: 61 6c 73 6f 20 72 65 73 65 74 20 54 45 4d 50 0a  also reset TEMP.
3a40: 20 20 2a 2a 20 73 69 6e 63 65 20 54 45 4d 50 20    ** since TEMP 
3a50: 6d 69 67 68 74 20 62 65 20 68 6f 6c 64 69 6e 67  might be holding
3a60: 20 74 72 69 67 67 65 72 73 20 74 68 61 74 20 72   triggers that r
3a70: 65 66 65 72 65 6e 63 65 20 74 61 62 6c 65 73 20  eference tables 
3a80: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65  in the.  ** othe
3a90: 72 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  r database..  */
3aa0: 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20 29 7b  .  if( iDb!=1 ){
3ab0: 0a 20 20 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  .    pDb = &db->
3ac0: 61 44 62 5b 31 5d 3b 0a 20 20 20 20 61 73 73 65  aDb[1];.    asse
3ad0: 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  rt( pDb->pSchema
3ae0: 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  !=0 );.    sqlit
3af0: 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44  e3SchemaClear(pD
3b00: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d  b->pSchema);.  }
3b10: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
3b20: 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63  .** Erase all sc
3b30: 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  hema information
3b40: 20 66 72 6f 6d 20 61 6c 6c 20 61 74 74 61 63 68   from all attach
3b50: 65 64 20 64 61 74 61 62 61 73 65 73 20 28 69 6e  ed databases (in
3b60: 63 6c 75 64 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e  cluding.** "main
3b70: 22 20 61 6e 64 20 22 74 65 6d 70 22 29 20 66 6f  " and "temp") fo
3b80: 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
3b90: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
3ba0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
3bb0: 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66  esetAllSchemasOf
3bc0: 43 6f 6e 6e 65 63 74 69 6f 6e 28 73 71 6c 69 74  Connection(sqlit
3bd0: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69  e3 *db){.  int i
3be0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
3bf0: 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
3c00: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
3c10: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62  Db; i++){.    Db
3c20: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
3c30: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
3c40: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
3c50: 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61     sqlite3Schema
3c60: 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65  Clear(pDb->pSche
3c70: 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ma);.    }.  }. 
3c80: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
3c90: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
3ca0: 67 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 56 74  ges;.  sqlite3Vt
3cb0: 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29  abUnlockList(db)
3cc0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
3cd0: 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20  LeaveAll(db);.  
3ce0: 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44  sqlite3CollapseD
3cf0: 61 74 61 62 61 73 65 41 72 72 61 79 28 64 62 29  atabaseArray(db)
3d00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
3d10: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
3d20: 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20  d when a commit 
3d30: 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20  occurs..*/.void 
3d40: 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
3d50: 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c  ernalChanges(sql
3d60: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d  ite3 *db){.  db-
3d70: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
3d80: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
3d90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
3da0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65   memory allocate
3db0: 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  d for the column
3dc0: 20 6e 61 6d 65 73 20 6f 66 20 61 20 74 61 62 6c   names of a tabl
3dd0: 65 20 6f 72 20 76 69 65 77 20 28 74 68 65 0a 2a  e or view (the.*
3de0: 2a 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61  * Table.aCol[] a
3df0: 72 72 61 79 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  rray)..*/.static
3e00: 20 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65   void sqliteDele
3e10: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 73 71  teColumnNames(sq
3e20: 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65  lite3 *db, Table
3e30: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74   *pTable){.  int
3e40: 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43   i;.  Column *pC
3e50: 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  ol;.  assert( pT
3e60: 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28  able!=0 );.  if(
3e70: 20 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d   (pCol = pTable-
3e80: 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20  >aCol)!=0 ){.   
3e90: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
3ea0: 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  le->nCol; i++, p
3eb0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  Col++){.      sq
3ec0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3ed0: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
3ee0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
3ef0: 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  elete(db, pCol->
3f00: 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71  pDflt);.      sq
3f10: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3f20: 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20  pCol->zDflt);.  
3f30: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
3f40: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79 70  e(db, pCol->zTyp
3f50: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
3f60: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
3f70: 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a  ->zColl);.    }.
3f80: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
3f90: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43  e(db, pTable->aC
3fa0: 6f 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ol);.  }.}../*.*
3fb0: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d  * Remove the mem
3fc0: 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75  ory data structu
3fd0: 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  res associated w
3fe0: 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ith the given.**
3ff0: 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e   Table.  No chan
4000: 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
4010: 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75  disk by this rou
4020: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tine..**.** This
4030: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65   routine just de
4040: 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73  letes the data s
4050: 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f  tructure.  It do
4060: 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a  es not unlink.**
4070: 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20   the table data 
4080: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
4090: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  he hash table.  
40a0: 42 75 74 20 69 74 20 64 6f 65 73 20 64 65 73 74  But it does dest
40b0: 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74  roy.** memory st
40c0: 72 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20  ructures of the 
40d0: 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65  indices and fore
40e0: 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61  ign keys associa
40f0: 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65  ted with .** the
4100: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
4110: 65 20 64 62 20 70 61 72 61 6d 65 74 65 72 20 69  e db parameter i
4120: 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 74 20  s optional.  It 
4130: 69 73 20 6e 65 65 64 65 64 20 69 66 20 74 68 65  is needed if the
4140: 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 0a 2a   Table object .*
4150: 2a 20 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61  * contains looka
4160: 73 69 64 65 20 6d 65 6d 6f 72 79 2e 20 20 28 54  side memory.  (T
4170: 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 69 6e 20  able objects in 
4180: 74 68 65 20 73 63 68 65 6d 61 20 64 6f 20 6e 6f  the schema do no
4190: 74 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69  t use.** lookasi
41a0: 64 65 20 6d 65 6d 6f 72 79 2c 20 62 75 74 20 73  de memory, but s
41b0: 6f 6d 65 20 65 70 68 65 6d 65 72 61 6c 20 54 61  ome ephemeral Ta
41c0: 62 6c 65 20 6f 62 6a 65 63 74 73 20 64 6f 2e 29  ble objects do.)
41d0: 20 20 4f 72 20 74 68 65 0a 2a 2a 20 64 62 20 70    Or the.** db p
41e0: 61 72 61 6d 65 74 65 72 20 63 61 6e 20 62 65 20  arameter can be 
41f0: 75 73 65 64 20 77 69 74 68 20 64 62 2d 3e 70 6e  used with db->pn
4200: 42 79 74 65 73 46 72 65 65 64 20 74 6f 20 6d 65  BytesFreed to me
4210: 61 73 75 72 65 20 74 68 65 20 6d 65 6d 6f 72 79  asure the memory
4220: 0a 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20  .** used by the 
4230: 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f  Table object..*/
4240: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c  .void sqlite3Del
4250: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33  eteTable(sqlite3
4260: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61   *db, Table *pTa
4270: 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ble){.  Index *p
4280: 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20  Index, *pNext;. 
4290: 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 6e   TESTONLY( int n
42a0: 4c 6f 6f 6b 61 73 69 64 65 3b 20 29 20 2f 2a 20  Lookaside; ) /* 
42b0: 55 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 6c  Used to verify l
42c0: 6f 6f 6b 61 73 69 64 65 20 6e 6f 74 20 75 73 65  ookaside not use
42d0: 64 20 66 6f 72 20 73 63 68 65 6d 61 20 2a 2f 0a  d for schema */.
42e0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 54 61 62  .  assert( !pTab
42f0: 6c 65 20 7c 7c 20 70 54 61 62 6c 65 2d 3e 6e 52  le || pTable->nR
4300: 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f  ef>0 );..  /* Do
4310: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
4320: 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20  table until the 
4330: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
4340: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f  reaches zero. */
4350: 0a 20 20 69 66 28 20 21 70 54 61 62 6c 65 20 29  .  if( !pTable )
4360: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28   return;.  if( (
4370: 28 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79  (!db || db->pnBy
4380: 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26 20  tesFreed==0) && 
4390: 28 2d 2d 70 54 61 62 6c 65 2d 3e 6e 52 65 66 29  (--pTable->nRef)
43a0: 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  >0) ) return;.. 
43b0: 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e   /* Record the n
43c0: 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e  umber of outstan
43d0: 64 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20 61  ding lookaside a
43e0: 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e 20 73 63  llocations in sc
43f0: 68 65 6d 61 20 54 61 62 6c 65 73 0a 20 20 2a 2a  hema Tables.  **
4400: 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20   prior to doing 
4410: 61 6e 79 20 66 72 65 65 28 29 20 6f 70 65 72 61  any free() opera
4420: 74 69 6f 6e 73 2e 20 20 53 69 6e 63 65 20 73 63  tions.  Since sc
4430: 68 65 6d 61 20 54 61 62 6c 65 73 20 64 6f 20 6e  hema Tables do n
4440: 6f 74 20 75 73 65 0a 20 20 2a 2a 20 6c 6f 6f 6b  ot use.  ** look
4450: 61 73 69 64 65 2c 20 74 68 69 73 20 6e 75 6d 62  aside, this numb
4460: 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63 68  er should not ch
4470: 61 6e 67 65 2e 20 2a 2f 0a 20 20 54 45 53 54 4f  ange. */.  TESTO
4480: 4e 4c 59 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 20  NLY( nLookaside 
4490: 3d 20 28 64 62 20 26 26 20 28 70 54 61 62 6c 65  = (db && (pTable
44a0: 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
44b0: 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 29 20 3f  Ephemeral)==0) ?
44c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
44d0: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6c 6f            db->lo
44e0: 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20 3a 20 30  okaside.nOut : 0
44f0: 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65   );..  /* Delete
4500: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73   all indices ass
4510: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
4520: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f  s table. */.  fo
4530: 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c  r(pIndex = pTabl
4540: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  e->pIndex; pInde
4550: 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29  x; pIndex=pNext)
4560: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49  {.    pNext = pI
4570: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
4580: 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
4590: 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65  >pSchema==pTable
45a0: 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
45b0: 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e   if( !db || db->
45c0: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
45d0: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
45e0: 4e 61 6d 65 20 3d 20 70 49 6e 64 65 78 2d 3e 7a  Name = pIndex->z
45f0: 4e 61 6d 65 3b 20 0a 20 20 20 20 20 20 54 45 53  Name; .      TES
4600: 54 4f 4e 4c 59 20 28 20 49 6e 64 65 78 20 2a 70  TONLY ( Index *p
4610: 4f 6c 64 20 3d 20 29 20 73 71 6c 69 74 65 33 48  Old = ) sqlite3H
4620: 61 73 68 49 6e 73 65 72 74 28 0a 20 20 20 20 20  ashInsert(.     
4630: 20 20 20 20 26 70 49 6e 64 65 78 2d 3e 70 53 63      &pIndex->pSc
4640: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a  hema->idxHash, z
4650: 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72  Name, sqlite3Str
4660: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 2c 20 30 0a  len30(zName), 0.
4670: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
4680: 73 73 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20  ssert( db==0 || 
4690: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
46a0: 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49  exHeld(db, 0, pI
46b0: 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29  ndex->pSchema) )
46c0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
46d0: 70 4f 6c 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20  pOld==pIndex || 
46e0: 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  pOld==0 );.    }
46f0: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 64  .    freeIndex(d
4700: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
4710: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79  .  /* Delete any
4720: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74   foreign keys at
4730: 74 61 63 68 65 64 20 74 6f 20 74 68 69 73 20 74  tached to this t
4740: 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  able. */.  sqlit
4750: 65 33 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70  e3FkDelete(db, p
4760: 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65  Table);..  /* De
4770: 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73  lete the Table s
4780: 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e  tructure itself.
4790: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 44 65  .  */.  sqliteDe
47a0: 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  leteColumnNames(
47b0: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 73  db, pTable);.  s
47c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
47d0: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
47e0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
47f0: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f  (db, pTable->zCo
4800: 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33  lAff);.  sqlite3
4810: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
4820: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
4830: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
4840: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 73  E_OMIT_CHECK.  s
4850: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
4860: 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  lete(db, pTable-
4870: 3e 70 43 68 65 63 6b 29 3b 0a 23 65 6e 64 69 66  >pCheck);.#endif
4880: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4890: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
48a0: 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 43  E.  sqlite3VtabC
48b0: 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29  lear(db, pTable)
48c0: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
48d0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
48e0: 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  ble);..  /* Veri
48f0: 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61  fy that no looka
4900: 73 69 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20  side memory was 
4910: 75 73 65 64 20 62 79 20 73 63 68 65 6d 61 20 74  used by schema t
4920: 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  ables */.  asser
4930: 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30  t( nLookaside==0
4940: 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d   || nLookaside==
4950: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f  db->lookaside.nO
4960: 75 74 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  ut );.}../*.** U
4970: 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20  nlink the given 
4980: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68  table from the h
4990: 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74  ash tables and t
49a0: 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a  he delete the.**
49b0: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
49c0: 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e   with all its in
49d0: 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67  dices and foreig
49e0: 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20  n keys..*/.void 
49f0: 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64  sqlite3UnlinkAnd
4a00: 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  DeleteTable(sqli
4a10: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
4a20: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
4a30: 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65  abName){.  Table
4a40: 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a   *p;.  Db *pDb;.
4a50: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
4a60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44   );.  assert( iD
4a70: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
4a80: 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
4a90: 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20 61   zTabName );.  a
4aa0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
4ab0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
4ac0: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 74  , iDb, 0) );.  t
4ad0: 65 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61 6d  estcase( zTabNam
4ae0: 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a  e[0]==0 );  /* Z
4af0: 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c 65  ero-length table
4b00: 20 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f 77   names are allow
4b10: 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64  ed */.  pDb = &d
4b20: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70  b->aDb[iDb];.  p
4b30: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
4b40: 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65  sert(&pDb->pSche
4b50: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61  ma->tblHash, zTa
4b60: 62 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  bName,.         
4b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
4b80: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
4b90: 54 61 62 4e 61 6d 65 29 2c 30 29 3b 0a 20 20 73  TabName),0);.  s
4ba0: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
4bb0: 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d 3e  e(db, p);.  db->
4bc0: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
4bd0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d  InternChanges;.}
4be0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
4bf0: 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61 20  token, return a 
4c00: 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 73  string that cons
4c10: 69 73 74 73 20 6f 66 20 74 68 65 20 74 65 78 74  ists of the text
4c20: 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65   of that.** toke
4c30: 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  n.  Space to hol
4c40: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
4c50: 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61  tring.** is obta
4c60: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
4c70: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  Malloc() and mus
4c80: 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
4c90: 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
4ca0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79  ction..**.** Any
4cb0: 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73   quotation marks
4cc0: 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20 27   (ex:  "name", '
4cd0: 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f  name', [name], o
4ce0: 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74 0a 2a  r `name`) that.*
4cf0: 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65 20 62  * surround the b
4d00: 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e  ody of the token
4d10: 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a   are removed..**
4d20: 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f  .** Tokens are o
4d30: 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65  ften just pointe
4d40: 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  rs into the orig
4d50: 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e  inal SQL text an
4d60: 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20  d so.** are not 
4d70: 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20  \000 terminated 
4d80: 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73  and are not pers
4d90: 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74  istent.  The ret
4da0: 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20  urned string.** 
4db0: 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  is \000 terminat
4dc0: 65 64 20 61 6e 64 20 69 73 20 70 65 72 73 69 73  ed and is persis
4dd0: 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  tent..*/.char *s
4de0: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
4df0: 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ken(sqlite3 *db,
4e00: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
4e10: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
4e20: 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
4e30: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
4e40: 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28  3DbStrNDup(db, (
4e50: 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20  char*)pName->z, 
4e60: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73  pName->n);.    s
4e70: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e  qlite3Dequote(zN
4e80: 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
4e90: 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20     zName = 0;.  
4ea0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  }.  return zName
4eb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
4ec0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
4ed0: 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69  r table stored i
4ee0: 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65  n database numbe
4ef0: 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69  r iDb for.** wri
4f00: 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20  ting. The table 
4f10: 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  is opened using 
4f20: 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69  cursor 0..*/.voi
4f30: 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73  d sqlite3OpenMas
4f40: 74 65 72 54 61 62 6c 65 28 50 61 72 73 65 20 2a  terTable(Parse *
4f50: 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56  p, int iDb){.  V
4f60: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
4f70: 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73 71  GetVdbe(p);.  sq
4f80: 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
4f90: 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f  , iDb, MASTER_RO
4fa0: 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54 41  OT, 1, SCHEMA_TA
4fb0: 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 73 71 6c  BLE(iDb));.  sql
4fc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
4fd0: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
4fe0: 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  0, MASTER_ROOT, 
4ff0: 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  iDb);.  sqlite3V
5000: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
5010: 31 2c 20 28 63 68 61 72 20 2a 29 35 2c 20 50 34  1, (char *)5, P4
5020: 5f 49 4e 54 33 32 29 3b 20 20 2f 2a 20 35 20 63  _INT32);  /* 5 c
5030: 6f 6c 75 6d 6e 20 74 61 62 6c 65 20 2a 2f 0a 20  olumn table */. 
5040: 20 69 66 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20   if( p->nTab==0 
5050: 29 7b 0a 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d  ){.    p->nTab =
5060: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
5070: 20 50 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65   Parameter zName
5080: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c   points to a nul
5090: 2d 74 65 72 6d 69 6e 61 74 65 64 20 62 75 66 66  -terminated buff
50a0: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
50b0: 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64  e name.** of a d
50c0: 61 74 61 62 61 73 65 20 28 22 6d 61 69 6e 22 2c  atabase ("main",
50d0: 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e   "temp" or the n
50e0: 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68  ame of an attach
50f0: 65 64 20 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20  ed db). This.** 
5100: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
5110: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
5120: 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  e named database
5130: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f   in db->aDb[], o
5140: 72 0a 2a 2a 20 2d 31 20 69 66 20 74 68 65 20 6e  r.** -1 if the n
5150: 61 6d 65 64 20 64 62 20 63 61 6e 6e 6f 74 20 62  amed db cannot b
5160: 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  e found..*/.int 
5170: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d  sqlite3FindDbNam
5180: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  e(sqlite3 *db, c
5190: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
51a0: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
51b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
51c0: 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  base number */. 
51d0: 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
51e0: 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 20 20 69    Db *pDb;.    i
51f0: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
5200: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
5210: 20 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44     for(i=(db->nD
5220: 62 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61  b-1), pDb=&db->a
5230: 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Db[i]; i>=0; i--
5240: 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20  , pDb--){.      
5250: 69 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44  if( (!OMIT_TEMPD
5260: 42 20 7c 7c 20 69 21 3d 31 20 29 20 26 26 20 6e  B || i!=1 ) && n
5270: 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ==sqlite3Strlen3
5280: 30 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26  0(pDb->zName) &&
5290: 20 0a 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73   .          0==s
52a0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 44  qlite3StrICmp(pD
52b0: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  b->zName, zName)
52c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
52d0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
52e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b  .  }.  return i;
52f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f  .}../*.** The to
5300: 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61  ken *pName conta
5310: 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ins the name of 
5320: 61 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68  a database (eith
5330: 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20  er "main" or.** 
5340: 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61  "temp" or the na
5350: 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65  me of an attache
5360: 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74  d db). This rout
5370: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a  ine returns the.
5380: 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ** index of the 
5390: 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69  named database i
53a0: 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20  n db->aDb[], or 
53b0: 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  -1 if the named 
53c0: 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  db .** does not 
53d0: 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  exist..*/.int sq
53e0: 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69  lite3FindDb(sqli
53f0: 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a  te3 *db, Token *
5400: 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pName){.  int i;
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5430: 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65  * Database numbe
5440: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  r */.  char *zNa
5450: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
5460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5470: 61 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63  ame we are searc
5480: 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e  hing for */.  zN
5490: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
54a0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
54b0: 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c  Name);.  i = sql
54c0: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64  ite3FindDbName(d
54d0: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  b, zName);.  sql
54e0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
54f0: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
5500: 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62  i;.}../* The tab
5510: 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72  le or view or tr
5520: 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61  igger name is pa
5530: 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75  ssed to this rou
5540: 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a  tine via tokens.
5550: 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e  ** pName1 and pN
5560: 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62  ame2. If the tab
5570: 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c  le name was full
5580: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72  y qualified, for
5590: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
55a0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78  CREATE TABLE xxx
55b0: 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a  .yyy (...);.** .
55c0: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
55d0: 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61  s set to "xxx" a
55e0: 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e  nd pName2 "yyy".
55f0: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
5600: 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62  nd if.** the tab
5610: 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66  le name is not f
5620: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
5630: 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41  i.e.:.**.** CREA
5640: 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e  TE TABLE yyy(...
5650: 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e  );.**.** Then pN
5660: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
5670: 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  yyy" and pName2 
5680: 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  is ""..**.** Thi
5690: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
56a0: 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69  he *ppUnqual poi
56b0: 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  nter to point at
56c0: 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d   the token (pNam
56d0: 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29  e1 or.** pName2)
56e0: 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65   that stores the
56f0: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62   unqualified tab
5700: 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e  le name.  The in
5710: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  dex of the.** da
5720: 74 61 62 61 73 65 20 22 78 78 78 22 20 69 73 20  tabase "xxx" is 
5730: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
5740: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
5750: 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ame(.  Parse *pP
5760: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
5770: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
5780: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
5790: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
57a0: 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68  ame1,      /* Th
57b0: 65 20 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e  e "xxx" in the n
57c0: 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72  ame "xxx.yyy" or
57d0: 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65   "xxx" */.  Toke
57e0: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20  n *pName2,      
57f0: 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e 20  /* The "yyy" in 
5800: 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79  the name "xxx.yy
5810: 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a  y" */.  Token **
5820: 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57  pUnqual     /* W
5830: 72 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69  rite the unquali
5840: 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65  fied object name
5850: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
5860: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
5870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
5880: 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68  abase holding th
5890: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71  e object */.  sq
58a0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
58b0: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 41  se->db;..  if( A
58c0: 4c 57 41 59 53 28 70 4e 61 6d 65 32 21 3d 30 29  LWAYS(pName2!=0)
58d0: 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20   && pName2->n>0 
58e0: 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 69  ){.    if( db->i
58f0: 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20 20  nit.busy ) {.   
5900: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
5910: 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72 72  sg(pParse, "corr
5920: 75 70 74 20 64 61 74 61 62 61 73 65 22 29 3b 0a  upt database");.
5930: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
5940: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75  rr++;.      retu
5950: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
5960: 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d   *pUnqual = pNam
5970: 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  e2;.    iDb = sq
5980: 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20  lite3FindDb(db, 
5990: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28  pName1);.    if(
59a0: 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20   iDb<0 ){.      
59b0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
59c0: 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
59d0: 20 64 61 74 61 62 61 73 65 20 25 54 22 2c 20 70   database %T", p
59e0: 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 70 50  Name1);.      pP
59f0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
5a00: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
5a10: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
5a20: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e    assert( db->in
5a30: 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d  it.iDb==0 || db-
5a40: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
5a50: 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74    iDb = db->init
5a60: 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75  .iDb;.    *pUnqu
5a70: 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d  al = pName1;.  }
5a80: 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d  .  return iDb;.}
5a90: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5aa0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
5ab0: 63 68 65 63 6b 20 69 66 20 74 68 65 20 55 54 46  check if the UTF
5ac0: 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20  -8 string zName 
5ad0: 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e  is a legal.** un
5ae0: 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 66  qualified name f
5af0: 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61 20  or a new schema 
5b00: 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20 69  object (table, i
5b10: 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a  ndex, view or.**
5b20: 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e   trigger). All n
5b30: 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20 65  ames are legal e
5b40: 78 63 65 70 74 20 74 68 6f 73 65 20 74 68 61 74  xcept those that
5b50: 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20   begin with the 
5b60: 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74  string.** "sqlit
5b70: 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20 6c  e_" (in upper, l
5b80: 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63 61  ower or mixed ca
5b90: 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69 6f  se). This portio
5ba0: 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70 61  n of the namespa
5bb0: 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76 65  ce.** is reserve
5bc0: 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75  d for internal u
5bd0: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
5be0: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
5bf0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
5c00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
5c10: 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61 72  me){.  if( !pPar
5c20: 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73  se->db->init.bus
5c30: 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73  y && pParse->nes
5c40: 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  ted==0 .        
5c50: 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e 64 62    && (pParse->db
5c60: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
5c70: 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d 3d 30  _WriteSchema)==0
5c80: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d  .          && 0=
5c90: 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70  =sqlite3StrNICmp
5ca0: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
5cb0: 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c  ", 7) ){.    sql
5cc0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5cd0: 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d  rse, "object nam
5ce0: 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69  e reserved for i
5cf0: 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22  nternal use: %s"
5d00: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  , zName);.    re
5d10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
5d20: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
5d30: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
5d40: 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72  .** Begin constr
5d50: 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62  ucting a new tab
5d60: 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  le representatio
5d70: 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68  n in memory.  Th
5d80: 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72  is is.** the fir
5d90: 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63  st of several ac
5da0: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68  tion routines th
5db0: 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e  at get called in
5dc0: 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20   response.** to 
5dd0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
5de0: 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61  tatement.  In pa
5df0: 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72  rticular, this r
5e00: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
5e10: 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67  .** after seeing
5e20: 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22   tokens "CREATE"
5e30: 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64   and "TABLE" and
5e40: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e   the table name.
5e50: 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66   The isTemp.** f
5e60: 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74  lag is true if t
5e70: 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  he table should 
5e80: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  be stored in the
5e90: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
5ea0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74  ase.** file inst
5eb0: 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61  ead of in the ma
5ec0: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
5ed0: 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
5ee0: 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20  lly the case.** 
5ef0: 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20  when the "TEMP" 
5f00: 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b  or "TEMPORARY" k
5f10: 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e  eyword occurs in
5f20: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41   between.** CREA
5f30: 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a  TE and TABLE..**
5f40: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c  .** The new tabl
5f50: 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74  e record is init
5f60: 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20  ialized and put 
5f70: 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  in pParse->pNewT
5f80: 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65  able..** As more
5f90: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
5fa0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
5fb0: 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69  s parsed, additi
5fc0: 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72  onal action.** r
5fd0: 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20  outines will be 
5fe0: 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f  called to add mo
5ff0: 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  re information t
6000: 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a  o this record..*
6010: 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
6020: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
6030: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
6040: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
6050: 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  ) routine.** is 
6060: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65  called to comple
6070: 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  te the construct
6080: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ion of the new t
6090: 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a  able record..*/.
60a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61 72  void sqlite3Star
60b0: 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  tTable(.  Parse 
60c0: 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
60d0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
60e0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
60f0: 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74     /* First part
6100: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   of the name of 
6110: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
6120: 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  w */.  Token *pN
6130: 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e  ame2,   /* Secon
6140: 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  d part of the na
6150: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
6160: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  or view */.  int
6170: 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a   isTemp,      /*
6180: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
6190: 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f   a TEMP table */
61a0: 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20  .  int isView,  
61b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
61c0: 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f  his is a VIEW */
61d0: 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75 61 6c  .  int isVirtual
61e0: 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74  ,   /* True if t
61f0: 68 69 73 20 69 73 20 61 20 56 49 52 54 55 41 4c  his is a VIRTUAL
6200: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
6210: 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a 20  noErr        /* 
6220: 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 61  Do nothing if ta
6230: 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ble already exis
6240: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ts */.){.  Table
6250: 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61 72   *pTable;.  char
6260: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20   *zName = 0; /* 
6270: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
6280: 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  new table */.  s
6290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
62a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
62b0: 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  *v;.  int iDb;  
62c0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
62d0: 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65  se number to cre
62e0: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e  ate the table in
62f0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
6300: 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c  me;    /* Unqual
6310: 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68  ified name of th
6320: 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74  e table to creat
6330: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74  e */..  /* The t
6340: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d  able or view nam
6350: 65 20 74 6f 20 63 72 65 61 74 65 20 69 73 20 70  e to create is p
6360: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f  assed to this ro
6370: 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73  utine via tokens
6380: 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64  .  ** pName1 and
6390: 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20   pName2. If the 
63a0: 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66  table name was f
63b0: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
63c0: 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a  for example:.  *
63d0: 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41  *.  ** CREATE TA
63e0: 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e  BLE xxx.yyy (...
63f0: 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68  );.  ** .  ** Th
6400: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
6410: 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e   to "xxx" and pN
6420: 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74  ame2 "yyy". On t
6430: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66  he other hand if
6440: 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  .  ** the table 
6450: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c  name is not full
6460: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65  y qualified, i.e
6470: 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45  .:.  **.  ** CRE
6480: 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e  ATE TABLE yyy(..
6490: 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  .);.  **.  ** Th
64a0: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
64b0: 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e   to "yyy" and pN
64c0: 61 6d 65 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a  ame2 is ""..  **
64d0: 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62  .  ** The call b
64e0: 65 6c 6f 77 20 73 65 74 73 20 74 68 65 20 70 4e  elow sets the pN
64f0: 61 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  ame pointer to p
6500: 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65  oint at the toke
6510: 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a  n (pName1 or.  *
6520: 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73  * pName2) that s
6530: 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c  tores the unqual
6540: 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65  ified table name
6550: 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 69  . The variable i
6560: 44 62 20 69 73 0a 20 20 2a 2a 20 73 65 74 20 74  Db is.  ** set t
6570: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
6580: 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
6590: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
65a0: 65 77 20 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a  ew is to be.  **
65b0: 20 63 72 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a   created in..  *
65c0: 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  /.  iDb = sqlite
65d0: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
65e0: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
65f0: 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
6600: 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75  if( iDb<0 ) retu
6610: 72 6e 3b 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f  rn;.  if( !OMIT_
6620: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
6630: 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20   && pName2->n>0 
6640: 26 26 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20  && iDb!=1 ){.   
6650: 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20   /* If creating 
6660: 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68  a temp table, th
6670: 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62  e name may not b
6680: 65 20 71 75 61 6c 69 66 69 65 64 2e 20 55 6e 6c  e qualified. Unl
6690: 65 73 73 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  ess .    ** the 
66a0: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73  database name is
66b0: 20 22 74 65 6d 70 22 20 61 6e 79 77 61 79 2e 20   "temp" anyway. 
66c0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
66d0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
66e0: 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65  "temporary table
66f0: 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e   name must be un
6700: 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20  qualified");.   
6710: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
6720: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
6730: 26 26 20 69 73 54 65 6d 70 20 29 20 69 44 62 20  && isTemp ) iDb 
6740: 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e  = 1;..  pParse->
6750: 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e  sNameToken = *pN
6760: 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  ame;.  zName = s
6770: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
6780: 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ken(db, pName);.
6790: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
67a0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 53   return;.  if( S
67b0: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
67c0: 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65  3CheckObjectName
67d0: 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20  (pParse, zName) 
67e0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69  ){.    goto begi
67f0: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
6800: 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69   }.  if( db->ini
6810: 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d  t.iDb==1 ) isTem
6820: 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  p = 1;.#ifndef S
6830: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
6840: 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72  RIZATION.  asser
6850: 74 28 20 28 69 73 54 65 6d 70 20 26 20 31 29 3d  t( (isTemp & 1)=
6860: 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20  =isTemp );.  {. 
6870: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20     int code;.   
6880: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
6890: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
68a0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
68b0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
68c0: 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
68d0: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73   SCHEMA_TABLE(is
68e0: 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29  Temp), 0, zDb) )
68f0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  {.      goto beg
6900: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
6910: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
6920: 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66  View ){.      if
6930: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
6940: 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  & isTemp ){.    
6950: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
6960: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49  E_CREATE_TEMP_VI
6970: 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EW;.      }else{
6980: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
6990: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49  SQLITE_CREATE_VI
69a0: 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EW;.      }.    
69b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
69c0: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
69d0: 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20   isTemp ){.     
69e0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
69f0: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42  _CREATE_TEMP_TAB
6a00: 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LE;.      }else{
6a10: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
6a20: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41  SQLITE_CREATE_TA
6a30: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  BLE;.      }.   
6a40: 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56 69   }.    if( !isVi
6a50: 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74 65 33  rtual && sqlite3
6a60: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
6a70: 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30  , code, zName, 0
6a80: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
6a90: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
6aa0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
6ab0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d  }.#endif..  /* M
6ac0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77  ake sure the new
6ad0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73   table name does
6ae0: 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74   not collide wit
6af0: 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20  h an existing.  
6b00: 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
6b10: 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61  e name in the sa
6b20: 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 73  me database.  Is
6b30: 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  sue an error mes
6b40: 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20  sage if.  ** it 
6b50: 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70 74  does. The except
6b60: 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73 74  ion is if the st
6b70: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70 61  atement being pa
6b80: 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64 0a  rsed was passed.
6b90: 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74    ** to an sqlit
6ba0: 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28  e3_declare_vtab(
6bb0: 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20  ) call. In that 
6bc0: 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f  case only the co
6bd0: 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20  lumn names.  ** 
6be0: 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20 62  and types will b
6bf0: 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72 65  e used, so there
6c00: 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74   is no need to t
6c10: 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61 63  est for namespac
6c20: 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e  e.  ** collision
6c30: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 49  s..  */.  if( !I
6c40: 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
6c50: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20  {.    char *zDb 
6c60: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
6c70: 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 53 51  Name;.    if( SQ
6c80: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
6c90: 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
6ca0: 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  e) ){.      goto
6cb0: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
6cc0: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  or;.    }.    pT
6cd0: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69  able = sqlite3Fi
6ce0: 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d  ndTable(db, zNam
6cf0: 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28  e, zDb);.    if(
6d00: 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20   pTable ){.     
6d10: 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20   if( !noErr ){. 
6d20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
6d30: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
6d40: 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79  table %T already
6d50: 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29   exists", pName)
6d60: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6d70: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
6d80: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b  db->init.busy );
6d90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6da0: 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
6db0: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
6dc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
6dd0: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
6de0: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ror;.    }.    i
6df0: 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  f( sqlite3FindIn
6e00: 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  dex(db, zName, z
6e10: 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Db)!=0 ){.      
6e20: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
6e30: 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69  pParse, "there i
6e40: 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64  s already an ind
6e50: 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e  ex named %s", zN
6e60: 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
6e70: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
6e80: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  or;.    }.  }.. 
6e90: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
6ea0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
6eb0: 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
6ec0: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ;.  if( pTable==
6ed0: 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c  0 ){.    db->mal
6ee0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
6ef0: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
6f00: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
6f10: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
6f20: 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e  ;.    goto begin
6f30: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
6f40: 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  }.  pTable->zNam
6f50: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61  e = zName;.  pTa
6f60: 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  ble->iPKey = -1;
6f70: 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65  .  pTable->pSche
6f80: 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ma = db->aDb[iDb
6f90: 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61  ].pSchema;.  pTa
6fa0: 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  ble->nRef = 1;. 
6fb0: 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 45 73 74   pTable->nRowEst
6fc0: 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 61 73   = 1000000;.  as
6fd0: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e  sert( pParse->pN
6fe0: 65 77 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  ewTable==0 );.  
6ff0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
7000: 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f  e = pTable;..  /
7010: 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
7020: 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65   magic sqlite_se
7030: 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65  quence table use
7040: 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65  d by autoincreme
7050: 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65  nt,.  ** then re
7060: 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74  cord a pointer t
7070: 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20  o this table in 
7080: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
7090: 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a  e structure.  **
70a0: 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20   so that INSERT 
70b0: 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62  can find the tab
70c0: 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a  le easily..  */.
70d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
70e0: 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
70f0: 54 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  T.  if( !pParse-
7100: 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72 63 6d  >nested && strcm
7110: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
7120: 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29  _sequence")==0 )
7130: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
7140: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
7150: 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
7160: 20 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e   );.    pTable->
7170: 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62  pSchema->pSeqTab
7180: 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23   = pTable;.  }.#
7190: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69  endif..  /* Begi
71a0: 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65  n generating the
71b0: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
71c0: 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65  insert the table
71d0: 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a   record into.  *
71e0: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  * the SQLITE_MAS
71f0: 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65  TER table.  Note
7200: 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74   in particular t
7210: 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61  hat we must go a
7220: 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c  head.  ** and al
7230: 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72  locate the recor
7240: 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  d number for the
7250: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77   table entry now
7260: 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20  .  Before any.  
7270: 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  ** PRIMARY KEY o
7280: 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64  r UNIQUE keyword
7290: 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54  s are parsed.  T
72a0: 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69  hose keywords wi
72b0: 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e  ll cause.  ** in
72c0: 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61  dices to be crea
72d0: 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c  ted and the tabl
72e0: 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f  e record must co
72f0: 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20  me before the . 
7300: 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65   ** indices.  He
7310: 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20  nce, the record 
7320: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
7330: 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c  able must be all
7340: 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e  ocated.  ** now.
7350: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
7360: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76  >init.busy && (v
7370: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
7380: 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b  e(pParse))!=0 ){
7390: 0a 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20 20  .    int j1;.   
73a0: 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b   int fileFormat;
73b0: 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20 72  .    int reg1, r
73c0: 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20 73  eg2, reg3;.    s
73d0: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
73e0: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
73f0: 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e  , 0, iDb);..#ifn
7400: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7410: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
7420: 20 69 66 28 20 69 73 56 69 72 74 75 61 6c 20 29   if( isVirtual )
7430: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
7440: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
7450: 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 23  VBegin);.    }.#
7460: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
7470: 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74   the file format
7480: 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e   and encoding in
7490: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
74a0: 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c  ve not been set,
74b0: 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65   .    ** set the
74c0: 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  m now..    */.  
74d0: 20 20 72 65 67 31 20 3d 20 70 50 61 72 73 65 2d    reg1 = pParse-
74e0: 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50  >regRowid = ++pP
74f0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
7500: 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e 72  reg2 = pParse->r
7510: 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72 73  egRoot = ++pPars
7520: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67  e->nMem;.    reg
7530: 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  3 = ++pParse->nM
7540: 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
7550: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
7560: 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  ReadCookie, iDb,
7570: 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46 49 4c   reg3, BTREE_FIL
7580: 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20 73  E_FORMAT);.    s
7590: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
75a0: 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20  ree(v, iDb);.   
75b0: 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
75c0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
75d0: 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 66 69 6c  , reg3);.    fil
75e0: 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66  eFormat = (db->f
75f0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 65  lags & SQLITE_Le
7600: 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30 20  gacyFileFmt)!=0 
7610: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
7620: 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d      1 : SQLITE_M
7630: 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a  AX_FILE_FORMAT;.
7640: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7650: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
7660: 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61 74 2c  ger, fileFormat,
7670: 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69   reg3);.    sqli
7680: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7690: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
76a0: 44 62 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46  Db, BTREE_FILE_F
76b0: 4f 52 4d 41 54 2c 20 72 65 67 33 29 3b 0a 20 20  ORMAT, reg3);.  
76c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
76d0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
76e0: 72 2c 20 45 4e 43 28 64 62 29 2c 20 72 65 67 33  r, ENC(db), reg3
76f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7700: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
7710: 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42  etCookie, iDb, B
7720: 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49  TREE_TEXT_ENCODI
7730: 4e 47 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73  NG, reg3);.    s
7740: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
7750: 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 20 20  re(v, j1);..    
7760: 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72 65  /* This just cre
7770: 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c  ates a place-hol
7780: 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68  der record in th
7790: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
77a0: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68  table..    ** Th
77b0: 65 20 72 65 63 6f 72 64 20 63 72 65 61 74 65 64  e record created
77c0: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
77d0: 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20  n anything yet. 
77e0: 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c   It will be repl
77f0: 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  aced.    ** by t
7800: 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e  he real entry in
7810: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
7820: 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  at sqlite3EndTab
7830: 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  le()..    **.   
7840: 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f   ** The rowid fo
7850: 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  r the new entry 
7860: 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73  is left in regis
7870: 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52  ter pParse->regR
7880: 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65  owid..    ** The
7890: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
78a0: 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  r of the new tab
78b0: 6c 65 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65  le is left in re
78c0: 67 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f  g pParse->regRoo
78d0: 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  t..    ** The ro
78e0: 77 69 64 20 61 6e 64 20 72 6f 6f 74 20 70 61 67  wid and root pag
78f0: 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 65 73 20  e number values 
7900: 61 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68  are needed by th
7910: 65 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20  e code that.    
7920: 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  ** sqlite3EndTab
7930: 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  le will generate
7940: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64 65  ..    */.#if !de
7950: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7960: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
7970: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7980: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
7990: 20 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c 20    if( isView || 
79a0: 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20  isVirtual ){.   
79b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
79c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
79d0: 65 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20 20  er, 0, reg2);.  
79e0: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
79f0: 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74     {.      sqlit
7a00: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7a10: 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20  OP_CreateTable, 
7a20: 69 44 62 2c 20 72 65 67 32 29 3b 0a 20 20 20 20  iDb, reg2);.    
7a30: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65  }.    sqlite3Ope
7a40: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50 61  nMasterTable(pPa
7a50: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  rse, iDb);.    s
7a60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7a70: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
7a80: 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73   0, reg1);.    s
7a90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7aa0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
7ab0: 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74  reg3);.    sqlit
7ac0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7ad0: 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 72 65  OP_Insert, 0, re
7ae0: 67 33 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73  g3, reg1);.    s
7af0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
7b00: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
7b10: 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  END);.    sqlite
7b20: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
7b30: 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a 20  P_Close);.  }.. 
7b40: 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d   /* Normal (non-
7b50: 65 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a  error) return. *
7b60: 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  /.  return;..  /
7b70: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
7b80: 63 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68 65  curs, we jump he
7b90: 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c  re */.begin_tabl
7ba0: 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74  e_error:.  sqlit
7bb0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
7bc0: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  me);.  return;.}
7bd0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63  ../*.** This mac
7be0: 72 6f 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  ro is used to co
7bf0: 6d 70 61 72 65 20 74 77 6f 20 73 74 72 69 6e 67  mpare two string
7c00: 73 20 69 6e 20 61 20 63 61 73 65 2d 69 6e 73 65  s in a case-inse
7c10: 6e 73 69 74 69 76 65 20 6d 61 6e 6e 65 72 2e 0a  nsitive manner..
7c20: 2a 2a 20 49 74 20 69 73 20 73 6c 69 67 68 74 6c  ** It is slightl
7c30: 79 20 66 61 73 74 65 72 20 74 68 61 6e 20 63 61  y faster than ca
7c40: 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 53 74 72  lling sqlite3Str
7c50: 49 43 6d 70 28 29 20 64 69 72 65 63 74 6c 79 2c  ICmp() directly,
7c60: 20 62 75 74 0a 2a 2a 20 70 72 6f 64 75 63 65 73   but.** produces
7c70: 20 6c 61 72 67 65 72 20 63 6f 64 65 2e 0a 2a 2a   larger code..**
7c80: 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68 69  .** WARNING: Thi
7c90: 73 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 63  s macro is not c
7ca0: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
7cb0: 68 65 20 73 74 72 63 6d 70 28 29 20 66 61 6d 69  he strcmp() fami
7cc0: 6c 79 2e 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e  ly. It.** return
7cd0: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74 77  s true if the tw
7ce0: 6f 20 73 74 72 69 6e 67 73 20 61 72 65 20 65 71  o strings are eq
7cf0: 75 61 6c 2c 20 6f 74 68 65 72 77 69 73 65 20 66  ual, otherwise f
7d00: 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  alse..*/.#define
7d10: 20 53 54 52 49 43 4d 50 28 78 2c 20 79 29 20 28   STRICMP(x, y) (
7d20: 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f  \.sqlite3UpperTo
7d30: 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64  Lower[*(unsigned
7d40: 20 63 68 61 72 20 2a 29 28 78 29 5d 3d 3d 20 20   char *)(x)]==  
7d50: 20 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54   \.sqlite3UpperT
7d60: 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65  oLower[*(unsigne
7d70: 64 20 63 68 61 72 20 2a 29 28 79 29 5d 20 20 20  d char *)(y)]   
7d80: 20 20 5c 0a 26 26 20 73 71 6c 69 74 65 33 53 74    \.&& sqlite3St
7d90: 72 49 43 6d 70 28 28 78 29 2b 31 2c 28 79 29 2b  rICmp((x)+1,(y)+
7da0: 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41  1)==0 )../*.** A
7db0: 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20  dd a new column 
7dc0: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
7dd0: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e  rently being con
7de0: 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  structed..**.** 
7df0: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
7e00: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   this routine on
7e10: 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ce for each colu
7e20: 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  mn declaration.*
7e30: 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41  * in a CREATE TA
7e40: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
7e50: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
7e60: 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a  e() gets called.
7e70: 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74 20  ** first to get 
7e80: 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54  things going.  T
7e90: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
7ea0: 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65   is called for e
7eb0: 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a  ach.** column..*
7ec0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
7ed0: 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70  dColumn(Parse *p
7ee0: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
7ef0: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
7f00: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
7f10: 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  r *z;.  Column *
7f20: 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20  pCol;.  sqlite3 
7f30: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
7f40: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
7f50: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
7f60: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66  =0 ) return;.#if
7f70: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
7f80: 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c  MN.  if( p->nCol
7f90: 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  +1>db->aLimit[SQ
7fa0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
7fb0: 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  N] ){.    sqlite
7fc0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7fd0: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
7fe0: 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a  mns on %s", p->z
7ff0: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
8000: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  n;.  }.#endif.  
8010: 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  z = sqlite3NameF
8020: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61  romToken(db, pNa
8030: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  me);.  if( z==0 
8040: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
8050: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
8060: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 54  i++){.    if( ST
8070: 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43 6f 6c  RICMP(z, p->aCol
8080: 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  [i].zName) ){.  
8090: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
80a0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75 70  Msg(pParse, "dup
80b0: 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61  licate column na
80c0: 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20  me: %s", z);.   
80d0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
80e0: 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72  (db, z);.      r
80f0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
8100: 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20  .  if( (p->nCol 
8110: 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20  & 0x7)==0 ){.   
8120: 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20   Column *aNew;. 
8130: 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65     aNew = sqlite
8140: 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70 2d  3DbRealloc(db,p-
8150: 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38  >aCol,(p->nCol+8
8160: 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  )*sizeof(p->aCol
8170: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61  [0]));.    if( a
8180: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
8190: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
81a0: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , z);.      retu
81b0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  rn;.    }.    p-
81c0: 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20  >aCol = aNew;.  
81d0: 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61  }.  pCol = &p->a
81e0: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20  Col[p->nCol];.  
81f0: 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20  memset(pCol, 0, 
8200: 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30  sizeof(p->aCol[0
8210: 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61  ]));.  pCol->zNa
8220: 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49  me = z;. .  /* I
8230: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79  f there is no ty
8240: 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f  pe specified, co
8250: 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64  lumns have the d
8260: 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a  efault affinity.
8270: 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20    ** 'NONE'. If 
8280: 74 68 65 72 65 20 69 73 20 61 20 74 79 70 65 20  there is a type 
8290: 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20  specified, then 
82a0: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
82b0: 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a  Type() will.  **
82c0: 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78 74 20   be called next 
82d0: 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66  to set pCol->aff
82e0: 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c 79 2e  inity correctly.
82f0: 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66  .  */.  pCol->af
8300: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
8310: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 6e  AFF_NONE;.  p->n
8320: 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Col++;.}../*.** 
8330: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
8340: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
8350: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
8360: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
8370: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
8380: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
8390: 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63    A "NOT NULL" c
83a0: 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a  onstraint has.**
83b0: 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20   been seen on a 
83c0: 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f  column.  This ro
83d0: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e  utine sets the n
83e0: 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a  otNull flag on.*
83f0: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72  * the column cur
8400: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
8410: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
8420: 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74  id sqlite3AddNot
8430: 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72  Null(Parse *pPar
8440: 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29  se, int onError)
8450: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
8460: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
8470: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
8480: 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43  0 || NEVER(p->nC
8490: 6f 6c 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a  ol<1) ) return;.
84a0: 20 20 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f    p->aCol[p->nCo
84b0: 6c 2d 31 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28  l-1].notNull = (
84c0: 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f  u8)onError;.}../
84d0: 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f  *.** Scan the co
84e0: 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a  lumn type name z
84f0: 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79  Type (length nTy
8500: 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74  pe) and return t
8510: 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  he.** associated
8520: 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a   affinity type..
8530: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8540: 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69  ne does a case-i
8550: 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63  ndependent searc
8560: 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74  h of zType for t
8570: 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67  he .** substring
8580: 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s in the followi
8590: 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65  ng table. If one
85a0: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
85b0: 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20  gs is.** found, 
85c0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
85d0: 67 20 61 66 66 69 6e 69 74 79 20 69 73 20 72 65  g affinity is re
85e0: 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65  turned. If zType
85f0: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72   contains.** mor
8600: 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68  e than one of th
8610: 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e  e substrings, en
8620: 74 72 69 65 73 20 74 6f 77 61 72 64 20 74 68 65  tries toward the
8630: 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20   top of .** the 
8640: 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72  table take prior
8650: 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ity. For example
8660: 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20 27 42  , if zType is 'B
8670: 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c  LOBINT', .** SQL
8680: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
8690: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
86a0: 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20 20  ** Substring    
86b0: 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d   | Affinity.** -
86c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
86e0: 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20 20  ** 'INT'        
86f0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   | SQLITE_AFF_IN
8700: 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20  TEGER.** 'CHAR' 
8710: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
8720: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f  AFF_TEXT.** 'CLO
8730: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
8740: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
8750: 54 45 58 54 27 20 20 20 20 20 20 20 20 7c 20 53  TEXT'        | S
8760: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a  QLITE_AFF_TEXT.*
8770: 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20  * 'BLOB'        
8780: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  | SQLITE_AFF_NON
8790: 45 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20  E.** 'REAL'     
87a0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
87b0: 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20  REAL.** 'FLOA'  
87c0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
87d0: 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42  FF_REAL.** 'DOUB
87e0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
87f0: 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a  E_AFF_REAL.**.**
8800: 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   If none of the 
8810: 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68  substrings in th
8820: 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72  e above table ar
8830: 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49  e found,.** SQLI
8840: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69  TE_AFF_NUMERIC i
8850: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63  s returned..*/.c
8860: 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e  har sqlite3Affin
8870: 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68  ityType(const ch
8880: 61 72 20 2a 7a 49 6e 29 7b 0a 20 20 75 33 32 20  ar *zIn){.  u32 
8890: 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66  h = 0;.  char af
88a0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  f = SQLITE_AFF_N
88b0: 55 4d 45 52 49 43 3b 0a 0a 20 20 69 66 28 20 7a  UMERIC;..  if( z
88c0: 49 6e 20 29 20 77 68 69 6c 65 28 20 7a 49 6e 5b  In ) while( zIn[
88d0: 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20 28 68  0] ){.    h = (h
88e0: 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55 70  <<8) + sqlite3Up
88f0: 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e  perToLower[(*zIn
8900: 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49 6e  )&0xff];.    zIn
8910: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28  ++;.    if( h==(
8920: 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c  ('c'<<24)+('h'<<
8930: 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27  16)+('a'<<8)+'r'
8940: 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  ) ){            
8950: 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20   /* CHAR */.    
8960: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
8970: 46 46 5f 54 45 58 54 3b 20 0a 20 20 20 20 7d 65  FF_TEXT; .    }e
8980: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27  lse if( h==(('c'
8990: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
89a0: 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b  ('o'<<8)+'b') ){
89b0: 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a         /* CLOB *
89c0: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
89d0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
89e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
89f0: 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c  (('t'<<24)+('e'<
8a00: 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74  <16)+('x'<<8)+'t
8a10: 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54  ') ){       /* T
8a20: 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  EXT */.      aff
8a30: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   = SQLITE_AFF_TE
8a40: 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  XT;.    }else if
8a50: 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b  ( h==(('b'<<24)+
8a60: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
8a70: 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20  8)+'b')         
8a80: 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20   /* BLOB */.    
8a90: 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c      && (aff==SQL
8aa0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
8ab0: 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
8ac0: 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20 20  FF_REAL) ){.    
8ad0: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
8ae0: 46 46 5f 4e 4f 4e 45 3b 0a 23 69 66 6e 64 65 66  FF_NONE;.#ifndef
8af0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
8b00: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
8b10: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
8b20: 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36  r'<<24)+('e'<<16
8b30: 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20  )+('a'<<8)+'l') 
8b40: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41 4c           /* REAL
8b50: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
8b60: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
8b70: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
8b80: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
8b90: 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _REAL;.    }else
8ba0: 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32   if( h==(('f'<<2
8bb0: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
8bc0: 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20 20 20  '<<8)+'a')      
8bd0: 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20      /* FLOA */. 
8be0: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
8bf0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
8c00: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
8c10: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
8c20: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8c30: 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28 27  h==(('d'<<24)+('
8c40: 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29  o'<<16)+('u'<<8)
8c50: 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'b')          /
8c60: 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20  * DOUB */.      
8c70: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
8c80: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
8c90: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
8ca0: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e  TE_AFF_REAL;.#en
8cb0: 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  dif.    }else if
8cc0: 28 20 28 68 26 30 78 30 30 46 46 46 46 46 46 29  ( (h&0x00FFFFFF)
8cd0: 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e  ==(('i'<<16)+('n
8ce0: 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20  '<<8)+'t') ){   
8cf0: 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20   /* INT */.     
8d00: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
8d10: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20  F_INTEGER;.     
8d20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
8d30: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b  }..  return aff;
8d40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
8d50: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8d60: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
8d70: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
8d80: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
8d90: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
8da0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
8db0: 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73 20  pFirst token is 
8dc0: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b  the first.** tok
8dd0: 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e  en in the sequen
8de0: 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61  ce of tokens tha
8df0: 74 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74  t describe the t
8e00: 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  ype of the.** co
8e10: 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75  lumn currently u
8e20: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
8e30: 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74 68  n.   pLast is th
8e40: 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20  e last token.** 
8e50: 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 2e  in the sequence.
8e60: 20 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f 72    Use this infor
8e70: 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72  mation to constr
8e80: 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20  uct a string.** 
8e90: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
8ea0: 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74 68  e typename of th
8eb0: 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f  e column and sto
8ec0: 72 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a 2a  re that string.*
8ed0: 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a  * in zType..*/ .
8ee0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
8ef0: 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20  olumnType(Parse 
8f00: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
8f10: 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20  pType){.  Table 
8f20: 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *p;.  Column *pC
8f30: 6f 6c 3b 0a 0a 20 20 70 20 3d 20 70 50 61 72 73  ol;..  p = pPars
8f40: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
8f50: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45  if( p==0 || NEVE
8f60: 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72  R(p->nCol<1) ) r
8f70: 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20  eturn;.  pCol = 
8f80: 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c  &p->aCol[p->nCol
8f90: 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  -1];.  assert( p
8fa0: 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20 29 3b  Col->zType==0 );
8fb0: 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d  .  pCol->zType =
8fc0: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
8fd0: 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62  Token(pParse->db
8fe0: 2c 20 70 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c  , pType);.  pCol
8ff0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c  ->affinity = sql
9000: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
9010: 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 7d  (pCol->zType);.}
9020: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72  ../*.** The expr
9030: 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65  ession is the de
9040: 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
9050: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
9060: 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a  y added column.*
9070: 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  * of the table c
9080: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
9090: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a  onstruction..**.
90a0: 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65  ** Default value
90b0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73   expressions mus
90c0: 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20  t be constant.  
90d0: 52 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69  Raise an excepti
90e0: 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73  on if this.** is
90f0: 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a   not the case..*
9100: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9110: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
9120: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
9130: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
9140: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
9150: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
9160: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
9170: 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56  lite3AddDefaultV
9180: 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72  alue(Parse *pPar
9190: 73 65 2c 20 45 78 70 72 53 70 61 6e 20 2a 70 53  se, ExprSpan *pS
91a0: 70 61 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  pan){.  Table *p
91b0: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
91c0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
91d0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
91e0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
91f0: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d  Table;.  if( p!=
9200: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20  0 ){.    pCol = 
9210: 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f  &(p->aCol[p->nCo
9220: 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 21  l-1]);.    if( !
9230: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
9240: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
9250: 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 20 29 7b  pSpan->pExpr) ){
9260: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
9270: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
9280: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66  default value of
9290: 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20   column [%s] is 
92a0: 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20  not constant",. 
92b0: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a           pCol->z
92c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
92d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 70  {.      /* A cop
92e0: 79 20 6f 66 20 70 45 78 70 72 20 69 73 20 75 73  y of pExpr is us
92f0: 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ed instead of th
9300: 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20 70  e original, as p
9310: 45 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20 20  Expr contains.  
9320: 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74 68      ** tokens th
9330: 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c 61  at point to vola
9340: 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 20 54 68 65  tile memory. The
9350: 20 27 73 70 61 6e 27 20 6f 66 20 74 68 65 20 65   'span' of the e
9360: 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 20 20  xpression.      
9370: 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 20 62  ** is required b
9380: 79 20 70 72 61 67 6d 61 20 74 61 62 6c 65 5f 69  y pragma table_i
9390: 6e 66 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  nfo..      */.  
93a0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
93b0: 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  elete(db, pCol->
93c0: 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43  pDflt);.      pC
93d0: 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69  ol->pDflt = sqli
93e0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
93f0: 53 70 61 6e 2d 3e 70 45 78 70 72 2c 20 45 58 50  Span->pExpr, EXP
9400: 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
9410: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9420: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66 6c  e(db, pCol->zDfl
9430: 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e  t);.      pCol->
9440: 7a 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 44  zDflt = sqlite3D
9450: 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68  bStrNDup(db, (ch
9460: 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72  ar*)pSpan->zStar
9470: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
9480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9490: 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70 53          (int)(pS
94a0: 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61  pan->zEnd - pSpa
94b0: 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20 20  n->zStart));.   
94c0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
94d0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
94e0: 53 70 61 6e 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a  Span->pExpr);.}.
94f0: 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65  ./*.** Designate
9500: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
9510: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20   for the table. 
9520: 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74   pList is a list
9530: 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66   of names .** of
9540: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f   columns that fo
9550: 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  rm the primary k
9560: 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  ey.  If pList is
9570: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a   NULL, then the.
9580: 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  ** most recently
9590: 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66   added column of
95a0: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68   the table is th
95b0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a  e primary key..*
95c0: 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e  *.** A table can
95d0: 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e   have at most on
95e0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20  e primary key.  
95f0: 49 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72  If the table alr
9600: 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72  eady has.** a pr
9610: 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74  imary key (and t
9620: 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e  his is the secon
9630: 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74  d primary key) t
9640: 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a  hen create an.**
9650: 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66   error..**.** If
9660: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
9670: 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20   is on a single 
9680: 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74  column whose dat
9690: 61 74 79 70 65 20 69 73 20 49 4e 54 45 47 45 52  atype is INTEGER
96a0: 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c  ,.** then we wil
96b0: 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 61  l try to use tha
96c0: 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20  t column as the 
96d0: 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65 20  rowid.  Set the 
96e0: 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66  Table.iPKey.** f
96f0: 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c  ield of the tabl
9700: 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
9710: 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69  tion to be the i
9720: 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49  ndex of the.** I
9730: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
9740: 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c  EY column.  Tabl
9750: 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74  e.iPKey is set t
9760: 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73  o -1 if there is
9770: 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50  .** no INTEGER P
9780: 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a  RIMARY KEY..**.*
9790: 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20  * If the key is 
97a0: 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50  not an INTEGER P
97b0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e  RIMARY KEY, then
97c0: 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65   create a unique
97d0: 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68  .** index for th
97e0: 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78  e key.  No index
97f0: 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20   is created for 
9800: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
9810: 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  KEYs..*/.void sq
9820: 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b  lite3AddPrimaryK
9830: 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ey(.  Parse *pPa
9840: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
9850: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
9860: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
9870: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65    /* List of fie
9880: 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69  ld names to be i
9890: 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
98a0: 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a  onError,      /*
98b0: 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
98c0: 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f   a uniqueness co
98d0: 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20  nflict */.  int 
98e0: 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a  autoInc,      /*
98f0: 20 54 72 75 65 20 69 66 20 74 68 65 20 41 55 54   True if the AUT
9900: 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f  OINCREMENT keywo
9910: 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
9920: 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
9930: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53       /* SQLITE_S
9940: 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f  O_ASC or SQLITE_
9950: 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20  SO_DESC */.){.  
9960: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50  Table *pTab = pP
9970: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
9980: 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d  .  char *zType =
9990: 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d   0;.  int iCol =
99a0: 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20 70 54   -1, i;.  if( pT
99b0: 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c  ab==0 || IN_DECL
99c0: 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20  ARE_VTAB ) goto 
99d0: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
99e0: 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61  ;.  if( pTab->ta
99f0: 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50  bFlags & TF_HasP
9a00: 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20 20  rimaryKey ){.   
9a10: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9a20: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
9a30: 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61  "table \"%s\" ha
9a40: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
9a50: 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54  primary key", pT
9a60: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
9a70: 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79  goto primary_key
9a80: 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61  _exit;.  }.  pTa
9a90: 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
9aa0: 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 3b  F_HasPrimaryKey;
9ab0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
9ac0: 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54  ){.    iCol = pT
9ad0: 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20  ab->nCol - 1;.  
9ae0: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f    pTab->aCol[iCo
9af0: 6c 5d 2e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l].colFlags |= C
9b00: 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a  OLFLAG_PRIMKEY;.
9b10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
9b20: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
9b30: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
9b40: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
9b50: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69  ol<pTab->nCol; i
9b60: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
9b70: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
9b80: 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
9b90: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
9ba0: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  [iCol].zName)==0
9bb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
9bc0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
9bd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
9be0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
9bf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62   ){.        pTab
9c00: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 63 6f 6c  ->aCol[iCol].col
9c10: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
9c20: 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 20 20  _PRIMKEY;.      
9c30: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
9c40: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29  pList->nExpr>1 )
9c50: 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a   iCol = -1;.  }.
9c60: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26    if( iCol>=0 &&
9c70: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
9c80: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
9c90: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
9ca0: 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66  .zType;.  }.  if
9cb0: 28 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69 74  ( zType && sqlit
9cc0: 65 33 53 74 72 49 43 6d 70 28 7a 54 79 70 65 2c  e3StrICmp(zType,
9cd0: 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20   "INTEGER")==0. 
9ce0: 20 20 20 20 20 20 20 26 26 20 73 6f 72 74 4f 72         && sortOr
9cf0: 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41  der==SQLITE_SO_A
9d00: 53 43 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  SC ){.    pTab->
9d10: 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20  iPKey = iCol;.  
9d20: 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20    pTab->keyConf 
9d30: 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20  = (u8)onError;. 
9d40: 20 20 20 61 73 73 65 72 74 28 20 61 75 74 6f 49     assert( autoI
9d50: 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63  nc==0 || autoInc
9d60: 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 61 62 2d  ==1 );.    pTab-
9d70: 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 61 75 74  >tabFlags |= aut
9d80: 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72  oInc*TF_Autoincr
9d90: 65 6d 65 6e 74 3b 0a 20 20 7d 65 6c 73 65 20 69  ement;.  }else i
9da0: 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69  f( autoInc ){.#i
9db0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9dc0: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
9dd0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
9de0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41 55 54  Msg(pParse, "AUT
9df0: 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e  OINCREMENT is on
9e00: 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e  ly allowed on an
9e10: 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45 47   ".       "INTEG
9e20: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 29  ER PRIMARY KEY")
9e30: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
9e40: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a  {.    Index *p;.
9e50: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 43      p = sqlite3C
9e60: 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73  reateIndex(pPars
9e70: 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73  e, 0, 0, 0, pLis
9e80: 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30  t, onError, 0, 0
9e90: 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20 30 29 3b  , sortOrder, 0);
9ea0: 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
9eb0: 20 20 20 20 70 2d 3e 61 75 74 6f 49 6e 64 65 78      p->autoIndex
9ec0: 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 2;.    }.    
9ed0: 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pList = 0;.  }..
9ee0: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
9ef0: 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  :.  sqlite3ExprL
9f00: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
9f10: 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  ->db, pList);.  
9f20: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
9f30: 20 41 64 64 20 61 20 6e 65 77 20 43 48 45 43 4b   Add a new CHECK
9f40: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 74   constraint to t
9f50: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
9f60: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
9f70: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
9f80: 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f  qlite3AddCheckCo
9f90: 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
9fa0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
9fb0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
9fc0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 68 65   */.  Expr *pChe
9fd0: 63 6b 45 78 70 72 20 20 2f 2a 20 54 68 65 20 63  ckExpr  /* The c
9fe0: 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 20  heck expression 
9ff0: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
a000: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
a010: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
a020: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
a030: 65 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26 26  e;.  if( pTab &&
a040: 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41   !IN_DECLARE_VTA
a050: 42 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 70  B ){.    pTab->p
a060: 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  Check = sqlite3E
a070: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
a080: 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65  arse, pTab->pChe
a090: 63 6b 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b  ck, pCheckExpr);
a0a0: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
a0b0: 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e  >constraintName.
a0c0: 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  n ){.      sqlit
a0d0: 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d  e3ExprListSetNam
a0e0: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  e(pParse, pTab->
a0f0: 70 43 68 65 63 6b 2c 20 26 70 50 61 72 73 65 2d  pCheck, &pParse-
a100: 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2c  >constraintName,
a110: 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   1);.    }.  }el
a120: 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
a130: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
a140: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
a150: 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 7d  pCheckExpr);.  }
a160: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
a170: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  e collation func
a180: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
a190: 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64   recently parsed
a1a0: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a   table column.**
a1b0: 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20   to the CollSeq 
a1c0: 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  given..*/.void s
a1d0: 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65  qlite3AddCollate
a1e0: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
a1f0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  se, Token *pToke
a200: 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  n){.  Table *p;.
a210: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
a220: 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *zColl;         
a230: 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65 64       /* Dequoted
a240: 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69   name of collati
a250: 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20  on sequence */. 
a260: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
a270: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
a280: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
a290: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
a2a0: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62 20  p->nCol-1;.  db 
a2b0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
a2c0: 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e  zColl = sqlite3N
a2d0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
a2e0: 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20   pToken);.  if( 
a2f0: 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b  !zColl ) return;
a300: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c  ..  if( sqlite3L
a310: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
a320: 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20  rse, zColl) ){. 
a330: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
a340: 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a      p->aCol[i].z
a350: 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20  Coll = zColl;.  
a360: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
a370: 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65  olumn is declare
a380: 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49  d as "<name> PRI
a390: 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45  MARY KEY COLLATE
a3a0: 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a   <type>",.    **
a3b0: 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d   then an index m
a3c0: 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72 65  ay have been cre
a3d0: 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c  ated on this col
a3e0: 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20  umn before the. 
a3f0: 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20     ** collation 
a400: 74 79 70 65 20 77 61 73 20 61 64 64 65 64 2e 20  type was added. 
a410: 43 6f 72 72 65 63 74 20 74 68 69 73 20 69 66 20  Correct this if 
a420: 69 74 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  it is the case..
a430: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
a440: 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70  Idx=p->pIndex; p
a450: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
a460: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
a470: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
a480: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
a490: 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
a4a0: 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20  mn[0]==i ){.    
a4b0: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
a4c0: 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d  [0] = p->aCol[i]
a4d0: 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  .zColl;.      }.
a4e0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
a4f0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
a500: 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, zColl);.  }
a510: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
a520: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
a530: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
a540: 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62  quence for datab
a550: 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a  ase native text.
a560: 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e  ** encoding iden
a570: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73 74  tified by the st
a580: 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67  ring zName, leng
a590: 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  th nName..**.** 
a5a0: 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
a5b0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
a5c0: 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  nce is not avail
a5d0: 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61  able, or not ava
a5e0: 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65  ilable.** in the
a5f0: 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65   database native
a600: 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63   encoding, the c
a610: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
a620: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a   is invoked to.*
a630: 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49 66  * request it. If
a640: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
a650: 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20  actory does not 
a660: 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73 65  supply such a se
a670: 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74  quence,.** and t
a680: 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20 61  he sequence is a
a690: 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74  vailable in anot
a6a0: 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  her text encodin
a6b0: 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a  g, then that is.
a6c0: 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  ** returned inst
a6d0: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ead..**.** If no
a6e0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
a6f0: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
a700: 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61  tions sequence a
a710: 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72  re available, or
a720: 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f  .** another erro
a730: 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
a740: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61  s returned and a
a750: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
a760: 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
a770: 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  pParse..**.** Th
a780: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
a790: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
a7a0: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
a7b0: 71 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69  q().  This routi
a7c0: 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68  ne.** invokes th
a7d0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
a7e0: 6f 72 79 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ory if the named
a7f0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f   collation canno
a800: 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e  t be found.** an
a810: 64 20 67 65 6e 65 72 61 74 65 73 20 61 6e 20 65  d generates an e
a820: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2a  rror message..**
a830: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71  .** See also: sq
a840: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
a850: 28 29 2c 20 73 71 6c 69 74 65 33 47 65 74 43 6f  (), sqlite3GetCo
a860: 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53  llSeq().*/.CollS
a870: 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74  eq *sqlite3Locat
a880: 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  eCollSeq(Parse *
a890: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
a8a0: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71  ar *zName){.  sq
a8b0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
a8c0: 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63  se->db;.  u8 enc
a8d0: 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75 38   = ENC(db);.  u8
a8e0: 20 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d 3e   initbusy = db->
a8f0: 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c  init.busy;.  Col
a900: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20  lSeq *pColl;..  
a910: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
a920: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65  indCollSeq(db, e
a930: 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69 6e 69 74 62  nc, zName, initb
a940: 75 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69  usy);.  if( !ini
a950: 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c  tbusy && (!pColl
a960: 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70   || !pColl->xCmp
a970: 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  ) ){.    pColl =
a980: 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53   sqlite3GetCollS
a990: 65 71 28 64 62 2c 20 65 6e 63 2c 20 70 43 6f 6c  eq(db, enc, pCol
a9a0: 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  l, zName);.    i
a9b0: 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
a9c0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
a9d0: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
a9e0: 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  uch collation se
a9f0: 71 75 65 6e 63 65 3a 20 25 73 22 2c 20 7a 4e 61  quence: %s", zNa
aa00: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  me);.    }.  }..
aa10: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
aa20: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
aa30: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
aa40: 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  l increment the 
aa50: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a  schema cookie..*
aa60: 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20  *.** The schema 
aa70: 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74  cookie is used t
aa80: 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e  o determine when
aa90: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
aaa0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
aab0: 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20  changes.  After 
aac0: 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e  each schema chan
aad0: 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76  ge, the cookie v
aae0: 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e  alue.** changes.
aaf0: 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73    When a process
ab00: 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68 65   first reads the
ab10: 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72   schema it recor
ab20: 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65  ds the.** cookie
ab30: 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20 77  .  Thereafter, w
ab40: 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20  henever it goes 
ab50: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
ab60: 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68  tabase,.** it ch
ab70: 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20  ecks the cookie 
ab80: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
ab90: 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20   schema has not 
aba0: 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65  changed.** since
abb0: 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65 61   it was last rea
abc0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c  d..**.** This pl
abd0: 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65  an is not comple
abe0: 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f  tely bullet-proo
abf0: 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62  f.  It is possib
ac00: 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63  le for.** the sc
ac10: 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d  hema to change m
ac20: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e  ultiple times an
ac30: 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65  d for the cookie
ac40: 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61   to be.** set ba
ac50: 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75  ck to prior valu
ac60: 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20 63  e.  But schema c
ac70: 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65  hanges are infre
ac80: 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65  quent.** and the
ac90: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
aca0: 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65  hitting the same
acb0: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73   cookie value is
acc0: 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63   only.** 1 chanc
acd0: 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77  e in 2^32.  So w
ace0: 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68  e're safe enough
acf0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
ad00: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61  3ChangeCookie(Pa
ad10: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
ad20: 20 69 44 62 29 7b 0a 20 20 69 6e 74 20 72 31 20   iDb){.  int r1 
ad30: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
ad40: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
ad50: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
ad60: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
ad70: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
ad80: 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  be;.  assert( sq
ad90: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
ada0: 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
adb0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
adc0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
add0: 74 65 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b 69  teger, db->aDb[i
ade0: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68  Db].pSchema->sch
adf0: 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 72 31  ema_cookie+1, r1
ae00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
ae10: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74  AddOp3(v, OP_Set
ae20: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52  Cookie, iDb, BTR
ae30: 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f  EE_SCHEMA_VERSIO
ae40: 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  N, r1);.  sqlite
ae50: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
ae60: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a  pParse, r1);.}..
ae70: 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68  /*.** Measure th
ae80: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
ae90: 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f  acters needed to
aea0: 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   output the give
aeb0: 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e  n.** identifier.
aec0: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74    The number ret
aed0: 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61  urned includes a
aee0: 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a  ny quotes used.*
aef0: 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69  * but does not i
af00: 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20  nclude the null 
af10: 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a  terminator..**.*
af20: 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 20 69  * The estimate i
af30: 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20  s conservative. 
af40: 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72   It might be lar
af50: 67 65 72 20 74 68 61 74 20 77 68 61 74 20 69 73  ger that what is
af60: 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65  .** really neede
af70: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
af80: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e   identLength(con
af90: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
afa0: 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b  nt n;.  for(n=0;
afb0: 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a   *z; n++, z++){.
afc0: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20      if( *z=='"' 
afd0: 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20  ){ n++; }.  }.  
afe0: 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a  return n + 2;.}.
aff0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ./*.** The first
b000: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
b010: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75  pointer to an ou
b020: 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 65  tput buffer. The
b030: 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61   second .** para
b040: 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
b050: 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  er to an integer
b060: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
b070: 68 65 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20  he offset at.** 
b080: 77 68 69 63 68 20 74 6f 20 77 72 69 74 65 20 69  which to write i
b090: 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62  nto the output b
b0a0: 75 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63  uffer. This func
b0b0: 74 69 6f 6e 20 63 6f 70 69 65 73 20 74 68 65 0a  tion copies the.
b0c0: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  ** nul-terminate
b0d0: 64 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64  d string pointed
b0e0: 20 74 6f 20 62 79 20 74 68 65 20 74 68 69 72 64   to by the third
b0f0: 20 70 61 72 61 6d 65 74 65 72 2c 20 7a 53 69 67   parameter, zSig
b100: 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20  nedIdent,.** to 
b110: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 66  the specified of
b120: 66 73 65 74 20 69 6e 20 74 68 65 20 62 75 66 66  fset in the buff
b130: 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 2a  er and updates *
b140: 70 49 64 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a  pIdx to refer.**
b150: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
b160: 74 65 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  te after the las
b170: 74 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 62  t byte written b
b180: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
b190: 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 73  .** .** If the s
b1a0: 74 72 69 6e 67 20 7a 53 69 67 6e 65 64 49 64 65  tring zSignedIde
b1b0: 6e 74 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69  nt consists enti
b1c0: 72 65 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75  rely of alpha-nu
b1d0: 6d 65 72 69 63 0a 2a 2a 20 63 68 61 72 61 63 74  meric.** charact
b1e0: 65 72 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65  ers, does not be
b1f0: 67 69 6e 20 77 69 74 68 20 61 20 64 69 67 69 74  gin with a digit
b200: 20 61 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20 53   and is not an S
b210: 51 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74  QL keyword,.** t
b220: 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64  hen it is copied
b230: 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62   to the output b
b240: 75 66 66 65 72 20 65 78 61 63 74 6c 79 20 61 73  uffer exactly as
b250: 20 69 74 20 69 73 2e 20 4f 74 68 65 72 77 69 73   it is. Otherwis
b260: 65 2c 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f 74  e,.** it is quot
b270: 65 64 20 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d  ed using double-
b280: 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  quotes..*/.stati
b290: 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28  c void identPut(
b2a0: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49  char *z, int *pI
b2b0: 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65  dx, char *zSigne
b2c0: 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67  dIdent){.  unsig
b2d0: 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74  ned char *zIdent
b2e0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
b2f0: 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b  r*)zSignedIdent;
b300: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65  .  int i, j, nee
b310: 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70  dQuote;.  i = *p
b320: 49 64 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b  Idx;..  for(j=0;
b330: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
b340: 7b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  {.    if( !sqlit
b350: 65 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74  e3Isalnum(zIdent
b360: 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a  [j]) && zIdent[j
b370: 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a  ]!='_' ) break;.
b380: 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20    }.  needQuote 
b390: 3d 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  = sqlite3Isdigit
b3a0: 28 7a 49 64 65 6e 74 5b 30 5d 29 20 7c 7c 20 73  (zIdent[0]) || s
b3b0: 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64  qlite3KeywordCod
b3c0: 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b  e(zIdent, j)!=TK
b3d0: 5f 49 44 3b 0a 20 20 69 66 28 20 21 6e 65 65 64  _ID;.  if( !need
b3e0: 51 75 6f 74 65 20 29 7b 0a 20 20 20 20 6e 65 65  Quote ){.    nee
b3f0: 64 51 75 6f 74 65 20 3d 20 7a 49 64 65 6e 74 5b  dQuote = zIdent[
b400: 6a 5d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e  j];.  }..  if( n
b410: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b  eedQuote ) z[i++
b420: 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a  ] = '"';.  for(j
b430: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
b440: 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20  ++){.    z[i++] 
b450: 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20  = zIdent[j];.   
b460: 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d   if( zIdent[j]==
b470: 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  '"' ) z[i++] = '
b480: 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65  "';.  }.  if( ne
b490: 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d  edQuote ) z[i++]
b4a0: 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d   = '"';.  z[i] =
b4b0: 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b   0;.  *pIdx = i;
b4c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
b4d0: 74 65 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  te a CREATE TABL
b4e0: 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72  E statement appr
b4f0: 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20  opriate for the 
b500: 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20  given.** table. 
b510: 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20   Memory to hold 
b520: 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  the text of the 
b530: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74  statement is obt
b540: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71  ained.** from sq
b550: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
b560: 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
b570: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
b580: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
b590: 63 20 63 68 61 72 20 2a 63 72 65 61 74 65 54 61  c char *createTa
b5a0: 62 6c 65 53 74 6d 74 28 73 71 6c 69 74 65 33 20  bleStmt(sqlite3 
b5b0: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a  *db, Table *p){.
b5c0: 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20    int i, k, n;. 
b5d0: 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20   char *zStmt;.  
b5e0: 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65  char *zSep, *zSe
b5f0: 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c  p2, *zEnd;.  Col
b600: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d  umn *pCol;.  n =
b610: 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d   0;.  for(pCol =
b620: 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69   p->aCol, i=0; i
b630: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  <p->nCol; i++, p
b640: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d  Col++){.    n +=
b650: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f   identLength(pCo
b660: 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a 20  l->zName) + 5;. 
b670: 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c   }.  n += identL
b680: 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b  ength(p->zName);
b690: 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 20 0a  .  if( n<50 ){ .
b6a0: 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20      zSep = "";. 
b6b0: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a     zSep2 = ",";.
b6c0: 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a      zEnd = ")";.
b6d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65    }else{.    zSe
b6e0: 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20  p = "\n  ";.    
b6f0: 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b  zSep2 = ",\n  ";
b700: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29  .    zEnd = "\n)
b710: 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35  ";.  }.  n += 35
b720: 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20   + 6*p->nCol;.  
b730: 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 44  zStmt = sqlite3D
b740: 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 29  bMallocRaw(0, n)
b750: 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30  ;.  if( zStmt==0
b760: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c   ){.    db->mall
b770: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
b780: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
b790: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
b7a0: 74 66 28 6e 2c 20 7a 53 74 6d 74 2c 20 22 43 52  tf(n, zStmt, "CR
b7b0: 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20  EATE TABLE ");. 
b7c0: 20 6b 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   k = sqlite3Strl
b7d0: 65 6e 33 30 28 7a 53 74 6d 74 29 3b 0a 20 20 69  en30(zStmt);.  i
b7e0: 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26  dentPut(zStmt, &
b7f0: 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  k, p->zName);.  
b800: 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27  zStmt[k++] = '('
b810: 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e  ;.  for(pCol=p->
b820: 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e  aCol, i=0; i<p->
b830: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
b840: 2b 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  +){.    static c
b850: 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73  onst char * cons
b860: 74 20 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a 20  t azType[] = {. 
b870: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
b880: 5f 41 46 46 5f 54 45 58 54 20 20 20 20 2a 2f 20  _AFF_TEXT    */ 
b890: 22 20 54 45 58 54 22 2c 0a 20 20 20 20 20 20 20  " TEXT",.       
b8a0: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e   /* SQLITE_AFF_N
b8b0: 4f 4e 45 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20  ONE    */ "",.  
b8c0: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
b8d0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 2a 2f 20 22  AFF_NUMERIC */ "
b8e0: 20 4e 55 4d 22 2c 0a 20 20 20 20 20 20 20 20 2f   NUM",.        /
b8f0: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  * SQLITE_AFF_INT
b900: 45 47 45 52 20 2a 2f 20 22 20 49 4e 54 22 2c 0a  EGER */ " INT",.
b910: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
b920: 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 2a 2f  E_AFF_REAL    */
b930: 20 22 20 52 45 41 4c 22 0a 20 20 20 20 7d 3b 0a   " REAL".    };.
b940: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
b950: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
b960: 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  pe;..    sqlite3
b970: 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26  _snprintf(n-k, &
b980: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b  zStmt[k], zSep);
b990: 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65  .    k += sqlite
b9a0: 33 53 74 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74  3Strlen30(&zStmt
b9b0: 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d  [k]);.    zSep =
b9c0: 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e   zSep2;.    iden
b9d0: 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20  tPut(zStmt, &k, 
b9e0: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
b9f0: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
ba00: 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f  affinity-SQLITE_
ba10: 41 46 46 5f 54 45 58 54 20 3e 3d 20 30 20 29 3b  AFF_TEXT >= 0 );
ba20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f  .    assert( pCo
ba30: 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49  l->affinity-SQLI
ba40: 54 45 5f 41 46 46 5f 54 45 58 54 20 3c 20 41 72  TE_AFF_TEXT < Ar
ba50: 72 61 79 53 69 7a 65 28 61 7a 54 79 70 65 29 20  raySize(azType) 
ba60: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
ba70: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
ba80: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
ba90: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
baa0: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
bab0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
bac0: 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  E );.    testcas
bad0: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
bae0: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  y==SQLITE_AFF_NU
baf0: 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 74 65 73  MERIC );.    tes
bb00: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
bb10: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
bb20: 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20  F_INTEGER );.   
bb30: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
bb40: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
bb50: 45 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20  E_AFF_REAL );.  
bb60: 20 20 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 61    .    zType = a
bb70: 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69  zType[pCol->affi
bb80: 6e 69 74 79 20 2d 20 53 51 4c 49 54 45 5f 41 46  nity - SQLITE_AF
bb90: 46 5f 54 45 58 54 5d 3b 0a 20 20 20 20 6c 65 6e  F_TEXT];.    len
bba0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
bbb0: 33 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 61  30(zType);.    a
bbc0: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66  ssert( pCol->aff
bbd0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
bbe0: 46 5f 4e 4f 4e 45 20 0a 20 20 20 20 20 20 20 20  F_NONE .        
bbf0: 20 20 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66      || pCol->aff
bc00: 69 6e 69 74 79 3d 3d 73 71 6c 69 74 65 33 41 66  inity==sqlite3Af
bc10: 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65  finityType(zType
bc20: 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) );.    memcpy(
bc30: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65  &zStmt[k], zType
bc40: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d  , len);.    k +=
bc50: 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74   len;.    assert
bc60: 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20  ( k<=n );.  }.  
bc70: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
bc80: 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c  (n-k, &zStmt[k],
bc90: 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20   "%s", zEnd);.  
bca0: 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a  return zStmt;.}.
bcb0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
bcc0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
bcd0: 20 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61   report the fina
bce0: 6c 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69  l ")" that termi
bcf0: 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54  nates.** a CREAT
bd00: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
bd10: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62  t..**.** The tab
bd20: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
bd30: 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72  t other action r
bd40: 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65  outines have bee
bd50: 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73  n building.** is
bd60: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
bd70: 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c  ternal hash tabl
bd80: 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20  es, assuming no 
bd90: 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f  errors have.** o
bda0: 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  ccurred..**.** A
bdb0: 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
bdc0: 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e  table is made in
bdd0: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
bde0: 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73  e on disk, unles
bdf0: 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74  s.** this is a t
be00: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
be10: 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  r db->init.busy=
be20: 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e  =1.  When db->in
be30: 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74  it.busy==1.** it
be40: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
be50: 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  ading the sqlite
be60: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65  _master table be
be70: 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a  cause we just.**
be80: 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68   connected to th
be90: 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65  e database or be
bea0: 63 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65  cause the sqlite
beb0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61  _master table ha
bec0: 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68  s.** recently ch
bed0: 61 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e  anged, so the en
bee0: 74 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62  try for this tab
bef0: 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
bf00: 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69  s in.** the sqli
bf10: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
bf20: 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74    We do not want
bf30: 20 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67   to create it ag
bf40: 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ain..**.** If th
bf50: 65 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65  e pSelect argume
bf60: 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nt is not NULL, 
bf70: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
bf80: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61  is routine.** wa
bf90: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
bfa0: 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72  te a table gener
bfb0: 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20  ated from a .** 
bfc0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e  "CREATE TABLE ..
bfd0: 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22  . AS SELECT ..."
bfe0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
bff0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66   column names of
c000: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c  .** the new tabl
c010: 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65  e will match the
c020: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
c030: 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f  he SELECT..*/.vo
c040: 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  id sqlite3EndTab
c050: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
c060: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
c070: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
c080: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73  /.  Token *pCons
c090: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
c0a0: 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74  he ',' token aft
c0b0: 65 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  er the last colu
c0c0: 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f  mn defn. */.  To
c0d0: 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20  ken *pEnd,      
c0e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6e        /* The fin
c0f0: 61 6c 20 27 29 27 20 74 6f 6b 65 6e 20 69 6e 20  al ')' token in 
c100: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
c110: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
c120: 65 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a  elect         /*
c130: 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22   Select from a "
c140: 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45  CREATE ... AS SE
c150: 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61  LECT" */.){.  Ta
c160: 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  ble *p;.  sqlite
c170: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
c180: 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
c190: 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26    if( (pEnd==0 &
c1a0: 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c  & pSelect==0) ||
c1b0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
c1c0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d ){.    return;
c1d0: 0a 20 20 7d 0a 20 20 70 20 3d 20 70 50 61 72 73  .  }.  p = pPars
c1e0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
c1f0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
c200: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64  n;..  assert( !d
c210: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
c220: 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 69  !pSelect );..  i
c230: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
c240: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d  maToIndex(db, p-
c250: 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e  >pSchema);..#ifn
c260: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c270: 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c  CHECK.  /* Resol
c280: 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20  ve names in all 
c290: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
c2a0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20   expressions..  
c2b0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43 68 65  */.  if( p->pChe
c2c0: 63 6b 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  ck ){.    SrcLis
c2d0: 74 20 73 53 72 63 3b 20 20 20 20 20 20 20 20 20  t sSrc;         
c2e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b            /* Fak
c2f0: 65 20 53 72 63 4c 69 73 74 20 66 6f 72 20 70 50  e SrcList for pP
c300: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
c310: 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
c320: 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20  xt sNC;         
c330: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63         /* Name c
c340: 6f 6e 74 65 78 74 20 66 6f 72 20 70 50 61 72 73  ontext for pPars
c350: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a  e->pNewTable */.
c360: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
c370: 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
c380: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
c390: 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ll CHECK constra
c3a0: 69 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ints */.    int 
c3b0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
c3d0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
c3e0: 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c      memset(&sNC,
c3f0: 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
c400: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 53  ;.    memset(&sS
c410: 72 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53  rc, 0, sizeof(sS
c420: 72 63 29 29 3b 0a 20 20 20 20 73 53 72 63 2e 6e  rc));.    sSrc.n
c430: 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 73 53 72  Src = 1;.    sSr
c440: 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 70  c.a[0].zName = p
c450: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 53 72  ->zName;.    sSr
c460: 63 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70 3b  c.a[0].pTab = p;
c470: 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 69  .    sSrc.a[0].i
c480: 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 20  Cursor = -1;.   
c490: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
c4a0: 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53  arse;.    sNC.pS
c4b0: 72 63 4c 69 73 74 20 3d 20 26 73 53 72 63 3b 0a  rcList = &sSrc;.
c4c0: 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20      sNC.ncFlags 
c4d0: 3d 20 4e 43 5f 49 73 43 68 65 63 6b 3b 0a 20 20  = NC_IsCheck;.  
c4e0: 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e 70 43 68    pList = p->pCh
c4f0: 65 63 6b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  eck;.    for(i=0
c500: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
c510: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
c520: 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  ( sqlite3Resolve
c530: 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20  ExprNames(&sNC, 
c540: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
c550: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  r) ){.        re
c560: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
c570: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
c580: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
c590: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f  E_OMIT_CHECK) */
c5a0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  ..  /* If the db
c5b0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31  ->init.busy is 1
c5c0: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
c5d0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c   reading the SQL
c5e0: 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73   off the.  ** "s
c5f0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72  qlite_master" or
c600: 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61   "sqlite_temp_ma
c610: 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74  ster" table on t
c620: 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f  he disk..  ** So
c630: 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f   do not write to
c640: 20 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e   the disk again.
c650: 20 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f    Extract the ro
c660: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  ot page number. 
c670: 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c   ** for the tabl
c680: 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69  e from the db->i
c690: 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c  nit.newTnum fiel
c6a0: 64 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e 75  d.  (The page nu
c6b0: 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  mber.  ** should
c6c0: 20 68 61 76 65 20 62 65 65 6e 20 70 75 74 20 74   have been put t
c6d0: 68 65 72 65 20 62 79 20 74 68 65 20 73 71 6c 69  here by the sqli
c6e0: 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65  teOpenCb routine
c6f0: 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  .).  */.  if( db
c700: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
c710: 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d     p->tnum = db-
c720: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
c730: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20   }..  /* If not 
c740: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68  initializing, th
c750: 65 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f  en create a reco
c760: 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  rd for the new t
c770: 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65  able.  ** in the
c780: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
c790: 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61  able of the data
c7a0: 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  base..  **.  ** 
c7b0: 49 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  If this is a TEM
c7c0: 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72  PORARY table, wr
c7d0: 69 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e  ite the entry in
c7e0: 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  to the auxiliary
c7f0: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65  .  ** file inste
c800: 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d  ad of into the m
c810: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
c820: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64  e..  */.  if( !d
c830: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
c840: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56      int n;.    V
c850: 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72  dbe *v;.    char
c860: 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22   *zType;    /* "
c870: 76 69 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22  view" or "table"
c880: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54   */.    char *zT
c890: 79 70 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57  ype2;   /* "VIEW
c8a0: 22 20 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a  " or "TABLE" */.
c8b0: 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b      char *zStmt;
c8c0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74      /* Text of t
c8d0: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
c8e0: 6f 72 20 43 52 45 41 54 45 20 56 49 45 57 20 73  or CREATE VIEW s
c8f0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20  tatement */..   
c900: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
c910: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
c920: 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
c930: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20   ) return;..    
c940: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c950: 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  1(v, OP_Close, 0
c960: 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20  );..    /* .    
c970: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54  ** Initialize zT
c980: 79 70 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ype for the new 
c990: 76 69 65 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20  view or table.. 
c9a0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
c9b0: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
c9c0: 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61       /* A regula
c9d0: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  r table */.     
c9e0: 20 7a 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22   zType = "table"
c9f0: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d  ;.      zType2 =
ca00: 20 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65   "TABLE";.#ifnde
ca10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
ca20: 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  EW.    }else{.  
ca30: 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f      /* A view */
ca40: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
ca50: 76 69 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79  view";.      zTy
ca60: 70 65 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65  pe2 = "VIEW";.#e
ca70: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
ca80: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
ca90: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 20  CREATE TABLE xx 
caa0: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65  AS SELECT ..., e
cab0: 78 65 63 75 74 65 20 74 68 65 20 53 45 4c 45 43  xecute the SELEC
cac0: 54 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65  T.    ** stateme
cad0: 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  nt to populate t
cae0: 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68  he new table. Th
caf0: 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  e root-page numb
cb00: 65 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a  er for the.    *
cb10: 2a 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 69  * new table is i
cb20: 6e 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73  n register pPars
cb30: 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20  e->regRoot..    
cb40: 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74  **.    ** Once t
cb50: 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65  he SELECT has be
cb60: 65 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69  en coded by sqli
cb70: 74 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20  te3Select(), it 
cb80: 69 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73  is in a.    ** s
cb90: 75 69 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f  uitable state to
cba0: 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 20 63   query for the c
cbb0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20  olumn names and 
cbc0: 74 79 70 65 73 20 74 6f 20 62 65 20 75 73 65 64  types to be used
cbd0: 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e  .    ** by the n
cbe0: 65 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  ew table..    **
cbf0: 0a 20 20 20 20 2a 2a 20 41 20 73 68 61 72 65 64  .    ** A shared
cc00: 2d 63 61 63 68 65 20 77 72 69 74 65 2d 6c 6f 63  -cache write-loc
cc10: 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  k is not require
cc20: 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  d to write to th
cc30: 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20 20  e new table,.   
cc40: 20 2a 2a 20 61 73 20 61 20 73 63 68 65 6d 61 2d   ** as a schema-
cc50: 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76 65 20 61  lock must have a
cc60: 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 62 74 61  lready been obta
cc70: 69 6e 65 64 20 74 6f 20 63 72 65 61 74 65 20 69  ined to create i
cc80: 74 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20  t. Since.    ** 
cc90: 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78  a schema-lock ex
cca0: 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72  cludes all other
ccb0: 20 64 61 74 61 62 61 73 65 20 75 73 65 72 73 2c   database users,
ccc0: 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20   the write-lock 
ccd0: 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20  would.    ** be 
cce0: 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a  redundant..    *
ccf0: 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  /.    if( pSelec
cd00: 74 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63  t ){.      Selec
cd10: 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20  tDest dest;.    
cd20: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
cd30: 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
cd40: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29  pParse->nTab==1)
cd50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
cd60: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
cd70: 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 70 50  OpenWrite, 1, pP
cd80: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69  arse->regRoot, i
cd90: 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
cda0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
cdb0: 2c 20 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47  , OPFLAG_P2ISREG
cdc0: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
cdd0: 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20  >nTab = 2;.     
cde0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
cdf0: 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
ce00: 54 5f 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 20  T_Table, 1);.   
ce10: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
ce20: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
ce30: 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
ce40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ce50: 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31  1(v, OP_Close, 1
ce60: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
ce70: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a  rse->nErr==0 ){.
ce80: 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 20          pSelTab 
ce90: 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
cea0: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
ceb0: 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  e, pSelect);.   
cec0: 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62       if( pSelTab
ced0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
cee0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
cef0: 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
cf00: 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53      p->nCol = pS
cf10: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
cf20: 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70       p->aCol = p
cf30: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  SelTab->aCol;.  
cf40: 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e        pSelTab->n
cf50: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Col = 0;.       
cf60: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d   pSelTab->aCol =
cf70: 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
cf80: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
cf90: 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20  b, pSelTab);.   
cfa0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
cfb0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
cfc0: 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
cfd0: 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65  the CREATE state
cfe0: 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20  ment */.    if( 
cff0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
d000: 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54   zStmt = createT
d010: 61 62 6c 65 53 74 6d 74 28 64 62 2c 20 70 29 3b  ableStmt(db, p);
d020: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d030: 20 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64    n = (int)(pEnd
d040: 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e  ->z - pParse->sN
d050: 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b  ameToken.z) + 1;
d060: 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73  .      zStmt = s
d070: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
d080: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 43 52  , .          "CR
d090: 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a  EATE %s %.*s", z
d0a0: 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73 65  Type2, n, pParse
d0b0: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20  ->sNameToken.z. 
d0c0: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
d0d0: 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72     /* A slot for
d0e0: 20 74 68 65 20 72 65 63 6f 72 64 20 68 61 73 20   the record has 
d0f0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
d100: 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a 20  ocated in the . 
d110: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53     ** SQLITE_MAS
d120: 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20 6a  TER table.  We j
d130: 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64 61  ust need to upda
d140: 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69 74  te that slot wit
d150: 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65  h all.    ** the
d160: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27   information we'
d170: 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 0a 20 20  ve collected..  
d180: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
d190: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
d1a0: 73 65 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54  se,.      "UPDAT
d1b0: 45 20 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20  E %Q.%s ".      
d1c0: 20 20 20 22 53 45 54 20 74 79 70 65 3d 27 25 73     "SET type='%s
d1d0: 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f  ', name=%Q, tbl_
d1e0: 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67  name=%Q, rootpag
d1f0: 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20 22 0a  e=#%d, sql=%Q ".
d200: 20 20 20 20 20 20 20 22 57 48 45 52 45 20 72 6f         "WHERE ro
d210: 77 69 64 3d 23 25 64 22 2c 0a 20 20 20 20 20 20  wid=#%d",.      
d220: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
d230: 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
d240: 28 69 44 62 29 2c 0a 20 20 20 20 20 20 7a 54 79  (iDb),.      zTy
d250: 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61  pe,.      p->zNa
d260: 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61  me,.      p->zNa
d270: 6d 65 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65  me,.      pParse
d280: 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20  ->regRoot,.     
d290: 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 70 50   zStmt,.      pP
d2a0: 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20  arse->regRowid. 
d2b0: 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
d2c0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d  3DbFree(db, zStm
d2d0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  t);.    sqlite3C
d2e0: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
d2f0: 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64  se, iDb);..#ifnd
d300: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
d310: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
d320: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
d330: 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63   if we need to c
d340: 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f  reate an sqlite_
d350: 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66  sequence table f
d360: 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e  or.    ** keepin
d370: 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69  g track of autoi
d380: 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20  ncrement keys.. 
d390: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
d3a0: 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41  >tabFlags & TF_A
d3b0: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a  utoincrement ){.
d3c0: 20 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20        Db *pDb = 
d3d0: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
d3e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
d3f0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
d400: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
d410: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  );.      if( pDb
d420: 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54  ->pSchema->pSeqT
d430: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
d440: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
d450: 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
d460: 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41        "CREATE TA
d470: 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f 73 65  BLE %Q.sqlite_se
d480: 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29  quence(name,seq)
d490: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 62  ",.          pDb
d4a0: 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20 20  ->zName.        
d4b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d4c0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
d4d0: 52 65 70 61 72 73 65 20 65 76 65 72 79 74 68 69  Reparse everythi
d4e0: 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75 72  ng to update our
d4f0: 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73   internal data s
d500: 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20  tructures */.   
d510: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
d520: 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20  arseSchemaOp(v, 
d530: 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iDb,.           
d540: 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
d550: 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65  tf(db, "tbl_name
d560: 3d 27 25 71 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65  ='%q'", p->zName
d570: 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41  ));.  }...  /* A
d580: 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  dd the table to 
d590: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
d5a0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
d5b0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
d5c0: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
d5d0: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 54 61  t.busy ){.    Ta
d5e0: 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53  ble *pOld;.    S
d5f0: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
d600: 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20   p->pSchema;.   
d610: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d620: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
d630: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
d640: 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65     pOld = sqlite
d650: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 53 63  3HashInsert(&pSc
d660: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70  hema->tblHash, p
d670: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
d680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d690: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
d6a0: 6c 65 6e 33 30 28 70 2d 3e 7a 4e 61 6d 65 29 2c  len30(p->zName),
d6b0: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  p);.    if( pOld
d6c0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
d6d0: 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a  ( p==pOld );  /*
d6e0: 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
d6f0: 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20  e failed inside 
d700: 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a  HashInsert() */.
d710: 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
d720: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
d730: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
d740: 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77      pParse->pNew
d750: 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64  Table = 0;.    d
d760: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
d770: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
d780: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
d790: 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c  E_OMIT_ALTERTABL
d7a0: 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70 53  E.    if( !p->pS
d7b0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63  elect ){.      c
d7c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
d7d0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
d7e0: 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f  )pParse->sNameTo
d7f0: 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74  ken.z;.      int
d800: 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61 73   nName;.      as
d810: 73 65 72 74 28 20 21 70 53 65 6c 65 63 74 20 26  sert( !pSelect &
d820: 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e 64 20  & pCons && pEnd 
d830: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
d840: 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  ns->z==0 ){.    
d850: 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64      pCons = pEnd
d860: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d870: 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28 28 63  nName = (int)((c
d880: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6e  onst char *)pCon
d890: 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20  s->z - zName);. 
d8a0: 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66       p->addColOf
d8b0: 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71 6c 69  fset = 13 + sqli
d8c0: 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28 7a  te3Utf8CharLen(z
d8d0: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
d8e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
d8f0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
d900: 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
d910: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
d920: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  s this routine i
d930: 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74  n order to creat
d940: 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a  e a new VIEW.*/.
d950: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
d960: 74 65 56 69 65 77 28 0a 20 20 50 61 72 73 65 20  teView(.  Parse 
d970: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
d980: 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
d990: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
d9a0: 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54  pBegin,     /* T
d9b0: 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20  he CREATE token 
d9c0: 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 65 20  that begins the 
d9d0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
d9e0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
d9f0: 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74    /* The token t
da00: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  hat holds the na
da10: 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a  me of the view *
da20: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
da30: 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f  2,     /* The to
da40: 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ken that holds t
da50: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
da60: 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  iew */.  Select 
da70: 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41  *pSelect,   /* A
da80: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
da90: 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f  t that will beco
daa0: 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20  me the new view 
dab0: 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c  */.  int isTemp,
dac0: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
dad0: 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20  for a TEMPORARY 
dae0: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  view */.  int no
daf0: 45 72 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Err          /* 
db00: 53 75 70 70 72 65 73 73 20 65 72 72 6f 72 20 6d  Suppress error m
db10: 65 73 73 61 67 65 73 20 69 66 20 56 49 45 57 20  essages if VIEW 
db20: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
db30: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
db40: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73  .  int n;.  cons
db50: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b  t char *z;.  Tok
db60: 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78  en sEnd;.  DbFix
db70: 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e  er sFix;.  Token
db80: 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69   *pName = 0;.  i
db90: 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65  nt iDb;.  sqlite
dba0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
dbb0: 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  db;..  if( pPars
dbc0: 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20  e->nVar>0 ){.   
dbd0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
dbe0: 28 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65  (pParse, "parame
dbf0: 74 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c  ters are not all
dc00: 6f 77 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b  owed in views");
dc10: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
dc20: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
dc30: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
dc40: 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
dc50: 53 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73  StartTable(pPars
dc60: 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
dc70: 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c  2, isTemp, 1, 0,
dc80: 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70   noErr);.  p = p
dc90: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
dca0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
dcb0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
dcc0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
dcd0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
dce0: 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ect);.    return
dcf0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54  ;.  }.  sqlite3T
dd00: 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
dd10: 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
dd20: 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44  2, &pName);.  iD
dd30: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
dd40: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e  aToIndex(db, p->
dd50: 70 53 63 68 65 6d 61 29 3b 0a 20 20 69 66 28 20  pSchema);.  if( 
dd60: 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
dd70: 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
dd80: 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65  b, "view", pName
dd90: 29 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  ).    && sqlite3
dda0: 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c  FixSelect(&sFix,
ddb0: 20 70 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20   pSelect).  ){. 
ddc0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
ddd0: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65  Delete(db, pSele
dde0: 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ct);.    return;
ddf0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
de00: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e  a copy of the en
de10: 74 69 72 65 20 53 45 4c 45 43 54 20 73 74 61 74  tire SELECT stat
de20: 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e  ement that defin
de30: 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a  es the view..  *
de40: 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63  * This will forc
de50: 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74  e all the Expr.t
de60: 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f  oken.z values to
de70: 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a   be dynamically.
de80: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72    ** allocated r
de90: 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74  ather than point
dea0: 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74   to the input st
deb0: 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61  ring - which mea
dec0: 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  ns that.  ** the
ded0: 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61  y will persist a
dee0: 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74  fter the current
def0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20   sqlite3_exec() 
df00: 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20  call returns..  
df10: 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20  */.  p->pSelect 
df20: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
df30: 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c 20  up(db, pSelect, 
df40: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b  EXPRDUP_REDUCE);
df50: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
df60: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65  Delete(db, pSele
df70: 63 74 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ct);.  if( db->m
df80: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
df90: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
dfa0: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
dfb0: 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  usy ){.    sqlit
dfc0: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
dfd0: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b  ames(pParse, p);
dfe0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
dff0: 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
e000: 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
e010: 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45  tement.  Make sE
e020: 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a  nd point to.  **
e030: 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20   the end..  */. 
e040: 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e   sEnd = pParse->
e050: 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66  sLastToken;.  if
e060: 28 20 41 4c 57 41 59 53 28 73 45 6e 64 2e 7a 5b  ( ALWAYS(sEnd.z[
e070: 30 5d 21 3d 30 29 20 26 26 20 73 45 6e 64 2e 7a  0]!=0) && sEnd.z
e080: 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20  [0]!=';' ){.    
e090: 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e  sEnd.z += sEnd.n
e0a0: 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d  ;.  }.  sEnd.n =
e0b0: 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28   0;.  n = (int)(
e0c0: 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d  sEnd.z - pBegin-
e0d0: 3e 7a 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69  >z);.  z = pBegi
e0e0: 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 41  n->z;.  while( A
e0f0: 4c 57 41 59 53 28 6e 3e 30 29 20 26 26 20 73 71  LWAYS(n>0) && sq
e100: 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 6e  lite3Isspace(z[n
e110: 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  -1]) ){ n--; }. 
e120: 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31   sEnd.z = &z[n-1
e130: 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b  ];.  sEnd.n = 1;
e140: 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74  ..  /* Use sqlit
e150: 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20  e3EndTable() to 
e160: 61 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20  add the view to 
e170: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
e180: 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  R table */.  sql
e190: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61  ite3EndTable(pPa
e1a0: 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30  rse, 0, &sEnd, 0
e1b0: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23  );.  return;.}.#
e1c0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
e1d0: 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69  OMIT_VIEW */..#i
e1e0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
e1f0: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
e200: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
e210: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
e220: 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62  E)./*.** The Tab
e230: 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61  le structure pTa
e240: 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ble is really a 
e250: 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74  VIEW.  Fill in t
e260: 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74  he names of.** t
e270: 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
e280: 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54  e view in the pT
e290: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20  able structure. 
e2a0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
e2b0: 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e  er.** of errors.
e2c0: 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73    If an error is
e2d0: 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65   seen leave an e
e2e0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
e2f0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
e300: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
e310: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
e320: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
e330: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
e340: 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61  .  Table *pSelTa
e350: 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74  b;   /* A fake t
e360: 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20  able from which 
e370: 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75 6c  we get the resul
e380: 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63  t set */.  Selec
e390: 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20  t *pSel;     /* 
e3a0: 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  Copy of the SELE
e3b0: 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  CT that implemen
e3c0: 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  ts the view */. 
e3d0: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20   int nErr = 0;  
e3e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
e3f0: 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72  errors encounter
e400: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  ed */.  int n;  
e410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
e420: 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74  porarily holds t
e430: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72  he number of cur
e440: 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f  sors assigned */
e450: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
e460: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a   pParse->db;  /*
e470: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
e480: 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20  tion for malloc 
e490: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
e4a0: 28 2a 78 41 75 74 68 29 28 76 6f 69 64 2a 2c 69  (*xAuth)(void*,i
e4b0: 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63  nt,const char*,c
e4c0: 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74  onst char*,const
e4d0: 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61   char*,const cha
e4e0: 72 2a 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  r*);..  assert( 
e4f0: 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64  pTable );..#ifnd
e500: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
e510: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
e520: 28 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c  ( sqlite3VtabCal
e530: 6c 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c  lConnect(pParse,
e540: 20 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20   pTable) ){.    
e550: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
e560: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49  ROR;.  }.  if( I
e570: 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29  sVirtual(pTable)
e580: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e   ) return 0;.#en
e590: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
e5a0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
e5b0: 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43  /* A positive nC
e5c0: 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c  ol means the col
e5d0: 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74  umns names for t
e5e0: 68 69 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a  his view are.  *
e5f0: 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e  * already known.
e600: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
e610: 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74  le->nCol>0 ) ret
e620: 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e  urn 0;..  /* A n
e630: 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20  egative nCol is 
e640: 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72  a special marker
e650: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65   meaning that we
e660: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20   are currently. 
e670: 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f   ** trying to co
e680: 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e  mpute the column
e690: 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65   names.  If we e
e6a0: 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  nter this routin
e6b0: 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65  e with.  ** a ne
e6c0: 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20  gative nCol, it 
e6d0: 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72  means two or mor
e6e0: 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c  e views form a l
e6f0: 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  oop, like this:.
e700: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52    **.  **     CR
e710: 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53  EATE VIEW one AS
e720: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
e730: 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  wo;.  **     CRE
e740: 41 54 45 20 56 49 45 57 20 74 77 6f 20 41 53 20  ATE VIEW two AS 
e750: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e  SELECT * FROM on
e760: 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74  e;.  **.  ** Act
e770: 75 61 6c 6c 79 2c 20 74 68 65 20 65 72 72 6f 72  ually, the error
e780: 20 61 62 6f 76 65 20 69 73 20 6e 6f 77 20 63 61   above is now ca
e790: 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65  ught prior to re
e7a0: 61 63 68 69 6e 67 20 74 68 69 73 20 70 6f 69 6e  aching this poin
e7b0: 74 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20  t..  ** But the 
e7c0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20 69  following test i
e7d0: 73 20 73 74 69 6c 6c 20 69 6d 70 6f 72 74 61 6e  s still importan
e7e0: 74 20 61 73 20 69 74 20 64 6f 65 73 20 63 6f 6d  t as it does com
e7f0: 65 20 75 70 0a 20 20 2a 2a 20 69 6e 20 74 68 65  e up.  ** in the
e800: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a   following:.  **
e810: 20 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54   .  **     CREAT
e820: 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e 65 78 31  E TABLE main.ex1
e830: 28 61 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52  (a);.  **     CR
e840: 45 41 54 45 20 54 45 4d 50 20 56 49 45 57 20 65  EATE TEMP VIEW e
e850: 78 31 20 41 53 20 53 45 4c 45 43 54 20 61 20 46  x1 AS SELECT a F
e860: 52 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a 20 20 20  ROM ex1;.  **   
e870: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
e880: 74 65 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20  temp.ex1;.  */. 
e890: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
e8a0: 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  l<0 ){.    sqlit
e8b0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
e8c0: 65 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63  e, "view %s is c
e8d0: 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65  ircularly define
e8e0: 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  d", pTable->zNam
e8f0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
e900: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
e910: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20  pTable->nCol>=0 
e920: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67  );..  /* If we g
e930: 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20  et this far, it 
e940: 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f  means we need to
e950: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62   compute the tab
e960: 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e  le names..  ** N
e970: 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c  ote that the cal
e980: 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75  l to sqlite3Resu
e990: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20  ltSetOfSelect() 
e9a0: 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a  will expand any.
e9b0: 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74    ** "*" element
e9c0: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73  s in the results
e9d0: 20 73 65 74 20 6f 66 20 74 68 65 20 76 69 65 77   set of the view
e9e0: 20 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e   and will assign
e9f0: 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f   cursors.  ** to
ea00: 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66   the elements of
ea10: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
ea20: 2e 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74  .  But we do not
ea30: 20 77 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e   want these chan
ea40: 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70  ges.  ** to be p
ea50: 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68  ermanent.  So th
ea60: 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73  e computation is
ea70: 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20   done on a copy 
ea80: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  of the SELECT.  
ea90: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  ** statement tha
eaa0: 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69  t defines the vi
eab0: 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ew..  */.  asser
eac0: 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  t( pTable->pSele
ead0: 63 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73  ct );.  pSel = s
eae0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
eaf0: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  db, pTable->pSel
eb00: 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ect, 0);.  if( p
eb10: 53 65 6c 20 29 7b 0a 20 20 20 20 75 38 20 65 6e  Sel ){.    u8 en
eb20: 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 20 3d 20  ableLookaside = 
eb30: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45  db->lookaside.bE
eb40: 6e 61 62 6c 65 64 3b 0a 20 20 20 20 6e 20 3d 20  nabled;.    n = 
eb50: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20  pParse->nTab;.  
eb60: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
eb70: 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
eb80: 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63  arse, pSel->pSrc
eb90: 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  );.    pTable->n
eba0: 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 64 62  Col = -1;.    db
ebb0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61  ->lookaside.bEna
ebc0: 62 6c 65 64 20 3d 20 30 3b 0a 23 69 66 6e 64 65  bled = 0;.#ifnde
ebd0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
ebe0: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
ebf0: 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75 74  xAuth = db->xAut
ec00: 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68  h;.    db->xAuth
ec10: 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61   = 0;.    pSelTa
ec20: 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
ec30: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
ec40: 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  rse, pSel);.    
ec50: 64 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74  db->xAuth = xAut
ec60: 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 53 65  h;.#else.    pSe
ec70: 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65  lTab = sqlite3Re
ec80: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
ec90: 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 23  pParse, pSel);.#
eca0: 65 6e 64 69 66 0a 20 20 20 20 64 62 2d 3e 6c 6f  endif.    db->lo
ecb0: 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64  okaside.bEnabled
ecc0: 20 3d 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69   = enableLookasi
ecd0: 64 65 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  de;.    pParse->
ece0: 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66  nTab = n;.    if
ecf0: 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20  ( pSelTab ){.   
ed00: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c     assert( pTabl
ed10: 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  e->aCol==0 );.  
ed20: 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
ed30: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c   = pSelTab->nCol
ed40: 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  ;.      pTable->
ed50: 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  aCol = pSelTab->
ed60: 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c  aCol;.      pSel
ed70: 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->nCol = 0;. 
ed80: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43       pSelTab->aC
ed90: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  ol = 0;.      sq
eda0: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
edb0: 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20  (db, pSelTab);. 
edc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
edd0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
ede0: 65 6c 64 28 64 62 2c 20 30 2c 20 70 54 61 62 6c  eld(db, 0, pTabl
edf0: 65 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20  e->pSchema) );. 
ee00: 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63       pTable->pSc
ee10: 68 65 6d 61 2d 3e 66 6c 61 67 73 20 7c 3d 20 44  hema->flags |= D
ee20: 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a  B_UnresetViews;.
ee30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ee40: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
ee50: 30 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b  0;.      nErr++;
ee60: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
ee70: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
ee80: 62 2c 20 70 53 65 6c 29 3b 0a 20 20 7d 20 65 6c  b, pSel);.  } el
ee90: 73 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b  se {.    nErr++;
eea0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
eeb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
eec0: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72  */.  return nErr
eed0: 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;  .}.#endif /* 
eee0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
eef0: 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
ef00: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
ef10: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
ef20: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
ef30: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
ef40: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f  .** Clear the co
ef50: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20  lumn names from 
ef60: 65 76 65 72 79 20 56 49 45 57 20 69 6e 20 64 61  every VIEW in da
ef70: 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73  tabase idx..*/.s
ef80: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
ef90: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71  eViewResetAll(sq
efa0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
efb0: 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  dx){.  HashElem 
efc0: 2a 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *i;.  assert( sq
efd0: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
efe0: 48 65 6c 64 28 64 62 2c 20 69 64 78 2c 20 30 29  Held(db, idx, 0)
eff0: 20 29 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73   );.  if( !DbHas
f000: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
f010: 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
f020: 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  s) ) return;.  f
f030: 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
f040: 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64  irst(&db->aDb[id
f050: 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  x].pSchema->tblH
f060: 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65  ash); i;i=sqlite
f070: 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20  HashNext(i)){.  
f080: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
f090: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
f0a0: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
f0b0: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
f0c0: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 43 6f    sqliteDeleteCo
f0d0: 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54  lumnNames(db, pT
f0e0: 61 62 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ab);.      pTab-
f0f0: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >aCol = 0;.     
f100: 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b   pTab->nCol = 0;
f110: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43  .    }.  }.  DbC
f120: 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c  learProperty(db,
f130: 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74   idx, DB_Unreset
f140: 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a  Views);.}.#else.
f150: 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56  # define sqliteV
f160: 69 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29  iewResetAll(A,B)
f170: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
f180: 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
f190: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
f1a0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
f1b0: 20 74 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a   the VDBE to adj
f1c0: 75 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ust the internal
f1d0: 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20   schema.** used 
f1e0: 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74  by SQLite when t
f1f0: 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d  he btree layer m
f200: 6f 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f  oves a table roo
f210: 74 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72  t page. The.** r
f220: 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61  oot-page of a ta
f230: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20  ble or index in 
f240: 64 61 74 61 62 61 73 65 20 69 44 62 20 68 61 73  database iDb has
f250: 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46   changed from iF
f260: 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a  rom.** to iTo..*
f270: 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31 37 32  *.** Ticket #172
f280: 38 3a 20 20 54 68 65 20 73 79 6d 62 6f 6c 20 74  8:  The symbol t
f290: 61 62 6c 65 20 6d 69 67 68 74 20 73 74 69 6c 6c  able might still
f2a0: 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61   contain informa
f2b0: 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65  tion.** on table
f2c0: 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73  s and/or indices
f2d0: 20 74 68 61 74 20 61 72 65 20 74 68 65 20 70 72   that are the pr
f2e0: 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 64  ocess of being d
f2f0: 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f  eleted..** If yo
f300: 75 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f  u are unlucky, o
f310: 6e 65 20 6f 66 20 74 68 6f 73 65 20 64 65 6c 65  ne of those dele
f320: 74 65 64 20 69 6e 64 69 63 65 73 20 6f 72 20 74  ted indices or t
f330: 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68  ables might.** h
f340: 61 76 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f  ave the same roo
f350: 74 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20  tpage number as 
f360: 74 68 65 20 72 65 61 6c 20 74 61 62 6c 65 20 6f  the real table o
f370: 72 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a  r index that is.
f380: 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20  ** being moved. 
f390: 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73 74   So we cannot st
f3a0: 6f 70 20 73 65 61 72 63 68 69 6e 67 20 61 66 74  op searching aft
f3b0: 65 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  er the first mat
f3c0: 63 68 20 0a 2a 2a 20 62 65 63 61 75 73 65 20 74  ch .** because t
f3d0: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 6d  he first match m
f3e0: 69 67 68 74 20 62 65 20 66 6f 72 20 6f 6e 65 20  ight be for one 
f3f0: 6f 66 20 74 68 65 20 64 65 6c 65 74 65 64 20 69  of the deleted i
f400: 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62  ndices.** or tab
f410: 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74 68 65 20  les and not the 
f420: 74 61 62 6c 65 2f 69 6e 64 65 78 20 74 68 61 74  table/index that
f430: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 62 65 69   is actually bei
f440: 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20  ng moved..** We 
f450: 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f  must continue lo
f460: 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20  oping until all 
f470: 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63  tables and indic
f480: 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70  es with.** rootp
f490: 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20  age==iFrom have 
f4a0: 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 74  been converted t
f4b0: 6f 20 68 61 76 65 20 61 20 72 6f 6f 74 70 61 67  o have a rootpag
f4c0: 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f  e of iTo.** in o
f4d0: 72 64 65 72 20 74 6f 20 62 65 20 63 65 72 74 61  rder to be certa
f4e0: 69 6e 20 74 68 61 74 20 77 65 20 67 6f 74 20 74  in that we got t
f4f0: 68 65 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f  he right one..*/
f500: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f510: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
f520: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f 74  void sqlite3Root
f530: 50 61 67 65 4d 6f 76 65 64 28 73 71 6c 69 74 65  PageMoved(sqlite
f540: 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20  3 *db, int iDb, 
f550: 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
f560: 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  To){.  HashElem 
f570: 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a  *pElem;.  Hash *
f580: 70 48 61 73 68 3b 0a 20 20 44 62 20 2a 70 44 62  pHash;.  Db *pDb
f590: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
f5a0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
f5b0: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
f5c0: 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  );.  pDb = &db->
f5d0: 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 48 61 73  aDb[iDb];.  pHas
f5e0: 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d  h = &pDb->pSchem
f5f0: 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f  a->tblHash;.  fo
f600: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
f610: 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20  shFirst(pHash); 
f620: 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
f630: 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
f640: 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  m)){.    Table *
f650: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
f660: 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
f670: 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d    if( pTab->tnum
f680: 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
f690: 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54   pTab->tnum = iT
f6a0: 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  o;.    }.  }.  p
f6b0: 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63  Hash = &pDb->pSc
f6c0: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20  hema->idxHash;. 
f6d0: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
f6e0: 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68  eHashFirst(pHash
f6f0: 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
f700: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
f710: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65  Elem)){.    Inde
f720: 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65  x *pIdx = sqlite
f730: 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
f740: 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74  .    if( pIdx->t
f750: 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  num==iFrom ){.  
f760: 20 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d      pIdx->tnum =
f770: 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   iTo;.    }.  }.
f780: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
f790: 57 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65 72  Write code to er
f7a0: 61 73 65 20 74 68 65 20 74 61 62 6c 65 20 77 69  ase the table wi
f7b0: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61  th root-page iTa
f7c0: 62 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61 73  ble from databas
f7d0: 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77  e iDb..** Also w
f7e0: 72 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64  rite code to mod
f7f0: 69 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ify the sqlite_m
f800: 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
f810: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a  internal schema.
f820: 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61 67  ** if a root-pag
f830: 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61 62  e of another tab
f840: 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74  le is moved by t
f850: 68 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20 77  he btree-layer w
f860: 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67  hilst.** erasing
f870: 20 69 54 61 62 6c 65 20 28 74 68 69 73 20 63 61   iTable (this ca
f880: 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e  n happen with an
f890: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
f8a0: 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74  abase)..*/ .stat
f8b0: 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 52  ic void destroyR
f8c0: 6f 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a 70  ootPage(Parse *p
f8d0: 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c  Parse, int iTabl
f8e0: 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56  e, int iDb){.  V
f8f0: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
f900: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
f910: 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69  .  int r1 = sqli
f920: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
f930: 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
f940: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
f950: 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65  _Destroy, iTable
f960: 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20 20 73 71  , r1, iDb);.  sq
f970: 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50  lite3MayAbort(pP
f980: 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53  arse);.#ifndef S
f990: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
f9a0: 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65  ACUUM.  /* OP_De
f9b0: 73 74 72 6f 79 20 73 74 6f 72 65 73 20 61 6e 20  stroy stores an 
f9c0: 69 6e 20 69 6e 74 65 67 65 72 20 72 31 2e 20 49  in integer r1. I
f9d0: 66 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20  f this integer. 
f9e0: 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   ** is non-zero,
f9f0: 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
fa00: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
fa10: 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65   of a table move
fa20: 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69  d to.  ** locati
fa30: 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66  on iTable. The f
fa40: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f  ollowing code mo
fa50: 64 69 66 69 65 73 20 74 68 65 20 73 71 6c 69 74  difies the sqlit
fa60: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74  e_master table t
fa70: 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74  o.  ** reflect t
fa80: 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  his..  **.  ** T
fa90: 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65  he "#NNN" in the
faa0: 20 53 51 4c 20 69 73 20 61 20 73 70 65 63 69 61   SQL is a specia
fab0: 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20  l constant that 
fac0: 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72 20 76  means whatever v
fad0: 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20  alue.  ** is in 
fae0: 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53  register NNN.  S
faf0: 65 65 20 67 72 61 6d 6d 61 72 20 72 75 6c 65 73  ee grammar rules
fb00: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
fb10: 20 74 68 65 20 54 4b 5f 52 45 47 49 53 54 45 52   the TK_REGISTER
fb20: 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20  .  ** token for 
fb30: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
fb40: 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73  mation..  */.  s
fb50: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
fb60: 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
fb70: 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45  "UPDATE %Q.%s SE
fb80: 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48  T rootpage=%d WH
fb90: 45 52 45 20 23 25 64 20 41 4e 44 20 72 6f 6f 74  ERE #%d AND root
fba0: 70 61 67 65 3d 23 25 64 22 2c 0a 20 20 20 20 20  page=#%d",.     
fbb0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
fbc0: 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
fbd0: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69  MA_TABLE(iDb), i
fbe0: 54 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a  Table, r1, r1);.
fbf0: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
fc00: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
fc10: 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f  Parse, r1);.}../
fc20: 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20  *.** Write VDBE 
fc30: 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61  code to erase ta
fc40: 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c  ble pTab and all
fc50: 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69   associated indi
fc60: 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20  ces on disk..** 
fc70: 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74  Code to update t
fc80: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
fc90: 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65   tables and inte
fca0: 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69  rnal schema defi
fcb0: 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61  nitions.** in ca
fcc0: 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62  se a root-page b
fcd0: 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74  elonging to anot
fce0: 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76  her table is mov
fcf0: 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20  ed by the btree 
fd00: 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f  layer.** is also
fd10: 20 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e   added (this can
fd20: 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20   happen with an 
fd30: 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
fd40: 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  base)..*/.static
fd50: 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62   void destroyTab
fd60: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
fd70: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a  , Table *pTab){.
fd80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
fd90: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
fda0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69  Index *pIdx;.  i
fdb0: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
fdc0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
fdd0: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
fde0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 64 65 73 74  pSchema);.  dest
fdf0: 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
fe00: 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  se, pTab->tnum, 
fe10: 69 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78  iDb);.  for(pIdx
fe20: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
fe30: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
fe40: 70 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74  pNext){.    dest
fe50: 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
fe60: 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  se, pIdx->tnum, 
fe70: 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  iDb);.  }.#else.
fe80: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
fe90: 62 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f  base may be auto
fea0: 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20  -vacuum capable 
feb0: 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  (if SQLITE_OMIT_
fec0: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20  AUTOVACUUM.  ** 
fed0: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c  is not defined),
fee0: 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f   then it is impo
fef0: 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50  rtant to call OP
ff00: 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a  _Destroy on the.
ff10: 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69    ** table and i
ff20: 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20  ndex root-pages 
ff30: 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69  in order, starti
ff40: 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65  ng with the nume
ff50: 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61  rically .  ** la
ff60: 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
ff70: 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61  number. This gua
ff80: 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e  rantees that non
ff90: 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61  e of the root-pa
ffa0: 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64  ges.  ** to be d
ffb0: 65 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f  estroyed is relo
ffc0: 63 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c  cated by an earl
ffd0: 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20  ier OP_Destroy. 
ffe0: 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a  i.e. if the.  **
fff0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20   following were 
10000 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  coded:.  **.  **
10010 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a   OP_Destroy 4 0.
10020 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50    ** ....  ** OP
10030 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a  _Destroy 5 0.  *
10040 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20  *.  ** and root 
10050 70 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20  page 5 happened 
10060 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73  to be the larges
10070 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  t root-page numb
10080 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64  er in the.  ** d
10090 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f  atabase, then ro
100a0 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20  ot page 5 would 
100b0 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65  be moved to page
100c0 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20   4 by the .  ** 
100d0 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22  "OP_Destroy 4 0"
100e0 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62   opcode. The sub
100f0 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74  sequent "OP_Dest
10100 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68  roy 5 0" would h
10110 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c  it.  ** a free-l
10120 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  ist page..  */. 
10130 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62   int iTab = pTab
10140 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44  ->tnum;.  int iD
10150 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20  estroyed = 0;.. 
10160 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
10170 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
10180 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d    int iLargest =
10190 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65   0;..    if( iDe
101a0 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54  stroyed==0 || iT
101b0 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b  ab<iDestroyed ){
101c0 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20  .      iLargest 
101d0 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20  = iTab;.    }.  
101e0 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
101f0 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
10200 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
10210 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78  {.      int iIdx
10220 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20   = pIdx->tnum;. 
10230 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
10240 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  x->pSchema==pTab
10250 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
10260 20 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79     if( (iDestroy
10270 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69  ed==0 || (iIdx<i
10280 44 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69  Destroyed)) && i
10290 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a  Idx>iLargest ){.
102a0 20 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74          iLargest
102b0 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d   = iIdx;.      }
102c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
102d0 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20  Largest==0 ){.  
102e0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
102f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
10300 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
10310 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
10320 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
10330 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 64 65  chema);.      de
10340 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
10350 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20  arse, iLargest, 
10360 69 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73  iDb);.      iDes
10370 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73  troyed = iLarges
10380 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  t;.    }.  }.#en
10390 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  dif.}../*.** Rem
103a0 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d  ove entries from
103b0 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
103c0 4e 20 74 61 62 6c 65 73 20 28 66 6f 72 20 4e 20  N tables (for N 
103d0 69 6e 20 28 31 2c 32 2c 33 29 29 0a 2a 2a 20 61  in (1,2,3)).** a
103e0 66 74 65 72 20 61 20 44 52 4f 50 20 49 4e 44 45  fter a DROP INDE
103f0 58 20 6f 72 20 44 52 4f 50 20 54 41 42 4c 45 20  X or DROP TABLE 
10400 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74  command..*/.stat
10410 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 43  ic void sqlite3C
10420 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 0a  learStatTables(.
10430 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
10440 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10450 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
10460 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20  */.  int iDb,   
10470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10480 68 65 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62  he database numb
10490 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  er */.  const ch
104a0 61 72 20 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f  ar *zType,     /
104b0 2a 20 22 69 64 78 22 20 6f 72 20 22 74 62 6c 22  * "idx" or "tbl"
104c0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
104d0 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20   *zName      /* 
104e0 4e 61 6d 65 20 6f 66 20 69 6e 64 65 78 20 6f 72  Name of index or
104f0 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69   table */.){.  i
10500 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt i;.  const ch
10510 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 70 50  ar *zDbName = pP
10520 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
10530 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 66 6f 72 28  b].zName;.  for(
10540 69 3d 31 3b 20 69 3c 3d 33 3b 20 69 2b 2b 29 7b  i=1; i<=3; i++){
10550 0a 20 20 20 20 63 68 61 72 20 7a 54 61 62 5b 32  .    char zTab[2
10560 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  4];.    sqlite3_
10570 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
10580 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73 71 6c 69  zTab),zTab,"sqli
10590 74 65 5f 73 74 61 74 25 64 22 2c 69 29 3b 0a 20  te_stat%d",i);. 
105a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
105b0 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
105c0 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62 4e 61 6d  db, zTab, zDbNam
105d0 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  e) ){.      sqli
105e0 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
105f0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
10600 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
10610 73 20 57 48 45 52 45 20 25 73 3d 25 51 22 2c 0a  s WHERE %s=%Q",.
10620 20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c          zDbName,
10630 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c 20 7a 4e   zTab, zType, zN
10640 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ame.      );.   
10650 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
10660 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
10670 20 64 72 6f 70 20 61 20 74 61 62 6c 65 2e 0a 2a   drop a table..*
10680 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
10690 64 65 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73  deDropTable(Pars
106a0 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
106b0 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 44 62 2c   *pTab, int iDb,
106c0 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20   int isView){.  
106d0 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
106e0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
106f0 3e 64 62 3b 0a 20 20 54 72 69 67 67 65 72 20 2a  >db;.  Trigger *
10700 70 54 72 69 67 67 65 72 3b 0a 20 20 44 62 20 2a  pTrigger;.  Db *
10710 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
10720 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  Db];..  v = sqli
10730 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
10740 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  e);.  assert( v!
10750 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  =0 );.  sqlite3B
10760 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
10770 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
10780 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  b);..#ifndef SQL
10790 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
107a0 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69  TABLE.  if( IsVi
107b0 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
107c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
107d0 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69  dOp0(v, OP_VBegi
107e0 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  n);.  }.#endif..
107f0 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72    /* Drop all tr
10800 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65  iggers associate
10810 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
10820 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20   being dropped. 
10830 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67 65 6e  Code.  ** is gen
10840 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65  erated to remove
10850 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71   entries from sq
10860 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f  lite_master and/
10870 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74  or.  ** sqlite_t
10880 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65  emp_master if re
10890 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  quired..  */.  p
108a0 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65  Trigger = sqlite
108b0 33 54 72 69 67 67 65 72 4c 69 73 74 28 70 50 61  3TriggerList(pPa
108c0 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 77 68  rse, pTab);.  wh
108d0 69 6c 65 28 20 70 54 72 69 67 67 65 72 20 29 7b  ile( pTrigger ){
108e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72  .    assert( pTr
108f0 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d  igger->pSchema==
10900 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c  pTab->pSchema ||
10910 20 0a 20 20 20 20 20 20 20 20 70 54 72 69 67 67   .        pTrigg
10920 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d  er->pSchema==db-
10930 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
10940 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 72  );.    sqlite3Dr
10950 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61  opTriggerPtr(pPa
10960 72 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a  rse, pTrigger);.
10970 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
10980 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a  Trigger->pNext;.
10990 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
109a0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
109b0 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f  REMENT.  /* Remo
109c0 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f  ve any entries o
109d0 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71  f the sqlite_seq
109e0 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f  uence table asso
109f0 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 2a 2a  ciated with.  **
10a00 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
10a10 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69   dropped. This i
10a20 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68  s done before th
10a30 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70  e table is dropp
10a40 65 64 0a 20 20 2a 2a 20 61 74 20 74 68 65 20 62  ed.  ** at the b
10a50 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63  tree level, in c
10a60 61 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73  ase the sqlite_s
10a70 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e 65  equence table ne
10a80 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65  eds to.  ** move
10a90 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
10aa0 74 68 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61  the drop (can ha
10ab0 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63  ppen in auto-vac
10ac0 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a  uum mode)..  */.
10ad0 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46    if( pTab->tabF
10ae0 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
10af0 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73  crement ){.    s
10b00 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
10b10 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
10b20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
10b30 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
10b40 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a  WHERE name=%Q",.
10b50 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65        pDb->zName
10b60 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20  , pTab->zName.  
10b70 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a    );.  }.#endif.
10b80 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53  .  /* Drop all S
10b90 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
10ba0 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74  le and index ent
10bb0 72 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20  ries that refer 
10bc0 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c  to 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 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68   ** every row th
10c20 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  at refers to a t
10c30 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65  able of the same
10c40 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65   name as the one
10c50 20 62 65 69 6e 67 0a 20 20 2a 2a 20 64 72 6f 70   being.  ** drop
10c60 70 65 64 2e 20 54 72 69 67 67 65 72 73 20 61 72  ped. Triggers ar
10c70 65 20 68 61 6e 64 6c 65 64 20 73 65 70 65 72 61  e handled sepera
10c80 74 65 6c 79 20 62 65 63 61 75 73 65 20 61 20 74  tely because a t
10c90 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20  rigger can be.  
10ca0 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  ** created in th
10cb0 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
10cc0 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61  that refers to a
10cd0 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65   table in anothe
10ce0 72 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  r.  ** database.
10cf0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e  .  */.  sqlite3N
10d00 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
10d10 65 2c 20 0a 20 20 20 20 20 20 22 44 45 4c 45 54  e, .      "DELET
10d20 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45  E FROM %Q.%s WHE
10d30 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61  RE tbl_name=%Q a
10d40 6e 64 20 74 79 70 65 21 3d 27 74 72 69 67 67 65  nd type!='trigge
10d50 72 27 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e  r'",.      pDb->
10d60 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
10d70 42 4c 45 28 69 44 62 29 2c 20 70 54 61 62 2d 3e  BLE(iDb), pTab->
10d80 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 69  zName);.  if( !i
10d90 73 56 69 65 77 20 26 26 20 21 49 73 56 69 72 74  sView && !IsVirt
10da0 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
10db0 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50   destroyTable(pP
10dc0 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d  arse, pTab);.  }
10dd0 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68  ..  /* Remove th
10de0 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72  e table entry fr
10df0 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65  om SQLite's inte
10e00 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20  rnal schema and 
10e10 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20  modify.  ** the 
10e20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20  schema cookie.. 
10e30 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74   */.  if( IsVirt
10e40 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
10e50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10e60 70 34 28 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f  p4(v, OP_VDestro
10e70 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54  y, iDb, 0, 0, pT
10e80 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
10e90 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
10ea0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f  AddOp4(v, OP_Dro
10eb0 70 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20  pTable, iDb, 0, 
10ec0 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  0, pTab->zName, 
10ed0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 68 61  0);.  sqlite3Cha
10ee0 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
10ef0 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , iDb);.  sqlite
10f00 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c  ViewResetAll(db,
10f10 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iDb);.}../*.** 
10f20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
10f30 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65  called to do the
10f40 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20   work of a DROP 
10f50 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
10f60 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65  .** pName is the
10f70 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
10f80 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64  le to be dropped
10f90 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
10fa0 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65  3DropTable(Parse
10fb0 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
10fc0 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73  t *pName, int is
10fd0 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29  View, int noErr)
10fe0 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
10ff0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
11000 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
11010 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
11020 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  b;..  if( db->ma
11030 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
11040 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
11050 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73  _table;.  }.  as
11060 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
11070 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  rr==0 );.  asser
11080 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
11090 31 20 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72  1 );.  if( noErr
110a0 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45   ) db->suppressE
110b0 72 72 2b 2b 3b 0a 20 20 70 54 61 62 20 3d 20 73  rr++;.  pTab = s
110c0 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
110d0 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 69 73  eItem(pParse, is
110e0 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d 3e 61 5b  View, &pName->a[
110f0 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72  0]);.  if( noErr
11100 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45   ) db->suppressE
11110 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61  rr--;..  if( pTa
11120 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  b==0 ){.    if( 
11130 6e 6f 45 72 72 20 29 20 73 71 6c 69 74 65 33 43  noErr ) sqlite3C
11140 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63  odeVerifyNamedSc
11150 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61  hema(pParse, pNa
11160 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
11170 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  se);.    goto ex
11180 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
11190 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
111a0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
111b0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
111c0 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  a);.  assert( iD
111d0 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
111e0 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nDb );..  /* If 
111f0 70 54 61 62 20 69 73 20 61 20 76 69 72 74 75 61  pTab is a virtua
11200 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69  l table, call Vi
11210 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
11220 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a  () to ensure.  *
11230 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69  * it is initiali
11240 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  zed..  */.  if( 
11250 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
11260 26 26 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  && sqlite3ViewGe
11270 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
11280 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20  rse, pTab) ){.  
11290 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
112a0 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e  _table;.  }.#ifn
112b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
112c0 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
112d0 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a  {.    int code;.
112e0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
112f0 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41  zTab = SCHEMA_TA
11300 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 63 6f  BLE(iDb);.    co
11310 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
11320 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
11330 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me;.    const ch
11340 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20  ar *zArg2 = 0;. 
11350 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
11360 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
11370 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
11380 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20  Tab, 0, zDb)){. 
11390 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
113a0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
113b0 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
113c0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  ){.      if( !OM
113d0 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
113e0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
113f0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
11400 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20  P_TEMP_VIEW;.   
11410 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11420 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
11430 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  DROP_VIEW;.     
11440 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
11450 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
11460 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  BLE.    }else if
11470 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
11480 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 20  ) ){.      code 
11490 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54  = SQLITE_DROP_VT
114a0 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72 67  ABLE;.      zArg
114b0 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54  2 = sqlite3GetVT
114c0 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 2d 3e  able(db, pTab)->
114d0 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e  pMod->zName;.#en
114e0 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
114f0 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
11500 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
11510 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
11520 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
11530 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  MP_TABLE;.      
11540 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
11550 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
11560 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
11570 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
11580 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
11590 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54  pParse, code, pT
115a0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32  ab->zName, zArg2
115b0 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
115c0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
115d0 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  able;.    }.    
115e0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
115f0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
11600 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62  ITE_DELETE, pTab
11610 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  ->zName, 0, zDb)
11620 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
11630 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
11640 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
11650 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
11660 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
11670 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
11680 29 3d 3d 30 20 0a 20 20 20 20 26 26 20 73 71 6c  )==0 .    && sql
11690 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61  ite3StrNICmp(pTa
116a0 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  b->zName, "sqlit
116b0 65 5f 73 74 61 74 22 2c 20 31 31 29 21 3d 30 20  e_stat", 11)!=0 
116c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
116d0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
116e0 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
116f0 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54   be dropped", pT
11700 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
11710 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
11720 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  able;.  }..#ifnd
11730 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
11740 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  IEW.  /* Ensure 
11750 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20 6e 6f  DROP TABLE is no
11760 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69 65 77  t used on a view
11770 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45 57 20  , and DROP VIEW 
11780 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a  is not used.  **
11790 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a   on a table..  *
117a0 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 26  /.  if( isView &
117b0 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  & pTab->pSelect=
117c0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
117d0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
117e0 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c  , "use DROP TABL
117f0 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c  E to delete tabl
11800 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  e %s", pTab->zNa
11810 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
11820 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
11830 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65 77   }.  if( !isView
11840 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
11850 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
11860 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11870 20 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20   "use DROP VIEW 
11880 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 25  to delete view %
11890 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s", pTab->zName)
118a0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
118b0 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
118c0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
118d0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
118e0 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66  move the table f
118f0 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
11900 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73  able.  ** on dis
11910 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  k..  */.  v = sq
11920 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
11930 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
11940 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
11950 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
11960 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
11970 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61  .    sqlite3Clea
11980 72 53 74 61 74 54 61 62 6c 65 73 28 70 50 61 72  rStatTables(pPar
11990 73 65 2c 20 69 44 62 2c 20 22 74 62 6c 22 2c 20  se, iDb, "tbl", 
119a0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
119b0 20 20 73 71 6c 69 74 65 33 46 6b 44 72 6f 70 54    sqlite3FkDropT
119c0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61  able(pParse, pNa
119d0 6d 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 73  me, pTab);.    s
119e0 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61  qlite3CodeDropTa
119f0 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
11a00 2c 20 69 44 62 2c 20 69 73 56 69 65 77 29 3b 0a  , iDb, isView);.
11a10 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74    }..exit_drop_t
11a20 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53  able:.  sqlite3S
11a30 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
11a40 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pName);.}../*.*
11a50 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
11a60 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
11a70 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e  te a new foreign
11a80 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c   key on the tabl
11a90 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75  e.** currently u
11aa0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
11ab0 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74  n.  pFromCol det
11ac0 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f  ermines which co
11ad0 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
11ae0 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f  current table po
11af0 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69  int to the forei
11b00 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f  gn key.  If pFro
11b10 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  mCol==0 then.** 
11b20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20  connect the key 
11b30 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  to the last colu
11b40 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54  mn inserted.  pT
11b50 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  o is the name of
11b60 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65  .** the table re
11b70 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43  ferred to.  pToC
11b80 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ol is a list of 
11b90 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74  tables in the ot
11ba0 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65  her.** pTo table
11bb0 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67   that the foreig
11bc0 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e  n key points to.
11bd0 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73    flags contains
11be0 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74   all.** informat
11bf0 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ion about the co
11c00 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
11c10 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  n algorithms spe
11c20 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cified.** in the
11c30 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55   ON DELETE, ON U
11c40 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53  PDATE and ON INS
11c50 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ERT clauses..**.
11c60 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63  ** An FKey struc
11c70 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
11c80 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
11c90 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
11ca0 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
11cb0 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50  uction in the pP
11cc0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
11cd0 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  field..**.** The
11ce0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
11cf0 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54  set for IMMEDIAT
11d00 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41  E processing.  A
11d10 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
11d20 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65  .** to sqlite3De
11d30 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20  ferForeignKey() 
11d40 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69  might change thi
11d50 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a  s to DEFERRED..*
11d60 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
11d70 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a  eateForeignKey(.
11d80 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
11d90 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
11da0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
11db0 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f  xprList *pFromCo
11dc0 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69  l,  /* Columns i
11dd0 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61  n this table tha
11de0 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72  t point to other
11df0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65   table */.  Toke
11e00 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20  n *pTo,         
11e10 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
11e20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
11e30 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f   ExprList *pToCo
11e40 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  l,    /* Columns
11e50 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61   in the other ta
11e60 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ble */.  int fla
11e70 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
11e80 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
11e90 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e  tion algorithms.
11ea0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
11eb0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
11ec0 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
11ed0 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
11ee0 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  EY.  FKey *pFKey
11ef0 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e   = 0;.  FKey *pN
11f00 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a  extTo;.  Table *
11f10 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
11f20 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79  Table;.  int nBy
11f30 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  te;.  int i;.  i
11f40 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20  nt nCol;.  char 
11f50 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *z;..  assert( p
11f60 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  To!=0 );.  if( p
11f70 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52  ==0 || IN_DECLAR
11f80 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b  E_VTAB ) goto fk
11f90 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f  _end;.  if( pFro
11fa0 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  mCol==0 ){.    i
11fb0 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f  nt iCol = p->nCo
11fc0 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  l-1;.    if( NEV
11fd0 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74  ER(iCol<0) ) got
11fe0 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66  o fk_end;.    if
11ff0 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
12000 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  ol->nExpr!=1 ){.
12010 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
12020 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66  orMsg(pParse, "f
12030 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73  oreign key on %s
12040 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f  ".         " sho
12050 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  uld reference on
12060 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66  ly one column of
12070 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20   table %T",.    
12080 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f       p->aCol[iCo
12090 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a  l].zName, pTo);.
120a0 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
120b0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f  d;.    }.    nCo
120c0 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  l = 1;.  }else i
120d0 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
120e0 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f  Col->nExpr!=pFro
120f0 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  mCol->nExpr ){. 
12100 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
12110 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
12120 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f     "number of co
12130 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e  lumns in foreign
12140 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61   key does not ma
12150 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
12160 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c  f ".        "col
12170 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65  umns in the refe
12180 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a  renced table");.
12190 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
121a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
121b0 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  ol = pFromCol->n
121c0 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  Expr;.  }.  nByt
121d0 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65  e = sizeof(*pFKe
121e0 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69  y) + (nCol-1)*si
121f0 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c  zeof(pFKey->aCol
12200 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20  [0]) + pTo->n + 
12210 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  1;.  if( pToCol 
12220 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
12230 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b  i<pToCol->nExpr;
12240 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79   i++){.      nBy
12250 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  te += sqlite3Str
12260 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b  len30(pToCol->a[
12270 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
12280 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
12290 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
122a0 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
122b0 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d   );.  if( pFKey=
122c0 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  =0 ){.    goto f
122d0 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b  k_end;.  }.  pFK
122e0 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20  ey->pFrom = p;. 
122f0 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
12300 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20  m = p->pFKey;.  
12310 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65  z = (char*)&pFKe
12320 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20  y->aCol[nCol];. 
12330 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b   pFKey->zTo = z;
12340 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f  .  memcpy(z, pTo
12350 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20  ->z, pTo->n);.  
12360 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  z[pTo->n] = 0;. 
12370 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
12380 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e  z);.  z += pTo->
12390 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43  n+1;.  pFKey->nC
123a0 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28  ol = nCol;.  if(
123b0 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
123c0 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
123d0 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43  0].iFrom = p->nC
123e0 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ol-1;.  }else{. 
123f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
12400 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
12410 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
12420 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b  (j=0; j<p->nCol;
12430 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
12440 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
12450 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  p(p->aCol[j].zNa
12460 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b  me, pFromCol->a[
12470 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
12480 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
12490 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d  >aCol[i].iFrom =
124a0 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   j;.          br
124b0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
124c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
124d0 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20   j>=p->nCol ){. 
124e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
124f0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
12500 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f            "unkno
12510 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22  wn column \"%s\"
12520 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
12530 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20  definition", .  
12540 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c          pFromCol
12550 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
12560 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65         goto fk_e
12570 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
12580 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43  }.  }.  if( pToC
12590 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
125a0 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
125b0 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
125c0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
125d0 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
125e0 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  e);.      pFKey-
125f0 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20  >aCol[i].zCol = 
12600 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  z;.      memcpy(
12610 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  z, pToCol->a[i].
12620 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
12630 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[n] = 0;.     
12640 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d   z += n+1;.    }
12650 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73  .  }.  pFKey->is
12660 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20  Deferred = 0;.  
12670 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30  pFKey->aAction[0
12680 5d 20 3d 20 28 75 38 29 28 66 6c 61 67 73 20 26  ] = (u8)(flags &
12690 20 30 78 66 66 29 3b 20 20 20 20 20 20 20 20 20   0xff);         
126a0 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20     /* ON DELETE 
126b0 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65  action */.  pFKe
126c0 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20  y->aAction[1] = 
126d0 28 75 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 38  (u8)((flags >> 8
126e0 20 29 20 26 20 30 78 66 66 29 3b 20 20 20 20 2f   ) & 0xff);    /
126f0 2a 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69  * ON UPDATE acti
12700 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  on */..  assert(
12710 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
12720 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
12730 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
12740 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b 65 79 20  pNextTo = (FKey 
12750 2a 29 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  *)sqlite3HashIns
12760 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d  ert(&p->pSchema-
12770 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20 20 20 20  >fkeyHash, .    
12780 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 71    pFKey->zTo, sq
12790 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 46  lite3Strlen30(pF
127a0 4b 65 79 2d 3e 7a 54 6f 29 2c 20 28 76 6f 69 64  Key->zTo), (void
127b0 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b 0a 20 20   *)pFKey.  );.  
127c0 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d 70 46 4b  if( pNextTo==pFK
127d0 65 79 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  ey ){.    db->ma
127e0 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
127f0 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
12800 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65 78 74  .  }.  if( pNext
12810 54 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  To ){.    assert
12820 28 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76  ( pNextTo->pPrev
12830 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 4b  To==0 );.    pFK
12840 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 4e  ey->pNextTo = pN
12850 65 78 74 54 6f 3b 0a 20 20 20 20 70 4e 65 78 74  extTo;.    pNext
12860 54 6f 2d 3e 70 50 72 65 76 54 6f 20 3d 20 70 46  To->pPrevTo = pF
12870 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  Key;.  }..  /* L
12880 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20  ink the foreign 
12890 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65  key to the table
128a0 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74 65   as the last ste
128b0 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b  p..  */.  p->pFK
128c0 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46  ey = pFKey;.  pF
128d0 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64  Key = 0;..fk_end
128e0 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  :.  sqlite3DbFre
128f0 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65  e(db, pFKey);.#e
12900 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
12910 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52  (SQLITE_OMIT_FOR
12920 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73  EIGN_KEY) */.  s
12930 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
12940 6c 65 74 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f  lete(db, pFromCo
12950 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  l);.  sqlite3Exp
12960 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
12970 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pToCol);.}../*.*
12980 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
12990 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  s called when an
129a0 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
129b0 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c  IATE or INITIALL
129c0 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c  Y DEFERRED.** cl
129d0 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20  ause is seen as 
129e0 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67  part of a foreig
129f0 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
12a00 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65  .  The isDeferre
12a10 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
12a20 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  s 1 for INITIALL
12a30 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30  Y DEFERRED and 0
12a40 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49   for INITIALLY I
12a50 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65  MMEDIATE..** The
12a60 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
12a70 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
12a80 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b  reated foreign k
12a90 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a  ey is adjusted.*
12aa0 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  * accordingly..*
12ab0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
12ac0 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61  ferForeignKey(Pa
12ad0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
12ae0 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69   isDeferred){.#i
12af0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12b00 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
12b10 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46  Table *pTab;.  F
12b20 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66  Key *pFKey;.  if
12b30 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65  ( (pTab = pParse
12b40 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
12b50 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62  || (pFKey = pTab
12b60 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65  ->pFKey)==0 ) re
12b70 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
12b80 69 73 44 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c  isDeferred==0 ||
12b90 20 69 73 44 65 66 65 72 72 65 64 3d 3d 31 20 29   isDeferred==1 )
12ba0 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 33 32 33  ; /* EV: R-30323
12bb0 2d 32 31 39 31 37 20 2a 2f 0a 20 20 70 46 4b 65  -21917 */.  pFKe
12bc0 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20  y->isDeferred = 
12bd0 28 75 38 29 69 73 44 65 66 65 72 72 65 64 3b 0a  (u8)isDeferred;.
12be0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
12bf0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
12c00 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e  at will erase an
12c10 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a  d refill index *
12c20 70 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a  pIdx.  This is.*
12c30 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61  * used to initia
12c40 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65  lize a newly cre
12c50 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f  ated index or to
12c60 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a   recompute the.*
12c70 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20  * content of an 
12c80 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73  index in respons
12c90 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63  e to a REINDEX c
12ca0 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66  ommand..**.** if
12cb0 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20   memRootPage is 
12cc0 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74  not negative, it
12cd0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
12ce0 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a  index is newly.*
12cf0 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20  * created.  The 
12d00 72 65 67 69 73 74 65 72 20 73 70 65 63 69 66 69  register specifi
12d10 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67  ed by memRootPag
12d20 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a  e contains the.*
12d30 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  * root page numb
12d40 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  er of the index.
12d50 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65    If memRootPage
12d60 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
12d70 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  en.** the index 
12d80 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
12d90 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72  nd must be clear
12da0 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20  ed before being 
12db0 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20  refilled and.** 
12dc0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
12dd0 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
12de0 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  x is taken from 
12df0 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f  pIndex->tnum..*/
12e00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
12e10 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
12e20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
12e30 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e  ndex *pIndex, in
12e40 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a  t memRootPage){.
12e50 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
12e60 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20  pIndex->pTable; 
12e70 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68   /* The table th
12e80 61 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f  at is indexed */
12e90 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50  .  int iTab = pP
12ea0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
12eb0 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f    /* Btree curso
12ec0 72 20 75 73 65 64 20 66 6f 72 20 70 54 61 62 20  r used for pTab 
12ed0 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  */.  int iIdx = 
12ee0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
12ef0 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
12f00 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e  sor used for pIn
12f10 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f  dex */.  int iSo
12f20 72 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  rter;           
12f30 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
12f40 72 20 6f 70 65 6e 65 64 20 62 79 20 4f 70 65 6e  r opened by Open
12f50 53 6f 72 74 65 72 20 28 69 66 20 69 6e 20 75 73  Sorter (if in us
12f60 65 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  e) */.  int addr
12f70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
12f80 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
12f90 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70  s of top of loop
12fa0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 32 3b   */.  int addr2;
12fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fc0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
12fd0 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20 6e  to jump to for n
12fe0 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f  ext iteration */
12ff0 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20  .  int tnum;    
13000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13010 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
13020 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62  f index */.  Vdb
13030 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
13040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
13050 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
13060 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  o this virtual m
13070 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49  achine */.  KeyI
13080 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20  nfo *pKey;      
13090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
130a0 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20  yInfo for index 
130b0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
130c0 5f 4f 4d 49 54 5f 4d 45 52 47 45 5f 53 4f 52 54  _OMIT_MERGE_SORT
130d0 0a 20 20 69 6e 74 20 72 65 67 49 64 78 4b 65 79  .  int regIdxKey
130e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
130f0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 63    /* Registers c
13100 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e  ontaining the in
13110 64 65 78 20 6b 65 79 20 2a 2f 0a 23 65 6e 64 69  dex key */.#endi
13120 66 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  f.  int regRecor
13130 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
13140 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
13150 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c 69 65  olding assemblie
13160 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  d index record *
13170 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
13180 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
13190 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
131a0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
131b0 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  .  int iDb = sql
131c0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
131d0 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53  x(db, pIndex->pS
131e0 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66  chema);..#ifndef
131f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
13200 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  HORIZATION.  if(
13210 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
13220 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
13230 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78  _REINDEX, pIndex
13240 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20  ->zName, 0,.    
13250 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
13260 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65  Name ) ){.    re
13270 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
13280 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72 65 20 61  ..  /* Require a
13290 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
132a0 68 65 20 74 61 62 6c 65 20 74 6f 20 70 65 72 66  he table to perf
132b0 6f 72 6d 20 74 68 69 73 20 6f 70 65 72 61 74 69  orm this operati
132c0 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54  on */.  sqlite3T
132d0 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
132e0 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
132f0 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 1, pTab->zName
13300 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  );..  v = sqlite
13310 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
13320 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
13330 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d  eturn;.  if( mem
13340 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20  RootPage>=0 ){. 
13350 20 20 20 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f     tnum = memRoo
13360 74 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tPage;.  }else{.
13370 20 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65      tnum = pInde
13380 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 73 71 6c  x->tnum;.    sql
13390 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
133a0 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d  , OP_Clear, tnum
133b0 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 4b  , iDb);.  }.  pK
133c0 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  ey = sqlite3Inde
133d0 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
133e0 20 70 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69   pIndex);.  sqli
133f0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
13400 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69   OP_OpenWrite, i
13410 49 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20  Idx, tnum, iDb, 
13420 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13430 20 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65       (char *)pKe
13440 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  y, P4_KEYINFO_HA
13450 4e 44 4f 46 46 29 3b 0a 20 20 73 71 6c 69 74 65  NDOFF);.  sqlite
13460 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
13470 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52 7c   OPFLAG_BULKCSR|
13480 28 28 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30  ((memRootPage>=0
13490 29 3f 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47  )?OPFLAG_P2ISREG
134a0 3a 30 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  :0));..#ifndef S
134b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 52 47 45  QLITE_OMIT_MERGE
134c0 5f 53 4f 52 54 0a 20 20 2f 2a 20 4f 70 65 6e 20  _SORT.  /* Open 
134d0 74 68 65 20 73 6f 72 74 65 72 20 63 75 72 73 6f  the sorter curso
134e0 72 20 69 66 20 77 65 20 61 72 65 20 74 6f 20 75  r if we are to u
134f0 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 53 6f  se one. */.  iSo
13500 72 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rter = pParse->n
13510 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  Tab++;.  sqlite3
13520 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
13530 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 69 53 6f  _SorterOpen, iSo
13540 72 74 65 72 2c 20 30 2c 20 30 2c 20 28 63 68 61  rter, 0, 0, (cha
13550 72 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49  r*)pKey, P4_KEYI
13560 4e 46 4f 29 3b 0a 23 65 6c 73 65 0a 20 20 69 53  NFO);.#else.  iS
13570 6f 72 74 65 72 20 3d 20 69 54 61 62 3b 0a 23 65  orter = iTab;.#e
13580 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  ndif..  /* Open 
13590 74 68 65 20 74 61 62 6c 65 2e 20 4c 6f 6f 70 20  the table. Loop 
135a0 74 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f 77 73  through all rows
135b0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2c 20 69   of the table, i
135c0 6e 73 65 72 74 69 6e 67 20 69 6e 64 65 78 0a 20  nserting index. 
135d0 20 2a 2a 20 72 65 63 6f 72 64 73 20 69 6e 74 6f   ** records into
135e0 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f 0a   the sorter. */.
135f0 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
13600 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c  le(pParse, iTab,
13610 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
13620 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64 64 72  penRead);.  addr
13630 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
13640 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
13650 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20  nd, iTab, 0);.  
13660 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69  regRecord = sqli
13670 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
13680 61 72 73 65 29 3b 0a 0a 23 69 66 6e 64 65 66 20  arse);..#ifndef 
13690 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 52 47  SQLITE_OMIT_MERG
136a0 45 5f 53 4f 52 54 0a 20 20 73 71 6c 69 74 65 33  E_SORT.  sqlite3
136b0 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
136c0 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
136d0 20 69 54 61 62 2c 20 72 65 67 52 65 63 6f 72 64   iTab, regRecord
136e0 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 1);.  sqlite3V
136f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13700 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 69 53  SorterInsert, iS
13710 6f 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64  orter, regRecord
13720 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
13730 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
13740 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31  t, iTab, addr1+1
13750 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
13760 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
13770 31 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71  1);.  addr1 = sq
13780 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13790 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74  v, OP_SorterSort
137a0 2c 20 69 53 6f 72 74 65 72 2c 20 30 29 3b 0a 20  , iSorter, 0);. 
137b0 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45   if( pIndex->onE
137c0 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b  rror!=OE_None ){
137d0 0a 20 20 20 20 69 6e 74 20 6a 32 20 3d 20 73 71  .    int j2 = sq
137e0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
137f0 41 64 64 72 28 76 29 20 2b 20 33 3b 0a 20 20 20  Addr(v) + 3;.   
13800 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13810 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
13820 2c 20 6a 32 29 3b 0a 20 20 20 20 61 64 64 72 32  , j2);.    addr2
13830 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
13840 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
13850 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13860 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op3(v, OP_Sorter
13870 43 6f 6d 70 61 72 65 2c 20 69 53 6f 72 74 65 72  Compare, iSorter
13880 2c 20 6a 32 2c 20 72 65 67 52 65 63 6f 72 64 29  , j2, regRecord)
13890 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c  ;.    sqlite3Hal
138a0 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 20  tConstraint(.   
138b0 20 20 20 20 20 70 50 61 72 73 65 2c 20 4f 45 5f       pParse, OE_
138c0 41 62 6f 72 74 2c 20 22 69 6e 64 65 78 65 64 20  Abort, "indexed 
138d0 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20  columns are not 
138e0 75 6e 69 71 75 65 22 2c 20 50 34 5f 53 54 41 54  unique", P4_STAT
138f0 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73  IC.    );.  }els
13900 65 7b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73  e{.    addr2 = s
13910 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
13920 74 41 64 64 72 28 76 29 3b 0a 20 20 7d 0a 20 20  tAddr(v);.  }.  
13930 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13940 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61  2(v, OP_SorterDa
13950 74 61 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67  ta, iSorter, reg
13960 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
13970 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
13980 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49  OP_IdxInsert, iI
13990 64 78 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 31  dx, regRecord, 1
139a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
139b0 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
139c0 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
139d0 29 3b 0a 23 65 6c 73 65 0a 20 20 72 65 67 49 64  );.#else.  regId
139e0 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 47 65  xKey = sqlite3Ge
139f0 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70  nerateIndexKey(p
13a00 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69  Parse, pIndex, i
13a10 54 61 62 2c 20 72 65 67 52 65 63 6f 72 64 2c 20  Tab, regRecord, 
13a20 31 29 3b 0a 20 20 61 64 64 72 32 20 3d 20 61 64  1);.  addr2 = ad
13a30 64 72 31 20 2b 20 31 3b 0a 20 20 69 66 28 20 70  dr1 + 1;.  if( p
13a40 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
13a50 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 63  OE_None ){.    c
13a60 6f 6e 73 74 20 69 6e 74 20 72 65 67 52 6f 77 69  onst int regRowi
13a70 64 20 3d 20 72 65 67 49 64 78 4b 65 79 20 2b 20  d = regIdxKey + 
13a80 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  pIndex->nColumn;
13a90 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6a  .    const int j
13aa0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
13ab0 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
13ac0 32 3b 0a 20 20 20 20 76 6f 69 64 20 2a 20 63 6f  2;.    void * co
13ad0 6e 73 74 20 70 52 65 67 4b 65 79 20 3d 20 53 51  nst pRegKey = SQ
13ae0 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
13af0 72 65 67 49 64 78 4b 65 79 29 3b 0a 0a 20 20 20  regIdxKey);..   
13b00 20 2f 2a 20 54 68 65 20 72 65 67 69 73 74 65 72   /* The register
13b10 73 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68  s accessed by th
13b20 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 20 6f 70  e OP_IsUnique op
13b30 63 6f 64 65 20 77 65 72 65 20 61 6c 6c 6f 63 61  code were alloca
13b40 74 65 64 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67  ted.    ** using
13b50 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
13b60 61 6e 67 65 28 29 20 69 6e 73 69 64 65 20 6f 66  ange() inside of
13b70 20 74 68 65 20 73 71 6c 69 74 65 33 47 65 6e 65   the sqlite3Gene
13b80 72 61 74 65 49 6e 64 65 78 4b 65 79 28 29 0a 20  rateIndexKey(). 
13b90 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65     ** call above
13ba0 2e 20 4a 75 73 74 20 62 65 66 6f 72 65 20 74 68  . Just before th
13bb0 61 74 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  at function was 
13bc0 66 72 65 65 64 20 74 68 65 79 20 77 65 72 65 20  freed they were 
13bd0 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20  released.    ** 
13be0 28 6d 61 64 65 20 61 76 61 69 6c 61 62 6c 65 20  (made available 
13bf0 74 6f 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  to the compiler 
13c00 66 6f 72 20 72 65 75 73 65 29 20 75 73 69 6e 67  for reuse) using
13c10 20 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33   .    ** sqlite3
13c20 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
13c30 28 29 2e 20 53 6f 20 69 6e 20 73 6f 6d 65 20 77  (). So in some w
13c40 61 79 73 20 68 61 76 69 6e 67 20 74 68 65 20 4f  ays having the O
13c50 50 5f 49 73 55 6e 69 71 75 65 0a 20 20 20 20 2a  P_IsUnique.    *
13c60 2a 20 6f 70 63 6f 64 65 20 75 73 65 20 74 68 65  * opcode use the
13c70 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 77   values stored w
13c80 69 74 68 69 6e 20 73 65 65 6d 73 20 64 61 6e 67  ithin seems dang
13c90 65 72 6f 75 73 2e 20 48 6f 77 65 76 65 72 2c 20  erous. However, 
13ca0 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20 77 65 20  since.    ** we 
13cb0 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 61 74  can be sure that
13cc0 20 6e 6f 20 6f 74 68 65 72 20 74 65 6d 70 20 72   no other temp r
13cd0 65 67 69 73 74 65 72 73 20 68 61 76 65 20 62 65  egisters have be
13ce0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  en allocated.   
13cf0 20 2a 2a 20 73 69 6e 63 65 20 73 71 6c 69 74 65   ** since sqlite
13d00 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
13d10 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  e() was called, 
13d20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 64 6f  it is safe to do
13d30 20 73 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   so..    */.    
13d40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13d50 34 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71 75 65  4(v, OP_IsUnique
13d60 2c 20 69 49 64 78 2c 20 6a 32 2c 20 72 65 67 52  , iIdx, j2, regR
13d70 6f 77 69 64 2c 20 70 52 65 67 4b 65 79 2c 20 50  owid, pRegKey, P
13d80 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 73 71  4_INT32);.    sq
13d90 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61  lite3HaltConstra
13da0 69 6e 74 28 0a 20 20 20 20 20 20 20 20 70 50 61  int(.        pPa
13db0 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 22  rse, OE_Abort, "
13dc0 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20  indexed columns 
13dd0 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c  are not unique",
13de0 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d   P4_STATIC);.  }
13df0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
13e00 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp3(v, OP_IdxIn
13e10 73 65 72 74 2c 20 69 49 64 78 2c 20 72 65 67 52  sert, iIdx, regR
13e20 65 63 6f 72 64 2c 20 30 29 3b 0a 20 20 73 71 6c  ecord, 0);.  sql
13e30 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
13e40 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
13e50 45 4b 52 45 53 55 4c 54 29 3b 0a 23 65 6e 64 69  EKRESULT);.#endi
13e60 66 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  f.  sqlite3Relea
13e70 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
13e80 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
13e90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13ea0 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65  2(v, OP_SorterNe
13eb0 78 74 2c 20 69 53 6f 72 74 65 72 2c 20 61 64 64  xt, iSorter, add
13ec0 72 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r2);.  sqlite3Vd
13ed0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
13ee0 64 72 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  dr1);..  sqlite3
13ef0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
13f00 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20  _Close, iTab);. 
13f10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13f20 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
13f30 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  iIdx);.  sqlite3
13f40 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
13f50 5f 43 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72 29  _Close, iSorter)
13f60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
13f70 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f  e a new index fo
13f80 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20  r an SQL table. 
13f90 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69   pName1.pName2 i
13fa0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
13fb0 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20  e index .** and 
13fc0 70 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65 20  pTblList is the 
13fd0 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
13fe0 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
13ff0 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77  indexed.  Both w
14000 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20  ill .** be NULL 
14010 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65  for a primary ke
14020 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68  y or an index th
14030 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f  at is created to
14040 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e   satisfy a.** UN
14050 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
14060 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20    If pTable and 
14070 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c  pIndex are NULL,
14080 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   use pParse->pNe
14090 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65  wTable.** as the
140a0 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   table to be ind
140b0 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70  exed.  pParse->p
140c0 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61  NewTable is a ta
140d0 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63  ble that is.** c
140e0 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
140f0 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20  onstructed by a 
14100 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
14110 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c  tement..**.** pL
14120 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
14130 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
14140 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77  ndexed.  pList w
14150 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74  ill be NULL if t
14160 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d  his.** is a prim
14170 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75  ary key or uniqu
14180 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  e-constraint on 
14190 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
141a0 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20  column added.** 
141b0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
141c0 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
141d0 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a  struction.  .**.
141e0 2a 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20  ** If the index 
141f0 69 73 20 63 72 65 61 74 65 64 20 73 75 63 63 65  is created succe
14200 73 73 66 75 6c 6c 79 2c 20 72 65 74 75 72 6e 20  ssfully, return 
14210 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
14220 20 6e 65 77 20 49 6e 64 65 78 0a 2a 2a 20 73 74   new Index.** st
14230 72 75 63 74 75 72 65 2e 20 54 68 69 73 20 69 73  ructure. This is
14240 20 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33   used by sqlite3
14250 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 29 20  AddPrimaryKey() 
14260 74 6f 20 6d 61 72 6b 20 74 68 65 20 69 6e 64 65  to mark the inde
14270 78 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c  x.** as the tabl
14280 65 73 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28  es primary key (
14290 49 6e 64 65 78 2e 61 75 74 6f 49 6e 64 65 78 3d  Index.autoIndex=
142a0 3d 32 29 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73  =2)..*/.Index *s
142b0 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
142c0 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
142d0 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69  se,     /* All i
142e0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
142f0 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20   this parse */. 
14300 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
14310 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72      /* First par
14320 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e  t of index name.
14330 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
14340 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
14350 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70       /* Second p
14360 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d  art of index nam
14370 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  e. May be NULL *
14380 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62  /.  SrcList *pTb
14390 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20  lName, /* Table 
143a0 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50  to index. Use pP
143b0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
143c0 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69  if 0 */.  ExprLi
143d0 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20  st *pList,   /* 
143e0 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  A list of column
143f0 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  s to be indexed 
14400 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
14410 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62  ,       /* OE_Ab
14420 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  ort, OE_Ignore, 
14430 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f  OE_Replace, or O
14440 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65  E_None */.  Toke
14450 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f  n *pStart,     /
14460 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
14470 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74  en that begins t
14480 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  his statement */
14490 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20  .  Token *pEnd, 
144a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22        /* The ")"
144b0 20 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65   that closes the
144c0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
144d0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
144e0 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20 20   sortOrder,     
144f0 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f 66  /* Sort order of
14500 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68 65   primary key whe
14510 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f  n pList==NULL */
14520 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69 73  .  int ifNotExis
14530 74 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72  t     /* Omit er
14540 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c 72  ror if index alr
14550 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29  eady exists */.)
14560 7b 0a 20 20 49 6e 64 65 78 20 2a 70 52 65 74 20  {.  Index *pRet 
14570 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e  = 0;     /* Poin
14580 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ter to return */
14590 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
145a0 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65   0;     /* Table
145b0 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
145c0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
145d0 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  x = 0;   /* The 
145e0 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61  index to be crea
145f0 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ted */.  char *z
14600 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  Name = 0;     /*
14610 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   Name of the ind
14620 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  ex */.  int nNam
14630 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
14640 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
14650 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f  ters in zName */
14660 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54  .  int i, j;.  T
14670 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20  oken nullId;    
14680 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65      /* Fake toke
14690 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20 49  n for an empty I
146a0 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44 62 46 69  D list */.  DbFi
146b0 78 65 72 20 73 46 69 78 3b 20 20 20 20 20 20 20  xer sFix;       
146c0 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e   /* For assignin
146d0 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73  g database names
146e0 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20   to pTable */.  
146f0 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d 61 73  int sortOrderMas
14700 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e  k;   /* 1 to hon
14710 6f 72 20 44 45 53 43 20 69 6e 20 69 6e 64 65 78  or DESC in index
14720 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20  .  0 to ignore. 
14730 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
14740 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
14750 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20   Db *pDb;       
14760 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65        /* The spe
14770 63 69 66 69 63 20 74 61 62 6c 65 20 63 6f 6e 74  cific table cont
14780 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78  aining the index
14790 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ed database */. 
147a0 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
147b0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
147c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
147d0 68 61 74 20 69 73 20 62 65 69 6e 67 20 77 72 69  hat is being wri
147e0 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tten */.  Token 
147f0 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f  *pName = 0;    /
14800 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61  * Unqualified na
14810 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
14820 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20 73  to create */.  s
14830 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
14840 74 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20  tem *pListItem; 
14850 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
14860 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69  ver pList */.  i
14870 6e 74 20 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e  nt nCol;.  int n
14880 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 63 68 61  Extra = 0;.  cha
14890 72 20 2a 7a 45 78 74 72 61 3b 0a 0a 20 20 61 73  r *zExtra;..  as
148a0 73 65 72 74 28 20 70 53 74 61 72 74 3d 3d 30 20  sert( pStart==0 
148b0 7c 7c 20 70 45 6e 64 21 3d 30 20 29 3b 20 2f 2a  || pEnd!=0 ); /*
148c0 20 70 45 6e 64 20 6d 75 73 74 20 62 65 20 6e 6f   pEnd must be no
148d0 6e 2d 4e 55 4c 4c 20 69 66 20 70 53 74 61 72 74  n-NULL if pStart
148e0 20 69 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28   is */.  assert(
148f0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
14900 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 65 76 65   );      /* Neve
14910 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 72  r called with pr
14920 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ior errors */.  
14930 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
14940 69 6c 65 64 20 7c 7c 20 49 4e 5f 44 45 43 4c 41  iled || IN_DECLA
14950 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 67  RE_VTAB ){.    g
14960 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
14970 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
14980 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
14990 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
149a0 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  arse) ){.    got
149b0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
149c0 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  dex;.  }..  /*. 
149d0 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62   ** Find the tab
149e0 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
149f0 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72   indexed.  Retur
14a00 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66  n early if not f
14a10 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ound..  */.  if(
14a20 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
14a30 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20  .    /* Use the 
14a40 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e  two-part index n
14a50 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
14a60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
14a70 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20     ** to search 
14a80 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27  for the table. '
14a90 46 69 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e  Fix' the table n
14aa0 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20  ame to this db. 
14ab0 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f     ** before loo
14ac0 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c  king up the tabl
14ad0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
14ae0 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20  sert( pName1 && 
14af0 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44  pName2 );.    iD
14b00 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
14b10 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
14b20 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
14b30 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
14b40 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69  iDb<0 ) goto exi
14b50 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
14b60 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
14b70 65 20 26 26 20 70 4e 61 6d 65 2d 3e 7a 20 29 3b  e && pName->z );
14b80 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
14b90 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20  _OMIT_TEMPDB.   
14ba0 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78   /* If the index
14bb0 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c   name was unqual
14bc0 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20  ified, check if 
14bd0 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  the table.    **
14be0 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65   is a temp table
14bf0 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65  . If so, set the
14c00 20 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e 20   database to 1. 
14c10 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 20  Do not do this. 
14c20 20 20 20 2a 2a 20 69 66 20 69 6e 69 74 69 61 6c     ** if initial
14c30 69 73 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  ising a database
14c40 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a   schema..    */.
14c50 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
14c60 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20  t.busy ){.      
14c70 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72  pTab = sqlite3Sr
14c80 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72  cListLookup(pPar
14c90 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  se, pTblName);. 
14ca0 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32 2d       if( pName2-
14cb0 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26  >n==0 && pTab &&
14cc0 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d   pTab->pSchema==
14cd0 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
14ce0 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69 44  ma ){.        iD
14cf0 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  b = 1;.      }. 
14d00 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
14d10 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 49   if( sqlite3FixI
14d20 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73  nit(&sFix, pPars
14d30 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c  e, iDb, "index",
14d40 20 70 4e 61 6d 65 29 20 26 26 0a 20 20 20 20 20   pName) &&.     
14d50 20 20 20 73 71 6c 69 74 65 33 46 69 78 53 72 63     sqlite3FixSrc
14d60 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c  List(&sFix, pTbl
14d70 4e 61 6d 65 29 0a 20 20 20 20 29 7b 0a 20 20 20  Name).    ){.   
14d80 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68     /* Because th
14d90 65 20 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75  e parser constru
14da0 63 74 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f  cts pTblName fro
14db0 6d 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74  m a single ident
14dc0 69 66 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20  ifier,.      ** 
14dd0 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
14de0 74 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c  t can never fail
14df0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
14e00 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(0);.    }.    
14e10 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
14e20 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
14e30 61 72 73 65 2c 20 30 2c 20 26 70 54 62 6c 4e 61  arse, 0, &pTblNa
14e40 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20 20 69  me->a[0]);.    i
14e50 66 28 20 21 70 54 61 62 20 7c 7c 20 64 62 2d 3e  f( !pTab || db->
14e60 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
14e70 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
14e80 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72  index;.    asser
14e90 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  t( db->aDb[iDb].
14ea0 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
14eb0 53 63 68 65 6d 61 20 29 3b 0a 20 20 7d 65 6c 73  Schema );.  }els
14ec0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
14ed0 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Name==0 );.    a
14ee0 73 73 65 72 74 28 20 70 53 74 61 72 74 3d 3d 30  ssert( pStart==0
14ef0 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70   );.    pTab = p
14f00 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
14f10 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20  ;.    if( !pTab 
14f20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
14f30 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44  te_index;.    iD
14f40 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
14f50 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
14f60 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d  b->pSchema);.  }
14f70 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
14f80 62 5b 69 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72  b[iDb];..  asser
14f90 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
14fa0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
14fb0 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28  nErr==0 );.  if(
14fc0 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
14fd0 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73  (pTab->zName, "s
14fe0 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a  qlite_", 7)==0 .
14ff0 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70         && memcmp
15000 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d  (&pTab->zName[7]
15010 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c 39 29 21  ,"altertab_",9)!
15020 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
15030 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15040 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
15050 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c  not be indexed",
15060 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
15070 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
15080 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
15090 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
150a0 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54  IT_VIEW.  if( pT
150b0 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
150c0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
150d0 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77  sg(pParse, "view
150e0 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
150f0 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f  exed");.    goto
15100 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
15110 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ex;.  }.#endif.#
15120 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15130 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
15140 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
15150 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
15160 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
15170 72 73 65 2c 20 22 76 69 72 74 75 61 6c 20 74 61  rse, "virtual ta
15180 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  bles may not be 
15190 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67  indexed");.    g
151a0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
151b0 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69  index;.  }.#endi
151c0 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  f..  /*.  ** Fin
151d0 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  d the name of th
151e0 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73  e index.  Make s
151f0 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74  ure there is not
15200 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72   already another
15210 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74  .  ** index or t
15220 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61  able with the sa
15230 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a  me name.  .  **.
15240 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20    ** Exception: 
15250 20 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69   If we are readi
15260 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ng the names of 
15270 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65  permanent indice
15280 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20  s from the.  ** 
15290 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
152a0 62 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d  ble (because som
152b0 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
152c0 63 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65  changed the sche
152d0 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65  ma) and.  ** one
152e0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61   of the index na
152f0 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74  mes collides wit
15300 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  h the name of a 
15310 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
15320 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74  or.  ** index, t
15330 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74  hen we will cont
15340 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20  inue to process 
15350 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a  this index..  **
15360 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d  .  ** If pName==
15370 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  0 it means that 
15380 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c  we are.  ** deal
15390 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61  ing with a prima
153a0 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45  ry key or UNIQUE
153b0 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65   constraint.  We
153c0 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20   have to invent 
153d0 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d  our.  ** own nam
153e0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e  e..  */.  if( pN
153f0 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  ame ){.    zName
15400 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
15410 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
15420 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  e);.    if( zNam
15430 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  e==0 ) goto exit
15440 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
15450 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
15460 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  ->z!=0 );.    if
15470 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
15480 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
15490 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  ame(pParse, zNam
154a0 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  e) ){.      goto
154b0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
154c0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
154d0 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
154e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
154f0 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
15500 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20  b, zName, 0)!=0 
15510 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
15520 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
15530 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
15540 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d  eady a table nam
15550 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ed %s", zName);.
15560 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
15570 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
15580 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15590 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
155a0 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
155b0 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30  , pDb->zName)!=0
155c0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69   ){.      if( !i
155d0 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20 20 20  fNotExist ){.   
155e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
155f0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
15600 64 65 78 20 25 73 20 61 6c 72 65 61 64 79 20 65  dex %s already e
15610 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  xists", zName);.
15620 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15630 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62       assert( !db
15640 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
15650 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
15660 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
15670 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
15680 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
15690 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
156a0 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  x;.    }.  }else
156b0 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
156c0 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20   Index *pLoop;. 
156d0 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61     for(pLoop=pTa
156e0 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20  b->pIndex, n=1; 
156f0 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
15700 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b  op->pNext, n++){
15710 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  }.    zName = sq
15720 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
15730 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64   "sqlite_autoind
15740 65 78 5f 25 73 5f 25 64 22 2c 20 70 54 61 62 2d  ex_%s_%d", pTab-
15750 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20  >zName, n);.    
15760 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  if( zName==0 ){.
15770 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
15780 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
15790 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68    }.  }..  /* Ch
157a0 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a  eck for authoriz
157b0 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20  ation to create 
157c0 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23  an index..  */.#
157d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
157e0 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
157f0 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  .  {.    const c
15800 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e  har *zDb = pDb->
15810 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73  zName;.    if( s
15820 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
15830 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49  pParse, SQLITE_I
15840 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41  NSERT, SCHEMA_TA
15850 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62  BLE(iDb), 0, zDb
15860 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
15870 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
15880 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d  x;.    }.    i =
15890 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49   SQLITE_CREATE_I
158a0 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f  NDEX;.    if( !O
158b0 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
158c0 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54  b==1 ) i = SQLIT
158d0 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e  E_CREATE_TEMP_IN
158e0 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
158f0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
15900 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  arse, i, zName, 
15910 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  pTab->zName, zDb
15920 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
15930 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
15940 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  x;.    }.  }.#en
15950 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69  dif..  /* If pLi
15960 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20  st==0, it means 
15970 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
15980 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20   called to make 
15990 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b  a primary.  ** k
159a0 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61  ey out of the la
159b0 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20  st column added 
159c0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  to the table und
159d0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
159e0 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20  .  ** So create 
159f0 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73  a fake list to s
15a00 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20  imulate this..  
15a10 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  */.  if( pList==
15a20 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e  0 ){.    nullId.
15a30 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  z = pTab->aCol[p
15a40 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61  Tab->nCol-1].zNa
15a50 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e  me;.    nullId.n
15a60 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
15a70 33 30 28 28 63 68 61 72 2a 29 6e 75 6c 6c 49 64  30((char*)nullId
15a80 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  .z);.    pList =
15a90 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
15aa0 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
15ab0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  , 0);.    if( pL
15ac0 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ist==0 ) goto ex
15ad0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
15ae0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
15af0 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72  ListSetName(pPar
15b00 73 65 2c 20 70 4c 69 73 74 2c 20 26 6e 75 6c 6c  se, pList, &null
15b10 49 64 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69 73  Id, 0);.    pLis
15b20 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  t->a[0].sortOrde
15b30 72 20 3d 20 28 75 38 29 73 6f 72 74 4f 72 64 65  r = (u8)sortOrde
15b40 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67  r;.  }..  /* Fig
15b50 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
15b60 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
15b70 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  are required to 
15b80 73 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79  store explicitly
15b90 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20  .  ** specified 
15ba0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
15bb0 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20  ce names..  */. 
15bc0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
15bd0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
15be0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
15bf0 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
15c00 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78  xpr;.    if( pEx
15c10 70 72 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  pr ){.      Coll
15c20 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 45 78  Seq *pColl = pEx
15c30 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  pr->pColl;.     
15c40 20 2f 2a 20 45 69 74 68 65 72 20 70 43 6f 6c 6c   /* Either pColl
15c50 21 3d 30 20 6f 72 20 74 68 65 72 65 20 77 61 73  !=0 or there was
15c60 20 61 6e 20 4f 4f 4d 20 66 61 69 6c 75 72 65 2e   an OOM failure.
15c70 20 20 42 75 74 20 69 66 20 61 6e 20 4f 4f 4d 0a    But if an OOM.
15c80 20 20 20 20 20 20 2a 2a 20 66 61 69 6c 75 72 65        ** failure
15c90 20 77 65 20 68 61 76 65 20 71 75 69 74 20 62 65   we have quit be
15ca0 66 6f 72 65 20 72 65 61 63 68 69 6e 67 20 74 68  fore reaching th
15cb0 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20  is point. */.   
15cc0 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43     if( ALWAYS(pC
15cd0 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  oll) ){.        
15ce0 6e 45 78 74 72 61 20 2b 3d 20 28 31 20 2b 20 73  nExtra += (1 + s
15cf0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
15d00 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  Coll->zName));. 
15d10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
15d20 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c  ..  /* .  ** All
15d30 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
15d40 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f  structure. .  */
15d50 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  nName = sqlit
15d60 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
15d70 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4c 69 73  );.  nCol = pLis
15d80 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64  t->nExpr;.  pInd
15d90 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ex = sqlite3DbMa
15da0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a 20 20  llocZero(db, .  
15db0 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f      ROUND8(sizeo
15dc0 66 28 49 6e 64 65 78 29 29 20 2b 20 20 20 20 20  f(Index)) +     
15dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
15de0 78 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a  x structure  */.
15df0 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a        ROUND8(siz
15e00 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 28 6e 43  eof(tRowcnt)*(nC
15e10 6f 6c 2b 31 29 29 20 2b 20 20 20 2f 2a 20 49 6e  ol+1)) +   /* In
15e20 64 65 78 2e 61 69 52 6f 77 45 73 74 20 20 20 2a  dex.aiRowEst   *
15e30 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 63  /.      sizeof(c
15e40 68 61 72 20 2a 29 2a 6e 43 6f 6c 20 2b 20 20 20  har *)*nCol +   
15e50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15e60 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20  Index.azColl    
15e70 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
15e80 28 69 6e 74 29 2a 6e 43 6f 6c 20 2b 20 20 20 20  (int)*nCol +    
15e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15ea0 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e  * Index.aiColumn
15eb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65     */.      size
15ec0 6f 66 28 75 38 29 2a 6e 43 6f 6c 20 2b 20 20 20  of(u8)*nCol +   
15ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ee0 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f   /* Index.aSortO
15ef0 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 6e 4e  rder */.      nN
15f00 61 6d 65 20 2b 20 31 20 2b 20 20 20 20 20 20 20  ame + 1 +       
15f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 7a 4e 61 6d     /* Index.zNam
15f30 65 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  e      */.      
15f40 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  nExtra          
15f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f60 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f       /* Collatio
15f70 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73  n sequence names
15f80 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 64   */.  );.  if( d
15f90 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
15fa0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
15fb0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
15fc0 20 7d 0a 20 20 7a 45 78 74 72 61 20 3d 20 28 63   }.  zExtra = (c
15fd0 68 61 72 2a 29 70 49 6e 64 65 78 3b 0a 20 20 70  har*)pIndex;.  p
15fe0 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 20  Index->aiRowEst 
15ff0 3d 20 28 74 52 6f 77 63 6e 74 2a 29 26 7a 45 78  = (tRowcnt*)&zEx
16000 74 72 61 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  tra[ROUND8(sizeo
16010 66 28 49 6e 64 65 78 29 29 5d 3b 0a 20 20 70 49  f(Index))];.  pI
16020 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28  ndex->azColl = (
16030 63 68 61 72 2a 2a 29 0a 20 20 20 20 20 28 28 63  char**).     ((c
16040 68 61 72 2a 29 70 49 6e 64 65 78 2d 3e 61 69 52  har*)pIndex->aiR
16050 6f 77 45 73 74 20 2b 20 52 4f 55 4e 44 38 28 73  owEst + ROUND8(s
16060 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 6e  izeof(tRowcnt)*n
16070 43 6f 6c 2b 31 29 29 3b 0a 20 20 61 73 73 65 72  Col+1));.  asser
16080 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
16090 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e  IGNMENT(pIndex->
160a0 61 69 52 6f 77 45 73 74 29 20 29 3b 0a 20 20 61  aiRowEst) );.  a
160b0 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
160c0 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64  E_ALIGNMENT(pInd
160d0 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20  ex->azColl) );. 
160e0 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
160f0 6e 20 3d 20 28 69 6e 74 20 2a 29 28 26 70 49 6e  n = (int *)(&pIn
16100 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c  dex->azColl[nCol
16110 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 53  ]);.  pIndex->aS
16120 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 20 2a  ortOrder = (u8 *
16130 29 28 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  )(&pIndex->aiCol
16140 75 6d 6e 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49  umn[nCol]);.  pI
16150 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63  ndex->zName = (c
16160 68 61 72 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e  har *)(&pIndex->
16170 61 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d  aSortOrder[nCol]
16180 29 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 28 63  );.  zExtra = (c
16190 68 61 72 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e  har *)(&pIndex->
161a0 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 2b 31 5d 29 3b  zName[nName+1]);
161b0 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e 64 65 78  .  memcpy(pIndex
161c0 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  ->zName, zName, 
161d0 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64  nName+1);.  pInd
161e0 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61  ex->pTable = pTa
161f0 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  b;.  pIndex->nCo
16200 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  lumn = pList->nE
16210 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f  xpr;.  pIndex->o
16220 6e 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45  nError = (u8)onE
16230 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  rror;.  pIndex->
16240 61 75 74 6f 49 6e 64 65 78 20 3d 20 28 75 38 29  autoIndex = (u8)
16250 28 70 4e 61 6d 65 3d 3d 30 29 3b 0a 20 20 70 49  (pName==0);.  pI
16260 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20  ndex->pSchema = 
16270 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
16280 68 65 6d 61 3b 0a 20 20 61 73 73 65 72 74 28 20  hema;.  assert( 
16290 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
162a0 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
162b0 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  0) );..  /* Chec
162c0 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 73  k to see if we s
162d0 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43  hould honor DESC
162e0 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64   requests on ind
162f0 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a  ex columns.  */.
16300 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
16310 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  ma->file_format>
16320 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72  =4 ){.    sortOr
16330 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20  derMask = -1;   
16340 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f  /* Honor DESC */
16350 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f  .  }else{.    so
16360 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b  rtOrderMask = 0;
16370 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45      /* Ignore DE
16380 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20  SC */.  }..  /* 
16390 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  Scan the names o
163a0 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  f the columns of
163b0 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
163c0 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a   indexed and.  *
163d0 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d  * load the colum
163e0 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74  n indices into t
163f0 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  he Index structu
16400 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65  re.  Report an e
16410 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79  rror.  ** if any
16420 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66   column is not f
16430 6f 75 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ound..  **.  ** 
16440 54 4f 44 4f 3a 20 20 41 64 64 20 61 20 74 65 73  TODO:  Add a tes
16450 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  t to make sure t
16460 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 6f 6c  hat the same col
16470 75 6d 6e 20 69 73 20 6e 6f 74 20 6e 61 6d 65 64  umn is not named
16480 0a 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20  .  ** more than 
16490 6f 6e 63 65 20 77 69 74 68 69 6e 20 74 68 65 20  once within the 
164a0 73 61 6d 65 20 69 6e 64 65 78 2e 20 20 4f 6e 6c  same index.  Onl
164b0 79 20 74 68 65 20 66 69 72 73 74 20 69 6e 73 74  y the first inst
164c0 61 6e 63 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65  ance of.  ** the
164d0 20 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65   column will eve
164e0 72 20 62 65 20 75 73 65 64 20 62 79 20 74 68 65  r be used by the
164f0 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74   optimizer.  Not
16500 65 20 74 68 61 74 20 75 73 69 6e 67 20 74 68 65  e that using the
16510 0a 20 20 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d  .  ** same colum
16520 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  n more than once
16530 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 65 72   cannot be an er
16540 72 6f 72 20 62 65 63 61 75 73 65 20 74 68 61 74  ror because that
16550 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 62 72 65   would .  ** bre
16560 61 6b 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  ak backwards com
16570 70 61 74 69 62 69 6c 69 74 79 20 2d 20 69 74 20  patibility - it 
16580 6e 65 65 64 73 20 74 6f 20 62 65 20 61 20 77 61  needs to be a wa
16590 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f  rning..  */.  fo
165a0 72 28 69 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d  r(i=0, pListItem
165b0 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69  =pList->a; i<pLi
165c0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  st->nExpr; i++, 
165d0 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20  pListItem++){.  
165e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
165f0 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69 73 74 49 74  olName = pListIt
16600 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 43  em->zName;.    C
16610 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a  olumn *pTabCol;.
16620 20 20 20 20 69 6e 74 20 72 65 71 75 65 73 74 65      int requeste
16630 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  dSortOrder;.    
16640 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20  char *zColl;    
16650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16660 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  * Collation sequ
16670 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20  ence name */..  
16680 20 20 66 6f 72 28 6a 3d 30 2c 20 70 54 61 62 43    for(j=0, pTabC
16690 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a  ol=pTab->aCol; j
166a0 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
166b0 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20  , pTabCol++){.  
166c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
166d0 74 72 49 43 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c  trICmp(zColName,
166e0 20 70 54 61 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29   pTabCol->zName)
166f0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
16700 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54   }.    if( j>=pT
16710 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
16720 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
16730 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
16740 20 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d   %s has no colum
16750 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20  n named %s",.   
16760 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
16770 2c 20 7a 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20  , zColName);.   
16780 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
16790 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  Schema = 1;.    
167a0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
167b0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
167c0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
167d0 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20  lumn[i] = j;.   
167e0 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f   /* Justificatio
167f0 6e 20 6f 66 20 74 68 65 20 41 4c 57 41 59 53 28  n of the ALWAYS(
16800 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
16810 2d 3e 70 43 6f 6c 6c 29 3a 20 20 42 65 63 61 75  ->pColl):  Becau
16820 73 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  se of.    ** the
16830 20 77 61 79 20 74 68 65 20 22 69 64 78 6c 69 73   way the "idxlis
16840 74 22 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20  t" non-terminal 
16850 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  is constructed b
16860 79 20 74 68 65 20 70 61 72 73 65 72 2c 0a 20 20  y the parser,.  
16870 20 20 2a 2a 20 69 66 20 70 4c 69 73 74 49 74 65    ** if pListIte
16880 6d 2d 3e 70 45 78 70 72 20 69 73 20 6e 6f 74 20  m->pExpr is not 
16890 6e 75 6c 6c 20 74 68 65 6e 20 65 69 74 68 65 72  null then either
168a0 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
168b0 72 2d 3e 70 43 6f 6c 6c 0a 20 20 20 20 2a 2a 20  r->pColl.    ** 
168c0 6d 75 73 74 20 65 78 69 73 74 20 6f 72 20 65 6c  must exist or el
168d0 73 65 20 74 68 65 72 65 20 6d 75 73 74 20 68 61  se there must ha
168e0 76 65 20 62 65 65 6e 20 61 6e 20 4f 4f 4d 20 65  ve been an OOM e
168f0 72 72 6f 72 2e 20 20 42 75 74 20 69 66 20 74 68  rror.  But if th
16900 65 72 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 61  ere.    ** was a
16910 6e 20 4f 4f 4d 20 65 72 72 6f 72 2c 20 77 65 20  n OOM error, we 
16920 77 6f 75 6c 64 20 6e 65 76 65 72 20 72 65 61 63  would never reac
16930 68 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f  h this point. */
16940 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 49 74  .    if( pListIt
16950 65 6d 2d 3e 70 45 78 70 72 20 26 26 20 41 4c 57  em->pExpr && ALW
16960 41 59 53 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70  AYS(pListItem->p
16970 45 78 70 72 2d 3e 70 43 6f 6c 6c 29 20 29 7b 0a  Expr->pColl) ){.
16980 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b        int nColl;
16990 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70  .      zColl = p
169a0 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d  ListItem->pExpr-
169b0 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20  >pColl->zName;. 
169c0 20 20 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c       nColl = sql
169d0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f  ite3Strlen30(zCo
169e0 6c 6c 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 61  ll) + 1;.      a
169f0 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e  ssert( nExtra>=n
16a00 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65  Coll );.      me
16a10 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f  mcpy(zExtra, zCo
16a20 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20  ll, nColl);.    
16a30 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61    zColl = zExtra
16a40 3b 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20 2b  ;.      zExtra +
16a50 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e  = nColl;.      n
16a60 45 78 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a  Extra -= nColl;.
16a70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16a80 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61   zColl = pTab->a
16a90 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20  Col[j].zColl;.  
16aa0 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29      if( !zColl )
16ab0 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20  {.        zColl 
16ac0 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20  = "BINARY";.    
16ad0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
16ae0 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
16af0 20 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63 61   && !sqlite3Loca
16b00 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
16b10 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  , zColl) ){.    
16b20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
16b30 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
16b40 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f      pIndex->azCo
16b50 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20  ll[i] = zColl;. 
16b60 20 20 20 72 65 71 75 65 73 74 65 64 53 6f 72 74     requestedSort
16b70 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74 65  Order = pListIte
16b80 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20 73  m->sortOrder & s
16b90 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20  ortOrderMask;.  
16ba0 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f    pIndex->aSortO
16bb0 72 64 65 72 5b 69 5d 20 3d 20 28 75 38 29 72 65  rder[i] = (u8)re
16bc0 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
16bd0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
16be0 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e  efaultRowEst(pIn
16bf0 64 65 78 29 3b 0a 0a 20 20 69 66 28 20 70 54 61  dex);..  if( pTa
16c00 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  b==pParse->pNewT
16c10 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  able ){.    /* T
16c20 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
16c30 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63  been called to c
16c40 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74  reate an automat
16c50 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20  ic index as a.  
16c60 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61    ** result of a
16c70 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
16c80 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e  UNIQUE clause on
16c90 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69   a column defini
16ca0 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  tion, or.    ** 
16cb0 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
16cc0 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66   UNIQUE clause f
16cd0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c  ollowing the col
16ce0 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e  umn definitions.
16cf0 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65  .    ** i.e. one
16d00 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
16d10 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
16d20 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  t(x PRIMARY KEY,
16d30 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41   y);.    ** CREA
16d40 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c  TE TABLE t(x, y,
16d50 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a   UNIQUE(x, y));.
16d60 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69      **.    ** Ei
16d70 74 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20  ther way, check 
16d80 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61  to see if the ta
16d90 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20  ble already has 
16da0 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49  such an index. I
16db0 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e  f.    ** so, don
16dc0 27 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69  't bother creati
16dd0 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69  ng this one. Thi
16de0 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74  s only applies t
16df0 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74  o.    ** automat
16e00 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69  ically created i
16e10 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61  ndices. Users ca
16e20 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73  n do as they wis
16e30 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78  h with.    ** ex
16e40 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a  plicit indices..
16e50 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 77      **.    ** Tw
16e60 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d  o UNIQUE or PRIM
16e70 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
16e80 6e 74 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  nts are consider
16e90 65 64 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20  ed equivalent.  
16ea0 20 20 2a 2a 20 28 61 6e 64 20 74 68 75 73 20 73    ** (and thus s
16eb0 75 70 70 72 65 73 73 69 6e 67 20 74 68 65 20 73  uppressing the s
16ec0 65 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65 6e 20  econd one) even 
16ed0 69 66 20 74 68 65 79 20 68 61 76 65 20 64 69 66  if they have dif
16ee0 66 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20 73 6f  ferent.    ** so
16ef0 72 74 20 6f 72 64 65 72 73 2e 0a 20 20 20 20 2a  rt orders..    *
16f00 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72  *.    ** If ther
16f10 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20  e are different 
16f20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
16f30 63 65 73 20 6f 72 20 69 66 20 74 68 65 20 63 6f  ces or if the co
16f40 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a 2a 20  lumns of.    ** 
16f50 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  the constraint o
16f60 63 63 75 72 20 69 6e 20 64 69 66 66 65 72 65 6e  ccur in differen
16f70 74 20 6f 72 64 65 72 73 2c 20 74 68 65 6e 20 74  t orders, then t
16f80 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  he constraints a
16f90 72 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64  re.    ** consid
16fa0 65 72 65 64 20 64 69 73 74 69 6e 63 74 20 61 6e  ered distinct an
16fb0 64 20 62 6f 74 68 20 72 65 73 75 6c 74 20 69 6e  d both result in
16fc0 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63 65   separate indice
16fd0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e  s..    */.    In
16fe0 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66  dex *pIdx;.    f
16ff0 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
17000 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
17010 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
17020 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
17030 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
17040 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
17050 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17060 28 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65  ( pIdx->autoInde
17070 78 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  x );.      asser
17080 74 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  t( pIndex->onErr
17090 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a  or!=OE_None );..
170a0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
170b0 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65 78 2d  nColumn!=pIndex-
170c0 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  >nColumn ) conti
170d0 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  nue;.      for(k
170e0 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; k<pIdx->nCol
170f0 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  umn; k++){.     
17100 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
17110 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  1;.        const
17120 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20 20   char *z2;.     
17130 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
17140 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78  olumn[k]!=pIndex
17150 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20  ->aiColumn[k] ) 
17160 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a  break;.        z
17170 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  1 = pIdx->azColl
17180 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32 20  [k];.        z2 
17190 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  = pIndex->azColl
171a0 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [k];.        if(
171b0 20 7a 31 21 3d 7a 32 20 26 26 20 73 71 6c 69 74   z1!=z2 && sqlit
171c0 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32  e3StrICmp(z1, z2
171d0 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
171e0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d   }.      if( k==
171f0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  pIdx->nColumn ){
17200 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
17210 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64  x->onError!=pInd
17220 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20  ex->onError ){. 
17230 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
17240 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61   constraint crea
17250 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64  tes the same ind
17260 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75 73  ex as a previous
17270 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
17280 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66 69  nstraint specifi
17290 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20  ed somewhere in 
172a0 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
172b0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
172c0 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72        ** However
172d0 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   the ON CONFLICT
172e0 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69 66   clauses are dif
172f0 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20  ferent. If both 
17300 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20  this .          
17310 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  ** constraint an
17320 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  d the previous e
17330 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72  quivalent constr
17340 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63  aint have explic
17350 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  it.          ** 
17360 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
17370 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20 65  ses this is an e
17380 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c  rror. Otherwise,
17390 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20   use the.       
173a0 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79     ** explicitly
173b0 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61 76   specified behav
173c0 69 6f 75 72 20 66 6f 72 20 74 68 65 20 69 6e 64  iour for the ind
173d0 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ex..          */
173e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
173f0 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  (pIdx->onError==
17400 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49  OE_Default || pI
17410 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
17420 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20  E_Default) ){.  
17430 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17440 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
17450 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
17460 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20     "conflicting 
17470 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
17480 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20  ses specified", 
17490 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
174a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
174b0 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
174c0 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
174d0 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45         pIdx->onE
174e0 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f  rror = pIndex->o
174f0 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  nError;.        
17500 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
17510 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
17520 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
17530 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
17540 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e  .  /* Link the n
17550 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  ew Index structu
17560 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20  re to its table 
17570 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72  and to the other
17580 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  .  ** in-memory 
17590 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
175a0 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28  res. .  */.  if(
175b0 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
175c0 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a  {.    Index *p;.
175d0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
175e0 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
175f0 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78  ld(db, 0, pIndex
17600 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
17610 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
17620 68 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d  hInsert(&pIndex-
17630 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
17640 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  h, .            
17650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
17660 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 71 6c  ndex->zName, sql
17670 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 49 6e  ite3Strlen30(pIn
17680 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20  dex->zName),.   
17690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176a0 20 20 20 20 20 20 20 70 49 6e 64 65 78 29 3b 0a         pIndex);.
176b0 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
176c0 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49     assert( p==pI
176d0 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c  ndex );  /* Mall
176e0 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
176f0 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d  led */.      db-
17700 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
17710 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  1;.      goto ex
17720 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
17730 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66  .    }.    db->f
17740 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
17750 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20  nternChanges;.  
17760 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d    if( pTblName!=
17770 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  0 ){.      pInde
17780 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e  x->tnum = db->in
17790 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20  it.newTnum;.    
177a0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
177b0 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  he db->init.busy
177c0 20 69 73 20 30 20 74 68 65 6e 20 63 72 65 61 74   is 0 then creat
177d0 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64  e the index on d
177e0 69 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  isk.  This.  ** 
177f0 69 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67  involves writing
17800 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
17810 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
17820 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20   and filling in 
17830 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77  the.  ** index w
17840 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ith the current 
17850 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a  table contents..
17860 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62    **.  ** The db
17870 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30  ->init.busy is 0
17880 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 66   when the user f
17890 69 72 73 74 20 65 6e 74 65 72 73 20 61 20 43 52  irst enters a CR
178a0 45 41 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a  EATE INDEX .  **
178b0 20 63 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69   command.  db->i
178c0 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 77 68  nit.busy is 1 wh
178d0 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 69 73  en a database is
178e0 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a   opened and .  *
178f0 2a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  * CREATE INDEX s
17900 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65  tatements are re
17910 61 64 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ad out of the ma
17920 73 74 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a  ster table.  In.
17930 20 20 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20    ** the latter 
17940 63 61 73 65 20 74 68 65 20 69 6e 64 65 78 20 61  case the index a
17950 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e  lready exists on
17960 20 64 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20   disk, which is 
17970 77 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27  why.  ** we don'
17980 74 20 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61  t want to recrea
17990 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  te it..  **.  **
179a0 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20   If pTblName==0 
179b0 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e  it means this in
179c0 64 65 78 20 69 73 20 67 65 6e 65 72 61 74 65 64  dex is generated
179d0 20 61 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65   as a primary ke
179e0 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45  y.  ** or UNIQUE
179f0 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 61   constraint of a
17a00 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
17a10 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20  atement.  Since 
17a20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68  the table.  ** h
17a30 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65  as just been cre
17a40 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e  ated, it contain
17a50 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68  s no data and th
17a60 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69  e index initiali
17a70 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70  zation.  ** step
17a80 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e   can be skipped.
17a90 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 20 2f 2a  .  */.  else{ /*
17aa0 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
17ab0 73 79 3d 3d 30 20 29 20 2a 2f 0a 20 20 20 20 56  sy==0 ) */.    V
17ac0 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72  dbe *v;.    char
17ad0 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74   *zStmt;.    int
17ae0 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65   iMem = ++pParse
17af0 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76 20 3d  ->nMem;..    v =
17b00 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
17b10 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
17b20 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69   v==0 ) goto exi
17b30 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
17b40 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
17b50 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72  the rootpage for
17b60 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a   the index.    *
17b70 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  /.    sqlite3Beg
17b80 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
17b90 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
17ba0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17bb0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72  eAddOp2(v, OP_Cr
17bc0 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20  eateIndex, iDb, 
17bd0 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47  iMem);..    /* G
17be0 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65  ather the comple
17bf0 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  te text of the C
17c00 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
17c10 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a  ement into.    *
17c20 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69  * the zStmt vari
17c30 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20  able.    */.    
17c40 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20  if( pStart ){.  
17c50 20 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64      assert( pEnd
17c60 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  !=0 );.      /* 
17c70 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69  A named index wi
17c80 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43  th an explicit C
17c90 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
17ca0 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a  ement */.      z
17cb0 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
17cc0 72 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54  rintf(db, "CREAT
17cd0 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c  E%s INDEX %.*s",
17ce0 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72  .        onError
17cf0 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a  ==OE_None ? "" :
17d00 20 22 20 55 4e 49 51 55 45 22 2c 0a 20 20 20 20   " UNIQUE",.    
17d10 20 20 20 20 28 69 6e 74 29 28 70 45 6e 64 2d 3e      (int)(pEnd->
17d20 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20  z - pName->z) + 
17d30 31 2c 0a 20 20 20 20 20 20 20 20 70 4e 61 6d 65  1,.        pName
17d40 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ->z);.    }else{
17d50 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74  .      /* An aut
17d60 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72 65  omatic index cre
17d70 61 74 65 64 20 62 79 20 61 20 50 52 49 4d 41 52  ated by a PRIMAR
17d80 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
17d90 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
17da0 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73      /* zStmt = s
17db0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22  qlite3MPrintf(""
17dc0 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d  ); */.      zStm
17dd0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  t = 0;.    }..  
17de0 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74 72    /* Add an entr
17df0 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74  y in sqlite_mast
17e00 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65  er for this inde
17e10 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  x.    */.    sql
17e20 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
17e30 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
17e40 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51   "INSERT INTO %Q
17e50 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65  .%s VALUES('inde
17e60 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c 25 51 29  x',%Q,%Q,#%d,%Q)
17e70 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  ;",.        db->
17e80 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
17e90 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
17ea0 29 2c 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ),.        pInde
17eb0 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  x->zName,.      
17ec0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20    pTab->zName,. 
17ed0 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20 20 20         iMem,.   
17ee0 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29       zStmt.    )
17ef0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
17f00 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a  ree(db, zStmt);.
17f10 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65  .    /* Fill the
17f20 20 69 6e 64 65 78 20 77 69 74 68 20 64 61 74 61   index with data
17f30 20 61 6e 64 20 72 65 70 61 72 73 65 20 74 68 65   and reparse the
17f40 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e   schema. Code an
17f50 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20 20 2a   OP_Expire.    *
17f60 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
17f70 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64  all pre-compiled
17f80 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20   statements..   
17f90 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 62 6c   */.    if( pTbl
17fa0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Name ){.      sq
17fb0 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
17fc0 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
17fd0 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71   iMem);.      sq
17fe0 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
17ff0 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
18000 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18010 65 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f  eAddParseSchemaO
18020 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20 20 20  p(v, iDb,.      
18030 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
18040 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27  f(db, "name='%q'
18050 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78   AND type='index
18060 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  '", pIndex->zNam
18070 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e));.      sqlit
18080 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
18090 4f 50 5f 45 78 70 69 72 65 2c 20 30 29 3b 0a 20  OP_Expire, 0);. 
180a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
180b0 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e  hen adding an in
180c0 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20  dex to the list 
180d0 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61  of indices for a
180e0 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a   table, make.  *
180f0 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63  * sure all indic
18100 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65  es labeled OE_Re
18110 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72  place come after
18120 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c   all those label
18130 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72  ed.  ** OE_Ignor
18140 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  e.  This is nece
18150 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f  ssary for the co
18160 72 72 65 63 74 20 63 6f 6e 73 74 72 61 69 6e 74  rrect constraint
18170 20 63 68 65 63 6b 0a 20 20 2a 2a 20 70 72 6f 63   check.  ** proc
18180 65 73 73 69 6e 67 20 28 69 6e 20 73 71 6c 69 74  essing (in sqlit
18190 65 33 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72  e3GenerateConstr
181a0 61 69 6e 74 43 68 65 63 6b 73 28 29 29 20 61 73  aintChecks()) as
181b0 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 55 50   part of.  ** UP
181c0 44 41 54 45 20 61 6e 64 20 49 4e 53 45 52 54 20  DATE and INSERT 
181d0 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 0a 20 20  statements.  .  
181e0 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
181f0 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61  t.busy || pTblNa
18200 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  me==0 ){.    if(
18210 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70   onError!=OE_Rep
18220 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49  lace || pTab->pI
18230 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20  ndex==0.        
18240 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
18250 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65  ->onError==OE_Re
18260 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49  place){.      pI
18270 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54  ndex->pNext = pT
18280 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
18290 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d    pTab->pIndex =
182a0 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c   pIndex;.    }el
182b0 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
182c0 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e  *pOther = pTab->
182d0 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68  pIndex;.      wh
182e0 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65  ile( pOther->pNe
182f0 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e  xt && pOther->pN
18300 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  ext->onError!=OE
18310 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20  _Replace ){.    
18320 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74      pOther = pOt
18330 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  her->pNext;.    
18340 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78    }.      pIndex
18350 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72  ->pNext = pOther
18360 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70  ->pNext;.      p
18370 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Other->pNext = p
18380 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  Index;.    }.   
18390 20 70 52 65 74 20 3d 20 70 49 6e 64 65 78 3b 0a   pRet = pIndex;.
183a0 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a      pIndex = 0;.
183b0 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20    }..  /* Clean 
183c0 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e  up before exitin
183d0 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65  g */.exit_create
183e0 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49  _index:.  if( pI
183f0 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  ndex ){.    sqli
18400 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
18410 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  ndex->zColAff);.
18420 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
18430 65 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  e(db, pIndex);. 
18440 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
18450 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
18460 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
18470 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
18480 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73  , pTblName);.  s
18490 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
184a0 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
184b0 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
184c0 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e   Fill the Index.
184d0 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79  aiRowEst[] array
184e0 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e   with default in
184f0 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f  formation - info
18500 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65  rmation.** to be
18510 20 75 73 65 64 20 77 68 65 6e 20 77 65 20 68 61   used when we ha
18520 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41  ve not run the A
18530 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a  NALYZE command..
18540 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30  **.** aiRowEst[0
18550 5d 20 69 73 20 73 75 70 70 6f 73 65 20 74 6f 20  ] is suppose to 
18560 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62  contain the numb
18570 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
18580 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20  n the index..** 
18590 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20  Since we do not 
185a0 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d 69  know, guess 1 mi
185b0 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74  llion.  aiRowEst
185c0 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61  [1] is an estima
185d0 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d  te of the.** num
185e0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
185f0 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61  he table that ma
18600 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c  tch any particul
18610 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a  ar value of the.
18620 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20  ** first column 
18630 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 61  of the index.  a
18640 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61 6e  iRowEst[2] is an
18650 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
18660 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f   number.** of ro
18670 77 73 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e  ws that match an
18680 79 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d  y particular com
18690 62 69 6e 69 61 74 69 6f 6e 20 6f 66 20 74 68 65  biniation of the
186a0 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73   first 2 columns
186b0 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78  .** of the index
186c0 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  .  And so forth.
186d0 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73    It must always
186e0 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
186f0 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  t.*.**          
18700 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69   aiRowEst[N]<=ai
18710 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20  RowEst[N-1].**  
18720 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73           aiRowEs
18730 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70  t[N]>=1.**.** Ap
18740 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77  art from that, w
18750 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f  e have little to
18760 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69   go on besides i
18770 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a  ntuition as to.*
18780 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d  * how aiRowEst[]
18790 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69   should be initi
187a0 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d  alized.  The num
187b0 62 65 72 73 20 67 65 6e 65 72 61 74 65 64 20 68  bers generated h
187c0 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64  ere.** are based
187d0 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75   on typical valu
187e0 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75  es found in actu
187f0 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76  al indices..*/.v
18800 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 61 75  oid sqlite3Defau
18810 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a  ltRowEst(Index *
18820 70 49 64 78 29 7b 0a 20 20 74 52 6f 77 63 6e 74  pIdx){.  tRowcnt
18830 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f   *a = pIdx->aiRo
18840 77 45 73 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  wEst;.  int i;. 
18850 20 74 52 6f 77 63 6e 74 20 6e 3b 0a 20 20 61 73   tRowcnt n;.  as
18860 73 65 72 74 28 20 61 21 3d 30 20 29 3b 0a 20 20  sert( a!=0 );.  
18870 61 5b 30 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61  a[0] = pIdx->pTa
18880 62 6c 65 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20  ble->nRowEst;.  
18890 69 66 28 20 61 5b 30 5d 3c 31 30 20 29 20 61 5b  if( a[0]<10 ) a[
188a0 30 5d 20 3d 20 31 30 3b 0a 20 20 6e 20 3d 20 31  0] = 10;.  n = 1
188b0 30 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  0;.  for(i=1; i<
188c0 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  =pIdx->nColumn; 
188d0 69 2b 2b 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d  i++){.    a[i] =
188e0 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 3e 35 20   n;.    if( n>5 
188f0 29 20 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28  ) n--;.  }.  if(
18900 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
18910 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 61  OE_None ){.    a
18920 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20  [pIdx->nColumn] 
18930 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
18940 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
18950 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73  ill drop an exis
18960 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78  ting named index
18970 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
18980 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ** implements th
18990 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61  e DROP INDEX sta
189a0 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
189b0 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78  sqlite3DropIndex
189c0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
189d0 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20  SrcList *pName, 
189e0 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20  int ifExists){. 
189f0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a   Index *pIndex;.
18a00 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
18a10 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
18a20 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
18a30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
18a40 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20  rse->nErr==0 ); 
18a50 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65    /* Never calle
18a60 64 20 77 69 74 68 20 70 72 69 6f 72 20 65 72 72  d with prior err
18a70 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ors */.  if( db-
18a80 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
18a90 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
18aa0 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
18ab0 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e   assert( pName->
18ac0 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28  nSrc==1 );.  if(
18ad0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
18ae0 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
18af0 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  arse) ){.    got
18b00 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
18b10 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20  x;.  }.  pIndex 
18b20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
18b30 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b  ex(db, pName->a[
18b40 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d  0].zName, pName-
18b50 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
18b60 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d  ;.  if( pIndex==
18b70 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69 66  0 ){.    if( !if
18b80 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  Exists ){.      
18b90 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
18ba0 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
18bb0 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61   index: %S", pNa
18bc0 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  me, 0);.    }els
18bd0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
18be0 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53  CodeVerifyNamedS
18bf0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e  chema(pParse, pN
18c00 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
18c10 61 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ase);.    }.    
18c20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
18c30 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74  ema = 1;.    got
18c40 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
18c50 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e  x;.  }.  if( pIn
18c60 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29  dex->autoIndex )
18c70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
18c80 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69  orMsg(pParse, "i
18c90 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
18ca0 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20  with UNIQUE ".  
18cb0 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20      "or PRIMARY 
18cc0 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  KEY constraint c
18cd0 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  annot be dropped
18ce0 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ", 0);.    goto 
18cf0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
18d00 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
18d10 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
18d20 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53  x(db, pIndex->pS
18d30 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20  chema);.#ifndef 
18d40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
18d50 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
18d60 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c    int code = SQL
18d70 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a  ITE_DROP_INDEX;.
18d80 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
18d90 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
18da0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
18db0 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
18dc0 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
18dd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
18de0 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
18df0 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71  iDb);.    if( sq
18e00 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
18e10 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
18e20 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a  LETE, zTab, 0, z
18e30 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
18e40 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
18e50 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
18e60 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
18e70 20 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51   iDb ) code = SQ
18e80 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49  LITE_DROP_TEMP_I
18e90 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71  NDEX;.    if( sq
18ea0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
18eb0 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e  Parse, code, pIn
18ec0 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62  dex->zName, pTab
18ed0 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b  ->zName, zDb) ){
18ee0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
18ef0 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20  _drop_index;.   
18f00 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
18f10 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
18f20 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
18f30 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74  index and from t
18f40 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
18f50 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
18f60 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
18f70 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
18f80 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
18f90 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
18fa0 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 1, iDb);.    
18fb0 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
18fc0 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
18fd0 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
18fe0 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d  Q.%s WHERE name=
18ff0 25 51 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64  %Q AND type='ind
19000 65 78 27 22 2c 0a 20 20 20 20 20 20 20 64 62 2d  ex'",.       db-
19010 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
19020 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
19030 62 29 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  b), pIndex->zNam
19040 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  e.    );.    sql
19050 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62  ite3ClearStatTab
19060 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c  les(pParse, iDb,
19070 20 22 69 64 78 22 2c 20 70 49 6e 64 65 78 2d 3e   "idx", pIndex->
19080 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
19090 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
190a0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
190b0 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
190c0 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  e(pParse, pIndex
190d0 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
190e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
190f0 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e  Op4(v, OP_DropIn
19100 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  dex, iDb, 0, 0, 
19110 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
19120 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f  );.  }..exit_dro
19130 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74  p_index:.  sqlit
19140 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
19150 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  db, pName);.}../
19160 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69 73 20 61  *.** pArray is a
19170 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 61   pointer to an a
19180 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e  rray of objects.
19190 20 45 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20   Each object in 
191a0 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 69 73 20  the.** array is 
191b0 73 7a 45 6e 74 72 79 20 62 79 74 65 73 20 69 6e  szEntry bytes in
191c0 20 73 69 7a 65 2e 20 54 68 69 73 20 72 6f 75 74   size. This rout
191d0 69 6e 65 20 75 73 65 73 20 73 71 6c 69 74 65 33  ine uses sqlite3
191e0 44 62 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20 74  DbRealloc().** t
191f0 6f 20 65 78 74 65 6e 64 20 74 68 65 20 61 72 72  o extend the arr
19200 61 79 20 73 6f 20 74 68 61 74 20 74 68 65 72 65  ay so that there
19210 20 69 73 20 73 70 61 63 65 20 66 6f 72 20 61 20   is space for a 
19220 6e 65 77 20 6f 62 6a 65 63 74 20 61 74 20 74 68  new object at th
19230 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  e end..**.** Whe
19240 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
19250 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 45 6e  is called, *pnEn
19260 74 72 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  try contains the
19270 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
19280 0a 2a 2a 20 74 68 65 20 61 72 72 61 79 20 28 69  .** the array (i
19290 6e 20 65 6e 74 72 69 65 73 20 2d 20 73 6f 20 74  n entries - so t
192a0 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  he allocation is
192b0 20 28 28 2a 70 6e 45 6e 74 72 79 29 20 2a 20 73   ((*pnEntry) * s
192c0 7a 45 6e 74 72 79 29 20 62 79 74 65 73 0a 2a 2a  zEntry) bytes.**
192d0 20 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a   in total)..**.*
192e0 2a 20 49 66 20 74 68 65 20 72 65 61 6c 6c 6f 63  * If the realloc
192f0 28 29 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  () is successful
19300 20 28 69 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f 4d   (i.e. if no OOM
19310 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75 72   condition occur
19320 73 29 2c 20 74 68 65 0a 2a 2a 20 73 70 61 63 65  s), the.** space
19330 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
19340 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 73  he new object is
19350 20 7a 65 72 6f 65 64 2c 20 2a 70 6e 45 6e 74 72   zeroed, *pnEntr
19360 79 20 75 70 64 61 74 65 64 20 74 6f 0a 2a 2a 20  y updated to.** 
19370 72 65 66 6c 65 63 74 20 74 68 65 20 6e 65 77 20  reflect the new 
19380 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61  size of the arra
19390 79 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20  y and a pointer 
193a0 74 6f 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63  to the new alloc
193b0 61 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 65  ation.** returne
193c0 64 2e 20 2a 70 49 64 78 20 69 73 20 73 65 74 20  d. *pIdx is set 
193d0 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
193e0 74 68 65 20 6e 65 77 20 61 72 72 61 79 20 65 6e  the new array en
193f0 74 72 79 20 69 6e 20 74 68 69 73 20 63 61 73 65  try in this case
19400 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
19410 65 2c 20 69 66 20 74 68 65 20 72 65 61 6c 6c 6f  e, if the reallo
19420 63 28 29 20 66 61 69 6c 73 2c 20 2a 70 49 64 78  c() fails, *pIdx
19430 20 69 73 20 73 65 74 20 74 6f 20 2d 31 2c 20 2a   is set to -1, *
19440 70 6e 45 6e 74 72 79 20 72 65 6d 61 69 6e 73 0a  pnEntry remains.
19450 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ** unchanged and
19460 20 61 20 63 6f 70 79 20 6f 66 20 70 41 72 72 61   a copy of pArra
19470 79 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 76  y returned..*/.v
19480 6f 69 64 20 2a 73 71 6c 69 74 65 33 41 72 72 61  oid *sqlite3Arra
19490 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c  yAllocate(.  sql
194a0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 2f  ite3 *db,      /
194b0 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  * Connection to 
194c0 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63  notify of malloc
194d0 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76   failures */.  v
194e0 6f 69 64 20 2a 70 41 72 72 61 79 2c 20 20 20 20  oid *pArray,    
194f0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 62 6a   /* Array of obj
19500 65 63 74 73 2e 20 20 4d 69 67 68 74 20 62 65 20  ects.  Might be 
19510 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  reallocated */. 
19520 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20 20   int szEntry,   
19530 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61     /* Size of ea
19540 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  ch object in the
19550 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
19560 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a  *pnEntry,     /*
19570 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63   Number of objec
19580 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  ts currently in 
19590 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49  use */.  int *pI
195a0 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  dx         /* Wr
195b0 69 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66  ite the index of
195c0 20 61 20 6e 65 77 20 73 6c 6f 74 20 68 65 72 65   a new slot here
195d0 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
195e0 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 2a 70 6e 45  ;.  int n = *pnE
195f0 6e 74 72 79 3b 0a 20 20 69 66 28 20 28 6e 20 26  ntry;.  if( (n &
19600 20 28 6e 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20   (n-1))==0 ){.  
19610 20 20 69 6e 74 20 73 7a 20 3d 20 28 6e 3d 3d 30    int sz = (n==0
19620 29 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a 20 20 20  ) ? 1 : 2*n;.   
19630 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 73 71   void *pNew = sq
19640 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
19650 62 2c 20 70 41 72 72 61 79 2c 20 73 7a 2a 73 7a  b, pArray, sz*sz
19660 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66 28 20  Entry);.    if( 
19670 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
19680 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20   *pIdx = -1;.   
19690 20 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79     return pArray
196a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72 72  ;.    }.    pArr
196b0 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  ay = pNew;.  }. 
196c0 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 41 72 72   z = (char*)pArr
196d0 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b  ay;.  memset(&z[
196e0 6e 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c  n * szEntry], 0,
196f0 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49   szEntry);.  *pI
19700 64 78 20 3d 20 6e 3b 0a 20 20 2b 2b 2a 70 6e 45  dx = n;.  ++*pnE
19710 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e 20 70  ntry;.  return p
19720 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Array;.}../*.** 
19730 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65  Append a new ele
19740 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65  ment to the give
19750 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74  n IdList.  Creat
19760 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69  e a new IdList i
19770 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a  f.** need be..**
19780 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74  .** A new IdList
19790 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
197a0 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
197b0 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69  ) fails..*/.IdLi
197c0 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73  st *sqlite3IdLis
197d0 74 41 70 70 65 6e 64 28 73 71 6c 69 74 65 33 20  tAppend(sqlite3 
197e0 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69  *db, IdList *pLi
197f0 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
19800 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  n){.  int i;.  i
19810 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
19820 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
19830 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
19840 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74  b, sizeof(IdList
19850 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
19860 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
19870 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61  ;.  }.  pList->a
19880 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
19890 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 64  llocate(.      d
198a0 62 2c 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  b,.      pList->
198b0 61 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  a,.      sizeof(
198c0 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20  pList->a[0]),.  
198d0 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c      &pList->nId,
198e0 0a 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20  .      &i.  );. 
198f0 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
19900 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
19910 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
19920 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
19930 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  }.  pList->a[i].
19940 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
19950 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
19960 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75   pToken);.  retu
19970 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
19980 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c  ** Delete an IdL
19990 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
199a0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
199b0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64  (sqlite3 *db, Id
199c0 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
199d0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
199e0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
199f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
19a00 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
19a10 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
19a20 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  (db, pList->a[i]
19a30 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  .zName);.  }.  s
19a40 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
19a50 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71   pList->a);.  sq
19a60 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
19a70 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
19a80 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
19a90 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68  x in pList of th
19aa0 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d  e identifier nam
19ab0 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20  ed zId.  Return 
19ac0 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75  -1.** if not fou
19ad0 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
19ae0 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64  e3IdListIndex(Id
19af0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e  List *pList, con
19b00 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
19b10 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
19b20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
19b30 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  n -1;.  for(i=0;
19b40 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
19b50 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
19b60 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73  ite3StrICmp(pLis
19b70 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  t->a[i].zName, z
19b80 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
19b90 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
19ba0 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n -1;.}../*.** E
19bb0 78 70 61 6e 64 20 74 68 65 20 73 70 61 63 65 20  xpand the space 
19bc0 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
19bd0 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 20  e given SrcList 
19be0 6f 62 6a 65 63 74 20 62 79 0a 2a 2a 20 63 72 65  object by.** cre
19bf0 61 74 69 6e 67 20 6e 45 78 74 72 61 20 6e 65 77  ating nExtra new
19c00 20 73 6c 6f 74 73 20 62 65 67 69 6e 6e 69 6e 67   slots beginning
19c10 20 61 74 20 69 53 74 61 72 74 2e 20 20 69 53 74   at iStart.  iSt
19c20 61 72 74 20 69 73 20 7a 65 72 6f 20 62 61 73 65  art is zero base
19c30 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74 73 20  d..** New slots 
19c40 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a  are zeroed..**.*
19c50 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73  * For example, s
19c60 75 70 70 6f 73 65 20 61 20 53 72 63 4c 69 73 74  uppose a SrcList
19c70 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f 6e 74 61   initially conta
19c80 69 6e 73 20 74 77 6f 20 65 6e 74 72 69 65 73 3a  ins two entries:
19c90 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70 70 65   A,B..** To appe
19ca0 6e 64 20 33 20 6e 65 77 20 65 6e 74 72 69 65 73  nd 3 new entries
19cb0 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 2c 20 64   onto the end, d
19cc0 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  o this:.**.**   
19cd0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
19ce0 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 6c  nlarge(db, pSrcl
19cf0 69 73 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a  ist, 3, 2);.**.*
19d00 2a 20 41 66 74 65 72 20 74 68 65 20 63 61 6c 6c  * After the call
19d10 20 61 62 6f 76 65 20 69 74 20 77 6f 75 6c 64 20   above it would 
19d20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c 20 42 2c 20  contain:  A, B, 
19d30 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a  nil, nil, nil..*
19d40 2a 20 49 66 20 74 68 65 20 69 53 74 61 72 74 20  * If the iStart 
19d50 61 72 67 75 6d 65 6e 74 20 68 61 64 20 62 65 65  argument had bee
19d60 6e 20 31 20 69 6e 73 74 65 61 64 20 6f 66 20 32  n 1 instead of 2
19d70 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
19d80 74 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20  t.** would have 
19d90 62 65 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e  been:  A, nil, n
19da0 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20 54 6f 20  il, nil, B.  To 
19db0 70 72 65 70 65 6e 64 20 74 68 65 20 6e 65 77 20  prepend the new 
19dc0 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65 20 69 53  slots,.** the iS
19dd0 74 61 72 74 20 76 61 6c 75 65 20 77 6f 75 6c 64  tart value would
19de0 20 62 65 20 30 2e 20 20 54 68 65 20 72 65 73 75   be 0.  The resu
19df0 6c 74 20 74 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a  lt then would.**
19e00 20 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e   be: nil, nil, n
19e10 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20  il, A, B..**.** 
19e20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
19e30 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 74 68 65  cation fails the
19e40 20 53 72 63 4c 69 73 74 20 69 73 20 75 6e 63 68   SrcList is unch
19e50 61 6e 67 65 64 2e 20 20 54 68 65 0a 2a 2a 20 64  anged.  The.** d
19e60 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
19e70 66 6c 61 67 20 77 69 6c 6c 20 62 65 20 73 65 74  flag will be set
19e80 20 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a 53 72 63   to true..*/.Src
19e90 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
19ea0 4c 69 73 74 45 6e 6c 61 72 67 65 28 0a 20 20 73  ListEnlarge(.  s
19eb0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
19ec0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
19ed0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69  nnection to noti
19ee0 66 79 20 6f 66 20 4f 4f 4d 20 65 72 72 6f 72 73  fy of OOM errors
19ef0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
19f00 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  Src,     /* The 
19f10 53 72 63 4c 69 73 74 20 74 6f 20 62 65 20 65 6e  SrcList to be en
19f20 6c 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20  larged */.  int 
19f30 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 2f  nExtra,        /
19f40 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 77 20  * Number of new 
19f50 73 6c 6f 74 73 20 74 6f 20 61 64 64 20 74 6f 20  slots to add to 
19f60 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69  pSrc->a[] */.  i
19f70 6e 74 20 69 53 74 61 72 74 20 20 20 20 20 20 20  nt iStart       
19f80 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 53    /* Index in pS
19f90 72 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72 73 74  rc->a[] of first
19fa0 20 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a   new slot */.){.
19fb0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53    int i;..  /* S
19fc0 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
19fd0 6e 20 63 61 6c 6c 69 6e 67 20 70 61 72 61 6d 65  n calling parame
19fe0 74 65 72 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  ters */.  assert
19ff0 28 20 69 53 74 61 72 74 3e 3d 30 20 29 3b 0a 20  ( iStart>=0 );. 
1a000 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e   assert( nExtra>
1a010 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
1a020 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 61 73 73  pSrc!=0 );.  ass
1a030 65 72 74 28 20 69 53 74 61 72 74 3c 3d 70 53 72  ert( iStart<=pSr
1a040 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20 20 2f 2a  c->nSrc );..  /*
1a050 20 41 6c 6c 6f 63 61 74 65 20 61 64 64 69 74 69   Allocate additi
1a060 6f 6e 61 6c 20 73 70 61 63 65 20 69 66 20 6e 65  onal space if ne
1a070 65 64 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 53  eded */.  if( pS
1a080 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3e  rc->nSrc+nExtra>
1a090 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  pSrc->nAlloc ){.
1a0a0 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65      SrcList *pNe
1a0b0 77 3b 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f  w;.    int nAllo
1a0c0 63 20 3d 20 70 53 72 63 2d 3e 6e 53 72 63 2b 6e  c = pSrc->nSrc+n
1a0d0 45 78 74 72 61 3b 0a 20 20 20 20 69 6e 74 20 6e  Extra;.    int n
1a0e0 47 6f 74 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  Got;.    pNew = 
1a0f0 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1a100 28 64 62 2c 20 70 53 72 63 2c 0a 20 20 20 20 20  (db, pSrc,.     
1a110 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
1a120 28 2a 70 53 72 63 29 20 2b 20 28 6e 41 6c 6c 6f  (*pSrc) + (nAllo
1a130 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 53 72 63  c-1)*sizeof(pSrc
1a140 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  ->a[0]) );.    i
1a150 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
1a160 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
1a170 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1a180 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 53 72        return pSr
1a190 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  c;.    }.    pSr
1a1a0 63 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 6e 47  c = pNew;.    nG
1a1b0 6f 74 20 3d 20 28 73 71 6c 69 74 65 33 44 62 4d  ot = (sqlite3DbM
1a1c0 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e  allocSize(db, pN
1a1d0 65 77 29 20 2d 20 73 69 7a 65 6f 66 28 2a 70 53  ew) - sizeof(*pS
1a1e0 72 63 29 29 2f 73 69 7a 65 6f 66 28 70 53 72 63  rc))/sizeof(pSrc
1a1f0 2d 3e 61 5b 30 5d 29 2b 31 3b 0a 20 20 20 20 70  ->a[0])+1;.    p
1a200 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75  Src->nAlloc = (u
1a210 31 36 29 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20 20  16)nGot;.  }..  
1a220 2f 2a 20 4d 6f 76 65 20 65 78 69 73 74 69 6e 67  /* Move existing
1a230 20 73 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d 65   slots that come
1a240 20 61 66 74 65 72 20 74 68 65 20 6e 65 77 6c 79   after the newly
1a250 20 69 6e 73 65 72 74 65 64 20 73 6c 6f 74 73 0a   inserted slots.
1a260 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20    ** out of the 
1a270 77 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70  way */.  for(i=p
1a280 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d  Src->nSrc-1; i>=
1a290 69 53 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20 20  iStart; i--){.  
1a2a0 20 20 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78 74    pSrc->a[i+nExt
1a2b0 72 61 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d  ra] = pSrc->a[i]
1a2c0 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e 53  ;.  }.  pSrc->nS
1a2d0 72 63 20 2b 3d 20 28 69 31 36 29 6e 45 78 74 72  rc += (i16)nExtr
1a2e0 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68  a;..  /* Zero th
1a2f0 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65  e newly allocate
1a300 64 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d  d slots */.  mem
1a310 73 65 74 28 26 70 53 72 63 2d 3e 61 5b 69 53 74  set(&pSrc->a[iSt
1a320 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  art], 0, sizeof(
1a330 70 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74  pSrc->a[0])*nExt
1a340 72 61 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53 74  ra);.  for(i=iSt
1a350 61 72 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e 45  art; i<iStart+nE
1a360 78 74 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  xtra; i++){.    
1a370 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  pSrc->a[i].iCurs
1a380 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  or = -1;.  }..  
1a390 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
1a3a0 74 65 72 20 74 6f 20 74 68 65 20 65 6e 6c 61 72  ter to the enlar
1a3b0 67 65 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20  ged SrcList */. 
1a3c0 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a   return pSrc;.}.
1a3d0 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
1a3e0 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20   new table name 
1a3f0 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72 63  to the given Src
1a400 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20  List.  Create a 
1a410 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a  new SrcList if.*
1a420 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65  * need be.  A ne
1a430 77 20 65 6e 74 72 79 20 69 73 20 63 72 65 61 74  w entry is creat
1a440 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ed in the SrcLis
1a450 74 20 65 76 65 6e 20 69 66 20 70 54 61 62 6c 65  t even if pTable
1a460 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
1a470 41 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74  A SrcList is ret
1a480 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
1a490 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 4f  f there is an OO
1a4a0 4d 20 65 72 72 6f 72 2e 20 20 54 68 65 20 72 65  M error.  The re
1a4b0 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69 73  turned.** SrcLis
1a4c0 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 73  t might be the s
1a4d0 61 6d 65 20 61 73 20 74 68 65 20 53 72 63 4c 69  ame as the SrcLi
1a4e0 73 74 20 74 68 61 74 20 77 61 73 20 69 6e 70 75  st that was inpu
1a4f0 74 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65  t or it might be
1a500 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20 20  .** a new one.  
1a510 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
1a520 64 6f 65 73 20 6f 63 63 75 72 73 2c 20 74 68 65  does occurs, the
1a530 6e 20 74 68 65 20 70 72 69 6f 72 20 76 61 6c 75  n the prior valu
1a540 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74 68  e of pList.** th
1a550 61 74 20 69 73 20 69 6e 70 75 74 20 74 6f 20 74  at is input to t
1a560 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1a570 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72 65  utomatically fre
1a580 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61  ed..**.** If pDa
1a590 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75  tabase is not nu
1a5a0 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ll, it means tha
1a5b0 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  t the table has 
1a5c0 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64  an optional.** d
1a5d0 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65  atabase name pre
1a5e0 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a  fix.  Like this:
1a5f0 20 20 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c    "database.tabl
1a600 65 22 2e 20 20 54 68 65 20 70 44 61 74 61 62 61  e".  The pDataba
1a610 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  se.** points to 
1a620 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  the table name a
1a630 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f  nd the pTable po
1a640 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74 61  ints to the data
1a650 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68  base name..** Th
1a660 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e  e SrcList.a[].zN
1a670 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c  ame field is fil
1a680 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  led with the tab
1a690 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69  le name which mi
1a6a0 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d  ght.** come from
1a6b0 20 70 54 61 62 6c 65 20 28 69 66 20 70 44 61 74   pTable (if pDat
1a6c0 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f  abase is NULL) o
1a6d0 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65  r from pDatabase
1a6e0 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61  .  .** SrcList.a
1a6f0 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20  [].zDatabase is 
1a700 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  filled with the 
1a710 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72  database name fr
1a720 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72  om pTable,.** or
1a730 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f   with NULL if no
1a740 20 64 61 74 61 62 61 73 65 20 69 73 20 73 70 65   database is spe
1a750 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e  cified..**.** In
1a760 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
1a770 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a   call like this:
1a780 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  .**.**         s
1a790 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
1a7a0 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a  end(D,A,B,0);.**
1a7b0 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20  .** Then B is a 
1a7c0 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74  table name and t
1a7d0 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
1a7e0 20 69 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e   is unspecified.
1a7f0 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c    If called.** l
1a800 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1a810 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
1a820 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41  rcListAppend(D,A
1a830 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,C);.**.** The
1a840 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c 65  n C is the table
1a850 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74   name and B is t
1a860 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
1a870 2e 20 20 49 66 20 43 20 69 73 20 64 65 66 69 6e  .  If C is defin
1a880 65 64 0a 2a 2a 20 74 68 65 6e 20 73 6f 20 69 73  ed.** then so is
1a890 20 42 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f   B.  In other wo
1a8a0 72 64 73 2c 20 77 65 20 6e 65 76 65 72 20 68 61  rds, we never ha
1a8b0 76 65 20 61 20 63 61 73 65 20 77 68 65 72 65 3a  ve a case where:
1a8c0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  .**.**         s
1a8d0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
1a8e0 65 6e 64 28 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a  end(D,A,0,C);.**
1a8f0 0a 2a 2a 20 42 6f 74 68 20 70 54 61 62 6c 65 20  .** Both pTable 
1a900 61 6e 64 20 70 44 61 74 61 62 61 73 65 20 61 72  and pDatabase ar
1a910 65 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20  e assumed to be 
1a920 71 75 6f 74 65 64 2e 20 20 54 68 65 79 20 61 72  quoted.  They ar
1a930 65 20 64 65 71 75 6f 74 65 64 0a 2a 2a 20 62 65  e dequoted.** be
1a940 66 6f 72 65 20 62 65 69 6e 67 20 61 64 64 65 64  fore being added
1a950 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74 2e   to the SrcList.
1a960 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  .*/.SrcList *sql
1a970 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
1a980 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  d(.  sqlite3 *db
1a990 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  ,        /* Conn
1a9a0 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79  ection to notify
1a9b0 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   of malloc failu
1a9c0 72 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  res */.  SrcList
1a9d0 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20   *pList,     /* 
1a9e0 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20 53  Append to this S
1a9f0 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65  rcList. NULL cre
1aa00 61 74 65 73 20 61 20 6e 65 77 20 53 72 63 4c 69  ates a new SrcLi
1aa10 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  st */.  Token *p
1aa20 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54  Table,      /* T
1aa30 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 2a  able to append *
1aa40 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61  /.  Token *pData
1aa50 62 61 73 65 20 20 20 20 2f 2a 20 44 61 74 61 62  base    /* Datab
1aa60 61 73 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ase of the table
1aa70 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
1aa80 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1aa90 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  tem;.  assert( p
1aaa0 44 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20 70  Database==0 || p
1aab0 54 61 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a 20  Table!=0 );  /* 
1aac0 43 61 6e 6e 6f 74 20 68 61 76 65 20 43 20 77 69  Cannot have C wi
1aad0 74 68 6f 75 74 20 42 20 2a 2f 0a 20 20 69 66 28  thout B */.  if(
1aae0 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
1aaf0 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
1ab00 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
1ab10 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29   sizeof(SrcList)
1ab20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
1ab30 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
1ab40 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
1ab50 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 4c  oc = 1;.  }.  pL
1ab60 69 73 74 20 3d 20 73 71 6c 69 74 65 33 53 72 63  ist = sqlite3Src
1ab70 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20  ListEnlarge(db, 
1ab80 70 4c 69 73 74 2c 20 31 2c 20 70 4c 69 73 74 2d  pList, 1, pList-
1ab90 3e 6e 53 72 63 29 3b 0a 20 20 69 66 28 20 64 62  >nSrc);.  if( db
1aba0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1abb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63  {.    sqlite3Src
1abc0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1abd0 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72  List);.    retur
1abe0 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  n 0;.  }.  pItem
1abf0 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
1ac00 73 74 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69  st->nSrc-1];.  i
1ac10 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20  f( pDatabase && 
1ac20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20  pDatabase->z==0 
1ac30 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65  ){.    pDatabase
1ac40 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
1ac50 70 44 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20  pDatabase ){.   
1ac60 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20   Token *pTemp = 
1ac70 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20 70  pDatabase;.    p
1ac80 44 61 74 61 62 61 73 65 20 3d 20 70 54 61 62 6c  Database = pTabl
1ac90 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20  e;.    pTable = 
1aca0 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74  pTemp;.  }.  pIt
1acb0 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
1acc0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1acd0 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
1ace0 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
1acf0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1ad00 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44 61 74  omToken(db, pDat
1ad10 61 62 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e  abase);.  return
1ad20 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
1ad30 20 41 73 73 69 67 6e 20 56 64 62 65 43 75 72 73   Assign VdbeCurs
1ad40 6f 72 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 73  or index numbers
1ad50 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69   to all tables i
1ad60 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76  n a SrcList.*/.v
1ad70 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
1ad80 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
1ad90 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
1ada0 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
1adb0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
1adc0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1add0 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28  pItem;.  assert(
1ade0 70 4c 69 73 74 20 7c 7c 20 70 50 61 72 73 65 2d  pList || pParse-
1adf0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1ae00 64 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  d );.  if( pList
1ae10 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c   ){.    for(i=0,
1ae20 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
1ae30 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20   i<pList->nSrc; 
1ae40 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
1ae50 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1ae60 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65  iCursor>=0 ) bre
1ae70 61 6b 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ak;.      pItem-
1ae80 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  >iCursor = pPars
1ae90 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
1aea0 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
1aeb0 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
1aec0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
1aed0 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
1aee0 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  e, pItem->pSelec
1aef0 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20  t->pSrc);.      
1af00 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
1af10 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
1af20 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e  ntire SrcList in
1af30 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20  cluding all its 
1af40 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  substructure..*/
1af50 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
1af60 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74  ListDelete(sqlit
1af70 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20  e3 *db, SrcList 
1af80 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
1af90 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
1afa0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1afb0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1afc0 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70   return;.  for(p
1afd0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
1afe0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72  =0; i<pList->nSr
1aff0 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
1b000 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
1b010 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
1b020 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73  Database);.    s
1b030 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1b040 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
1b050 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1b060 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c  e(db, pItem->zAl
1b070 69 61 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ias);.    sqlite
1b080 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
1b090 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20  m->zIndex);.    
1b0a0 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
1b0b0 6c 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 54  le(db, pItem->pT
1b0c0 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ab);.    sqlite3
1b0d0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
1b0e0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29   pItem->pSelect)
1b0f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1b100 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  rDelete(db, pIte
1b110 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c  m->pOn);.    sql
1b120 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
1b130 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69  (db, pItem->pUsi
1b140 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ng);.  }.  sqlit
1b150 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69  e3DbFree(db, pLi
1b160 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  st);.}../*.** Th
1b170 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1b180 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
1b190 65 72 20 74 6f 20 61 64 64 20 61 20 6e 65 77 20  er to add a new 
1b1a0 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65  term to the.** e
1b1b0 6e 64 20 6f 66 20 61 20 67 72 6f 77 69 6e 67 20  nd of a growing 
1b1c0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68  FROM clause.  Th
1b1d0 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20  e "p" parameter 
1b1e0 69 73 20 74 68 65 20 70 61 72 74 20 6f 66 0a 2a  is the part of.*
1b1f0 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
1b200 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61  e that has alrea
1b210 64 79 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63  dy been construc
1b220 74 65 64 2e 20 20 22 70 22 20 69 73 20 4e 55 4c  ted.  "p" is NUL
1b230 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20  L.** if this is 
1b240 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f  the first term o
1b250 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
1b260 65 2e 20 20 70 54 61 62 6c 65 20 61 6e 64 20 70  e.  pTable and p
1b270 44 61 74 61 62 61 73 65 0a 2a 2a 20 61 72 65 20  Database.** are 
1b280 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
1b290 74 61 62 6c 65 20 61 6e 64 20 64 61 74 61 62 61  table and databa
1b2a0 73 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20  se named in the 
1b2b0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
1b2c0 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 69  ..** pDatabase i
1b2d0 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 64 61  s NULL if the da
1b2e0 74 61 62 61 73 65 20 6e 61 6d 65 20 71 75 61 6c  tabase name qual
1b2f0 69 66 69 65 72 20 69 73 20 6d 69 73 73 69 6e 67  ifier is missing
1b300 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20   - the.** usual 
1b310 63 61 73 65 2e 20 20 49 66 20 74 68 65 20 74 65  case.  If the te
1b320 72 6d 20 68 61 73 20 61 20 61 6c 69 61 73 2c 20  rm has a alias, 
1b330 74 68 65 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e  then pAlias poin
1b340 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69  ts to the.** ali
1b350 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68  as token.  If th
1b360 65 20 74 65 72 6d 20 69 73 20 61 20 73 75 62 71  e term is a subq
1b370 75 65 72 79 2c 20 74 68 65 6e 20 70 53 75 62 71  uery, then pSubq
1b380 75 65 72 79 20 69 73 20 74 68 65 0a 2a 2a 20 53  uery is the.** S
1b390 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1b3a0 74 68 61 74 20 74 68 65 20 73 75 62 71 75 65 72  that the subquer
1b3b0 79 20 65 6e 63 6f 64 65 73 2e 20 20 54 68 65 20  y encodes.  The 
1b3c0 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44  pTable and.** pD
1b3d0 61 74 61 62 61 73 65 20 70 61 72 61 6d 65 74 65  atabase paramete
1b3e0 72 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20  rs are NULL for 
1b3f0 73 75 62 71 75 65 72 69 65 73 2e 20 20 54 68 65  subqueries.  The
1b400 20 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a   pOn and pUsing.
1b410 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  ** parameters ar
1b420 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
1b430 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e   the ON and USIN
1b440 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  G clauses..**.**
1b450 20 52 65 74 75 72 6e 20 61 20 6e 65 77 20 53 72   Return a new Sr
1b460 63 4c 69 73 74 20 77 68 69 63 68 20 65 6e 63 6f  cList which enco
1b470 64 65 73 20 69 73 20 74 68 65 20 46 52 4f 4d 20  des is the FROM 
1b480 77 69 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20  with the new.** 
1b490 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53  term added..*/.S
1b4a0 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
1b4b0 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d  rcListAppendFrom
1b4c0 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Term(.  Parse *p
1b4d0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
1b4e0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1b4f0 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
1b500 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1b510 2f 2a 20 54 68 65 20 6c 65 66 74 20 70 61 72 74  /* The left part
1b520 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1b530 75 73 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e  use already seen
1b540 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
1b550 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
1b560 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
1b570 6c 65 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65  le to add to the
1b580 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
1b590 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61    Token *pDataba
1b5a0 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  se,       /* Nam
1b5b0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1b5c0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61  e containing pTa
1b5d0 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ble */.  Token *
1b5e0 70 41 6c 69 61 73 2c 20 20 20 20 20 20 20 20 20  pAlias,         
1b5f0 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61   /* The right-ha
1b600 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 41  nd side of the A
1b610 53 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  S subexpression 
1b620 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  */.  Select *pSu
1b630 62 71 75 65 72 79 2c 20 20 20 20 20 20 2f 2a 20  bquery,      /* 
1b640 41 20 73 75 62 71 75 65 72 79 20 75 73 65 64 20  A subquery used 
1b650 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61  in place of a ta
1b660 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78  ble name */.  Ex
1b670 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20  pr *pOn,        
1b680 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20        /* The ON 
1b690 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e  clause of a join
1b6a0 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 55   */.  IdList *pU
1b6b0 73 69 6e 67 20 20 20 20 20 20 20 20 20 20 2f 2a  sing          /*
1b6c0 20 54 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   The USING claus
1b6d0 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29  e of a join */.)
1b6e0 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  {.  struct SrcLi
1b6f0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1b700 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1b710 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
1b720 28 20 21 70 20 26 26 20 28 70 4f 6e 20 7c 7c 20  ( !p && (pOn || 
1b730 70 55 73 69 6e 67 29 20 29 7b 0a 20 20 20 20 73  pUsing) ){.    s
1b740 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1b750 50 61 72 73 65 2c 20 22 61 20 4a 4f 49 4e 20 63  Parse, "a JOIN c
1b760 6c 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65  lause is require
1b770 64 20 62 65 66 6f 72 65 20 25 73 22 2c 20 0a 20  d before %s", . 
1b780 20 20 20 20 20 28 70 4f 6e 20 3f 20 22 4f 4e 22       (pOn ? "ON"
1b790 20 3a 20 22 55 53 49 4e 47 22 29 0a 20 20 20 20   : "USING").    
1b7a0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65  );.    goto appe
1b7b0 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20  nd_from_error;. 
1b7c0 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33   }.  p = sqlite3
1b7d0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62  SrcListAppend(db
1b7e0 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20 70 44 61  , p, pTable, pDa
1b7f0 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  tabase);.  if( p
1b800 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e  ==0 || NEVER(p->
1b810 6e 53 72 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nSrc==0) ){.    
1b820 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d  goto append_from
1b830 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 49  _error;.  }.  pI
1b840 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e  tem = &p->a[p->n
1b850 53 72 63 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74  Src-1];.  assert
1b860 28 20 70 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20  ( pAlias!=0 );. 
1b870 20 69 66 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29   if( pAlias->n )
1b880 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c  {.    pItem->zAl
1b890 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ias = sqlite3Nam
1b8a0 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
1b8b0 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49  Alias);.  }.  pI
1b8c0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70  tem->pSelect = p
1b8d0 53 75 62 71 75 65 72 79 3b 0a 20 20 70 49 74 65  Subquery;.  pIte
1b8e0 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20  m->pOn = pOn;.  
1b8f0 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20  pItem->pUsing = 
1b900 70 55 73 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e  pUsing;.  return
1b910 20 70 3b 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f   p;.. append_fro
1b920 6d 5f 65 72 72 6f 72 3a 0a 20 20 61 73 73 65 72  m_error:.  asser
1b930 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c  t( p==0 );.  sql
1b940 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1b950 62 2c 20 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74  b, pOn);.  sqlit
1b960 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
1b970 62 2c 20 70 55 73 69 6e 67 29 3b 0a 20 20 73 71  b, pUsing);.  sq
1b980 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
1b990 65 28 64 62 2c 20 70 53 75 62 71 75 65 72 79 29  e(db, pSubquery)
1b9a0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1b9b0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e  ./*.** Add an IN
1b9c0 44 45 58 45 44 20 42 59 20 6f 72 20 4e 4f 54 20  DEXED BY or NOT 
1b9d0 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 74  INDEXED clause t
1b9e0 6f 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  o the most recen
1b9f0 74 6c 79 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c  tly added .** el
1ba00 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 73 6f 75  ement of the sou
1ba10 72 63 65 2d 6c 69 73 74 20 70 61 73 73 65 64 20  rce-list passed 
1ba20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
1ba30 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  gument..*/.void 
1ba40 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e  sqlite3SrcListIn
1ba50 64 65 78 65 64 42 79 28 50 61 72 73 65 20 2a 70  dexedBy(Parse *p
1ba60 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
1ba70 70 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78  p, Token *pIndex
1ba80 65 64 42 79 29 7b 0a 20 20 61 73 73 65 72 74 28  edBy){.  assert(
1ba90 20 70 49 6e 64 65 78 65 64 42 79 21 3d 30 20 29   pIndexedBy!=0 )
1baa0 3b 0a 20 20 69 66 28 20 70 20 26 26 20 41 4c 57  ;.  if( p && ALW
1bab0 41 59 53 28 70 2d 3e 6e 53 72 63 3e 30 29 20 29  AYS(p->nSrc>0) )
1bac0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
1bad0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1bae0 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63   = &p->a[p->nSrc
1baf0 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
1bb00 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78   pItem->notIndex
1bb10 65 64 3d 3d 30 20 26 26 20 70 49 74 65 6d 2d 3e  ed==0 && pItem->
1bb20 7a 49 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20  zIndex==0 );.   
1bb30 20 69 66 28 20 70 49 6e 64 65 78 65 64 42 79 2d   if( pIndexedBy-
1bb40 3e 6e 3d 3d 31 20 26 26 20 21 70 49 6e 64 65 78  >n==1 && !pIndex
1bb50 65 64 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20 20  edBy->z ){.     
1bb60 20 2f 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45 58   /* A "NOT INDEX
1bb70 45 44 22 20 63 6c 61 75 73 65 20 77 61 73 20 73  ED" clause was s
1bb80 75 70 70 6c 69 65 64 2e 20 53 65 65 20 70 61 72  upplied. See par
1bb90 73 65 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20 63  se.y .      ** c
1bba0 6f 6e 73 74 72 75 63 74 20 22 69 6e 64 65 78 65  onstruct "indexe
1bbb0 64 5f 6f 70 74 22 20 66 6f 72 20 64 65 74 61 69  d_opt" for detai
1bbc0 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 74  ls. */.      pIt
1bbd0 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 3d  em->notIndexed =
1bbe0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
1bbf0 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a 49 6e 64       pItem->zInd
1bc00 65 78 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ex = sqlite3Name
1bc10 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
1bc20 2d 3e 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79  ->db, pIndexedBy
1bc30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
1bc40 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64  /*.** When build
1bc50 69 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c  ing up a FROM cl
1bc60 61 75 73 65 20 69 6e 20 74 68 65 20 70 61 72 73  ause in the pars
1bc70 65 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65  er, the join ope
1bc80 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74  rator.** is init
1bc90 69 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74  ially attached t
1bca0 6f 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61  o the left opera
1bcb0 6e 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64  nd.  But the cod
1bcc0 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65  e generator.** e
1bcd0 78 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20  xpects the join 
1bce0 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f  operator to be o
1bcf0 6e 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  n the right oper
1bd00 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  and.  This routi
1bd10 6e 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c  ne.** Shifts all
1bd20 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20   join operators 
1bd30 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
1bd40 68 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65  ht for an entire
1bd50 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e   FROM.** clause.
1bd60 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20  .**.** Example: 
1bd70 53 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e  Suppose the join
1bd80 20 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a   is like this:.*
1bd90 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41  *.**           A
1bda0 20 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a   natural cross j
1bdb0 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oin B.**.** The 
1bdc0 6f 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74  operator is "nat
1bdd0 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22  ural cross join"
1bde0 2e 20 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f  .  The A and B o
1bdf0 70 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72  perands are stor
1be00 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d  ed.** in p->a[0]
1be10 20 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65   and p->a[1], re
1be20 73 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65  spectively.  The
1be30 20 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c   parser initiall
1be40 79 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20  y stores the.** 
1be50 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e  operator with A.
1be60 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
1be70 68 69 66 74 73 20 74 68 61 74 20 6f 70 65 72 61  hifts that opera
1be80 74 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a  tor over to B..*
1be90 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
1bea0 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79  cListShiftJoinTy
1beb0 70 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a  pe(SrcList *p){.
1bec0 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
1bed0 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74  nt i;.    assert
1bee0 28 20 70 2d 3e 61 20 7c 7c 20 70 2d 3e 6e 53 72  ( p->a || p->nSr
1bef0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  c==0 );.    for(
1bf00 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30  i=p->nSrc-1; i>0
1bf10 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d  ; i--){.      p-
1bf20 3e 61 5b 69 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d  >a[i].jointype =
1bf30 20 70 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74   p->a[i-1].joint
1bf40 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ype;.    }.    p
1bf50 2d 3e 61 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20  ->a[0].jointype 
1bf60 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
1bf70 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61  * Begin a transa
1bf80 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
1bf90 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61  lite3BeginTransa
1bfa0 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
1bfb0 72 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a  rse, int type){.
1bfc0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1bfd0 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
1bfe0 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  i;..  assert( pP
1bff0 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20  arse!=0 );.  db 
1c000 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1c010 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
1c020 0a 2f 2a 20 20 69 66 28 20 64 62 2d 3e 61 44 62  ./*  if( db->aDb
1c030 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74  [0].pBt==0 ) ret
1c040 75 72 6e 3b 20 2a 2f 0a 20 20 69 66 28 20 73 71  urn; */.  if( sq
1c050 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1c060 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
1c070 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49  ANSACTION, "BEGI
1c080 4e 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20  N", 0, 0) ){.   
1c090 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76   return;.  }.  v
1c0a0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1c0b0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1c0c0 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !v ) return;.  
1c0d0 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46  if( type!=TK_DEF
1c0e0 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72  ERRED ){.    for
1c0f0 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
1c100 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
1c110 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1c120 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  , OP_Transaction
1c130 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45  , i, (type==TK_E
1c140 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20  XCLUSIVE)+1);.  
1c150 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
1c160 73 65 73 42 74 72 65 65 28 76 2c 20 69 29 3b 0a  sesBtree(v, i);.
1c170 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1c180 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1c190 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
1c1a0 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0, 0);.}../*.** 
1c1b0 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63  Commit a transac
1c1c0 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
1c1d0 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61  ite3CommitTransa
1c1e0 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
1c1f0 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  rse){.  Vdbe *v;
1c200 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
1c210 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  se!=0 );.  asser
1c220 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30  t( pParse->db!=0
1c230 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
1c240 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
1c250 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e, SQLITE_TRANSA
1c260 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c  CTION, "COMMIT",
1c270 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65   0, 0) ){.    re
1c280 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20  turn;.  }.  v = 
1c290 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1c2a0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
1c2b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1c2c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
1c2d0 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29  utoCommit, 1, 0)
1c2e0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
1c2f0 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ollback a transa
1c300 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
1c310 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61  lite3RollbackTra
1c320 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  nsaction(Parse *
1c330 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20  pParse){.  Vdbe 
1c340 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *v;..  assert( p
1c350 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73  Parse!=0 );.  as
1c360 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
1c370 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  !=0 );.  if( sql
1c380 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1c390 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
1c3a0 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42  NSACTION, "ROLLB
1c3b0 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20  ACK", 0, 0) ){. 
1c3c0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1c3d0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1c3e0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
1c3f0 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
1c400 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1c410 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
1c420 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  1, 1);.  }.}../*
1c430 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1c440 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  n is called by t
1c450 68 65 20 70 61 72 73 65 72 20 77 68 65 6e 20 69  he parser when i
1c460 74 20 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61  t parses a comma
1c470 6e 64 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a  nd to create,.**
1c480 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c   release or roll
1c490 62 61 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65  back an SQL save
1c4a0 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20  point. .*/.void 
1c4b0 73 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74  sqlite3Savepoint
1c4c0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1c4d0 69 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70  int op, Token *p
1c4e0 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
1c4f0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
1c500 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
1c510 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  se->db, pName);.
1c520 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
1c530 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
1c540 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1c550 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  se);.#ifndef SQL
1c560 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
1c570 5a 41 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69  ZATION.    stati
1c580 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63  c const char * c
1c590 6f 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42  onst az[] = { "B
1c5a0 45 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22  EGIN", "RELEASE"
1c5b0 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a  , "ROLLBACK" };.
1c5c0 20 20 20 20 61 73 73 65 72 74 28 20 21 53 41 56      assert( !SAV
1c5d0 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20  EPOINT_BEGIN && 
1c5e0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
1c5f0 45 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e  E==1 && SAVEPOIN
1c600 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b  T_ROLLBACK==2 );
1c610 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
1c620 21 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74  !v || sqlite3Aut
1c630 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1c640 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c  QLITE_SAVEPOINT,
1c650 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20   az[op], zName, 
1c660 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
1c670 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
1c680 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ->db, zName);.  
1c690 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
1c6a0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
1c6b0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61  eAddOp4(v, OP_Sa
1c6c0 76 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20  vepoint, op, 0, 
1c6d0 30 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e  0, zName, P4_DYN
1c6e0 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  AMIC);.  }.}../*
1c6f0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
1c700 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  e TEMP database 
1c710 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69  is open and avai
1c720 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20  lable for use.  
1c730 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75  Return.** the nu
1c740 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
1c750 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72   Leave any error
1c760 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65   messages in the
1c770 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
1c780 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1c790 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
1c7a0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
1c7b0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
1c7c0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1c7d0 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  if( db->aDb[1].p
1c7e0 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65  Bt==0 && !pParse
1c7f0 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
1c800 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72   int rc;.    Btr
1c810 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 73 74 61  ee *pBt;.    sta
1c820 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c  tic const int fl
1c830 61 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20  ags = .         
1c840 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1c850 44 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20  DWRITE |.       
1c860 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43     SQLITE_OPEN_C
1c870 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20  REATE |.        
1c880 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
1c890 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20  CLUSIVE |.      
1c8a0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1c8b0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a  DELETEONCLOSE |.
1c8c0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1c8d0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a  _OPEN_TEMP_DB;..
1c8e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c8f0 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56  BtreeOpen(db->pV
1c900 66 73 2c 20 30 2c 20 64 62 2c 20 26 70 42 74 2c  fs, 0, db, &pBt,
1c910 20 30 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20   0, flags);.    
1c920 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c930 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
1c940 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1c950 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70  e, "unable to op
1c960 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64  en a temporary d
1c970 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20  atabase ".      
1c980 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72    "file for stor
1c990 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ing temporary ta
1c9a0 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50  bles");.      pP
1c9b0 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
1c9c0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1c9d0 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62     }.    db->aDb
1c9e0 5b 31 5d 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20  [1].pBt = pBt;. 
1c9f0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
1ca00 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b  Db[1].pSchema );
1ca10 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
1ca20 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74  NOMEM==sqlite3Bt
1ca30 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  reeSetPageSize(p
1ca40 42 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67 65  Bt, db->nextPage
1ca50 73 69 7a 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a  size, -1, 0) ){.
1ca60 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
1ca70 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
1ca80 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1ca90 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1caa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
1cab0 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68  ate VDBE code th
1cac0 61 74 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74  at will verify t
1cad0 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
1cae0 20 61 6e 64 20 73 74 61 72 74 0a 2a 2a 20 61 20   and start.** a 
1caf0 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
1cb00 20 66 6f 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64   for all named d
1cb10 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a  atabase files..*
1cb20 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72  *.** It is impor
1cb30 74 61 6e 74 20 74 68 61 74 20 61 6c 6c 20 73 63  tant that all sc
1cb40 68 65 6d 61 20 63 6f 6f 6b 69 65 73 20 62 65 20  hema cookies be 
1cb50 76 65 72 69 66 69 65 64 20 61 6e 64 20 61 6c 6c  verified and all
1cb60 0a 2a 2a 20 72 65 61 64 20 74 72 61 6e 73 61 63  .** read transac
1cb70 74 69 6f 6e 73 20 62 65 20 73 74 61 72 74 65 64  tions be started
1cb80 20 62 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67   before anything
1cb90 20 65 6c 73 65 20 68 61 70 70 65 6e 73 20 69 6e   else happens in
1cba0 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 70 72 6f  .** the VDBE pro
1cbb0 67 72 61 6d 2e 20 20 42 75 74 20 74 68 69 73 20  gram.  But this 
1cbc0 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63  routine can be c
1cbd0 61 6c 6c 65 64 20 61 66 74 65 72 20 6d 75 63 68  alled after much
1cbe0 20 6f 74 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68   other.** code h
1cbf0 61 73 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65  as been generate
1cc00 64 2e 20 20 53 6f 20 68 65 72 65 20 69 73 20 77  d.  So here is w
1cc10 68 61 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a  hat we do:.**.**
1cc20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
1cc30 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1cc40 63 61 6c 6c 65 64 2c 20 77 65 20 63 6f 64 65 20  called, we code 
1cc50 61 6e 20 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a  an OP_Goto that.
1cc60 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20  ** will jump to 
1cc70 61 20 73 75 62 72 6f 75 74 69 6e 65 20 61 74 20  a subroutine at 
1cc80 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
1cc90 72 6f 67 72 61 6d 2e 20 20 54 68 65 6e 20 77 65  rogram.  Then we
1cca0 0a 2a 2a 20 72 65 63 6f 72 64 20 65 76 65 72 79  .** record every
1ccb0 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 6e   database that n
1ccc0 65 65 64 73 20 69 74 73 20 73 63 68 65 6d 61 20  eeds its schema 
1ccd0 76 65 72 69 66 69 65 64 20 69 6e 20 74 68 65 0a  verified in the.
1cce0 2a 2a 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  ** pParse->cooki
1ccf0 65 4d 61 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61  eMask field.  La
1cd00 74 65 72 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f  ter, after all o
1cd10 74 68 65 72 20 63 6f 64 65 20 68 61 73 20 62 65  ther code has be
1cd20 65 6e 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c  en.** generated,
1cd30 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
1cd40 74 68 61 74 20 64 6f 65 73 20 74 68 65 20 63 6f  that does the co
1cd50 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f  okie verificatio
1cd60 6e 73 20 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73  ns and.** starts
1cd70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1cd80 73 20 77 69 6c 6c 20 62 65 20 63 6f 64 65 64 20  s will be coded 
1cd90 61 6e 64 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20  and the OP_Goto 
1cda0 50 32 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c  P2 value.** will
1cdb0 20 62 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e   be made to poin
1cdc0 74 20 74 6f 20 74 68 61 74 20 73 75 62 72 6f 75  t to that subrou
1cdd0 74 69 6e 65 2e 20 20 54 68 65 20 67 65 6e 65 72  tine.  The gener
1cde0 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ation of the.** 
1cdf0 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74  cookie verificat
1ce00 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65 20 63  ion subroutine c
1ce10 6f 64 65 20 68 61 70 70 65 6e 73 20 69 6e 20 73  ode happens in s
1ce20 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69  qlite3FinishCodi
1ce30 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  ng()..**.** If i
1ce40 44 62 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 74  Db<0 then code t
1ce50 68 65 20 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20  he OP_Goto only 
1ce60 2d 20 64 6f 6e 27 74 20 73 65 74 20 66 6c 61 67  - don't set flag
1ce70 20 74 6f 20 76 65 72 69 66 79 20 74 68 65 0a 2a   to verify the.*
1ce80 2a 20 73 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20  * schema on any 
1ce90 64 61 74 61 62 61 73 65 73 2e 20 20 54 68 69 73  databases.  This
1cea0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
1ceb0 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f  position the OP_
1cec0 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e  Goto.** early in
1ced0 20 74 68 65 20 63 6f 64 65 2c 20 62 65 66 6f 72   the code, befor
1cee0 65 20 77 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79  e we know if any
1cef0 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 73   database tables
1cf00 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a   will be used..*
1cf10 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
1cf20 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50  deVerifySchema(P
1cf30 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1cf40 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20  t iDb){.  Parse 
1cf50 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
1cf60 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
1cf70 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 69 66  l(pParse);..  if
1cf80 28 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f  ( pToplevel->coo
1cf90 6b 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20  kieGoto==0 ){.  
1cfa0 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
1cfb0 74 65 33 47 65 74 56 64 62 65 28 70 54 6f 70 6c  te3GetVdbe(pTopl
1cfc0 65 76 65 6c 29 3b 0a 20 20 20 20 69 66 28 20 76  evel);.    if( v
1cfd0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  ==0 ) return;  /
1cfe0 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70  * This only happ
1cff0 65 6e 73 20 69 66 20 74 68 65 72 65 20 77 61 73  ens if there was
1d000 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 2a   a prior error *
1d010 2f 0a 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d  /.    pToplevel-
1d020 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71  >cookieGoto = sq
1d030 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d040 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30  v, OP_Goto, 0, 0
1d050 29 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  )+1;.  }.  if( i
1d060 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  Db>=0 ){.    sql
1d070 69 74 65 33 20 2a 64 62 20 3d 20 70 54 6f 70 6c  ite3 *db = pTopl
1d080 65 76 65 6c 2d 3e 64 62 3b 0a 20 20 20 20 79 44  evel->db;.    yD
1d090 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 0a 20 20 20  bMask mask;..   
1d0a0 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d   assert( iDb<db-
1d0b0 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65  >nDb );.    asse
1d0c0 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  rt( db->aDb[iDb]
1d0d0 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d  .pBt!=0 || iDb==
1d0e0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
1d0f0 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f   iDb<SQLITE_MAX_
1d100 41 54 54 41 43 48 45 44 2b 32 20 29 3b 0a 20 20  ATTACHED+2 );.  
1d110 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1d120 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
1d130 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
1d140 20 20 20 20 6d 61 73 6b 20 3d 20 28 28 79 44 62      mask = ((yDb
1d150 4d 61 73 6b 29 31 29 3c 3c 69 44 62 3b 0a 20 20  Mask)1)<<iDb;.  
1d160 20 20 69 66 28 20 28 70 54 6f 70 6c 65 76 65 6c    if( (pToplevel
1d170 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d  ->cookieMask & m
1d180 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
1d190 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b   pToplevel->cook
1d1a0 69 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  ieMask |= mask;.
1d1b0 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d        pToplevel-
1d1c0 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62  >cookieValue[iDb
1d1d0 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  ] = db->aDb[iDb]
1d1e0 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  .pSchema->schema
1d1f0 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 69  _cookie;.      i
1d200 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
1d210 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
1d220 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
1d230 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 54 6f  TempDatabase(pTo
1d240 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 7d  plevel);.      }
1d250 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1d260 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
1d270 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  zDb is NULL, the
1d280 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f  n call sqlite3Co
1d290 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 29  deVerifySchema()
1d2a0 20 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20 61 74   for each .** at
1d2b0 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 2e  tached database.
1d2c0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 76 6f   Otherwise, invo
1d2d0 6b 65 20 69 74 20 66 6f 72 20 74 68 65 20 64 61  ke it for the da
1d2e0 74 61 62 61 73 65 20 6e 61 6d 65 64 20 7a 44 62  tabase named zDb
1d2f0 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73   only..*/.void s
1d300 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1d310 4e 61 6d 65 64 53 63 68 65 6d 61 28 50 61 72 73  NamedSchema(Pars
1d320 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
1d330 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 73   char *zDb){.  s
1d340 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1d350 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
1d360 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
1d370 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
1d380 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
1d390 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
1d3a0 20 70 44 62 2d 3e 70 42 74 20 26 26 20 28 21 7a   pDb->pBt && (!z
1d3b0 44 62 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33  Db || 0==sqlite3
1d3c0 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 70 44 62  StrICmp(zDb, pDb
1d3d0 2d 3e 7a 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20  ->zName)) ){.   
1d3e0 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
1d3f0 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
1d400 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, i);.    }.  }
1d410 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1d420 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
1d430 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64  t prepares for d
1d440 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f  oing an operatio
1d450 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20  n that.** might 
1d460 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62  change the datab
1d470 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
1d480 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61  routine starts a
1d490 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
1d4a0 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61   if we are not a
1d4b0 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a  lready within.**
1d4c0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
1d4d0 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   If we are alrea
1d4e0 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  dy within a tran
1d4f0 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20  saction, then a 
1d500 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73  checkpoint.** is
1d510 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53   set if the setS
1d520 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74  tatement paramet
1d530 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63  er is true.  A c
1d540 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
1d550 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f  .** be set for o
1d560 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d  perations that m
1d570 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74  ight fail (due t
1d580 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  o a constraint) 
1d590 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77  part of.** the w
1d5a0 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77  ay through and w
1d5b0 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74  hich will need t
1d5c0 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74  o undo some writ
1d5d0 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  es without havin
1d5e0 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  g to.** rollback
1d5f0 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73   the whole trans
1d600 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65  action.  For ope
1d610 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c  rations where al
1d620 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  l constraints.**
1d630 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20   can be checked 
1d640 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67  before any chang
1d650 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74  es are made to t
1d660 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20  he database, it 
1d670 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65  is never.** nece
1d680 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20  ssary to undo a 
1d690 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68  write and the ch
1d6a0 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20  eckpoint should 
1d6b0 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76  not be set..*/.v
1d6c0 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
1d6d0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50  WriteOperation(P
1d6e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1d6f0 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20  t setStatement, 
1d700 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73  int iDb){.  Pars
1d710 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
1d720 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
1d730 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73  vel(pParse);.  s
1d740 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1d750 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
1d760 44 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c  Db);.  pToplevel
1d770 2d 3e 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20 28  ->writeMask |= (
1d780 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 44 62  (yDbMask)1)<<iDb
1d790 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69  ;.  pToplevel->i
1d7a0 73 4d 75 6c 74 69 57 72 69 74 65 20 7c 3d 20 73  sMultiWrite |= s
1d7b0 65 74 53 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a  etStatement;.}..
1d7c0 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74  /*.** Indicate t
1d7d0 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hat the statemen
1d7e0 74 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  t currently unde
1d7f0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6d  r construction m
1d800 69 67 68 74 20 77 72 69 74 65 0a 2a 2a 20 6d 6f  ight write.** mo
1d810 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72  re than one entr
1d820 79 20 28 65 78 61 6d 70 6c 65 3a 20 64 65 6c 65  y (example: dele
1d830 74 69 6e 67 20 6f 6e 65 20 72 6f 77 20 74 68 65  ting one row the
1d840 6e 20 69 6e 73 65 72 74 69 6e 67 20 61 6e 6f 74  n inserting anot
1d850 68 65 72 2c 0a 2a 2a 20 69 6e 73 65 72 74 69 6e  her,.** insertin
1d860 67 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  g multiple rows 
1d870 69 6e 20 61 20 74 61 62 6c 65 2c 20 6f 72 20 69  in a table, or i
1d880 6e 73 65 72 74 69 6e 67 20 61 20 72 6f 77 20 61  nserting a row a
1d890 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73  nd index entries
1d8a0 2e 29 0a 2a 2a 20 49 66 20 61 6e 20 61 62 6f 72  .).** If an abor
1d8b0 74 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 73  t occurs after s
1d8c0 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 77 72 69  ome of these wri
1d8d0 74 65 73 20 68 61 76 65 20 63 6f 6d 70 6c 65 74  tes have complet
1d8e0 65 64 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  ed, then it will
1d8f0 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79  .** be necessary
1d900 20 74 6f 20 75 6e 64 6f 20 74 68 65 20 63 6f 6d   to undo the com
1d910 70 6c 65 74 65 64 20 77 72 69 74 65 73 2e 0a 2a  pleted writes..*
1d920 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 75  /.void sqlite3Mu
1d930 6c 74 69 57 72 69 74 65 28 50 61 72 73 65 20 2a  ltiWrite(Parse *
1d940 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65  pParse){.  Parse
1d950 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
1d960 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
1d970 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54  el(pParse);.  pT
1d980 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69  oplevel->isMulti
1d990 57 72 69 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  Write = 1;.}../*
1d9a0 20 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65   .** The code ge
1d9b0 6e 65 72 61 74 6f 72 20 63 61 6c 6c 73 20 74 68  nerator calls th
1d9c0 69 73 20 72 6f 75 74 69 6e 65 20 69 66 20 69 73  is routine if is
1d9d0 20 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20   discovers that 
1d9e0 69 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c  it is.** possibl
1d9f0 65 20 74 6f 20 61 62 6f 72 74 20 61 20 73 74 61  e to abort a sta
1da00 74 65 6d 65 6e 74 20 70 72 69 6f 72 20 74 6f 20  tement prior to 
1da10 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 6e 20  completion.  In 
1da20 6f 72 64 65 72 20 74 6f 20 0a 2a 2a 20 70 65 72  order to .** per
1da30 66 6f 72 6d 20 74 68 69 73 20 61 62 6f 72 74 20  form this abort 
1da40 77 69 74 68 6f 75 74 20 63 6f 72 72 75 70 74 69  without corrupti
1da50 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ng the database,
1da60 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65   we need to make
1da70 0a 2a 2a 20 73 75 72 65 20 74 68 61 74 20 74 68  .** sure that th
1da80 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  e statement is p
1da90 72 6f 74 65 63 74 65 64 20 62 79 20 61 20 73 74  rotected by a st
1daa0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
1dab0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e  ion..**.** Techn
1dac0 69 63 61 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79 20  ically, we only 
1dad0 6e 65 65 64 20 74 6f 20 73 65 74 20 74 68 65 20  need to set the 
1dae0 6d 61 79 41 62 6f 72 74 20 66 6c 61 67 20 69 66  mayAbort flag if
1daf0 20 74 68 65 0a 2a 2a 20 69 73 4d 75 6c 74 69 57   the.** isMultiW
1db00 72 69 74 65 20 66 6c 61 67 20 77 61 73 20 70 72  rite flag was pr
1db10 65 76 69 6f 75 73 6c 79 20 73 65 74 2e 20 20 54  eviously set.  T
1db20 68 65 72 65 20 69 73 20 61 20 74 69 6d 65 20 64  here is a time d
1db30 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 73 75 63  ependency.** suc
1db40 68 20 74 68 61 74 20 74 68 65 20 61 62 6f 72 74  h that the abort
1db50 20 6d 75 73 74 20 6f 63 63 75 72 20 61 66 74 65   must occur afte
1db60 72 20 74 68 65 20 6d 75 6c 74 69 77 72 69 74 65  r the multiwrite
1db70 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 0a 2a 2a  .  This makes.**
1db80 20 73 6f 6d 65 20 73 74 61 74 65 6d 65 6e 74 73   some statements
1db90 20 69 6e 76 6f 6c 76 69 6e 67 20 74 68 65 20 52   involving the R
1dba0 45 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74 20  EPLACE conflict 
1dbb0 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72  resolution algor
1dbc0 69 74 68 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69 74  ithm.** go a lit
1dbd0 74 6c 65 20 66 61 73 74 65 72 2e 20 20 42 75 74  tle faster.  But
1dbe0 20 74 61 6b 69 6e 67 20 61 64 76 61 6e 74 61 67   taking advantag
1dbf0 65 20 6f 66 20 74 68 69 73 20 74 69 6d 65 20 64  e of this time d
1dc00 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b  ependency.** mak
1dc10 65 73 20 69 74 20 6d 6f 72 65 20 64 69 66 66 69  es it more diffi
1dc20 63 75 6c 74 20 74 6f 20 70 72 6f 76 65 20 74 68  cult to prove th
1dc30 61 74 20 74 68 65 20 63 6f 64 65 20 69 73 20 63  at the code is c
1dc40 6f 72 72 65 63 74 20 28 69 6e 20 0a 2a 2a 20 70  orrect (in .** p
1dc50 61 72 74 69 63 75 6c 61 72 2c 20 69 74 20 70 72  articular, it pr
1dc60 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 77  events us from w
1dc70 72 69 74 69 6e 67 20 61 6e 20 65 66 66 65 63 74  riting an effect
1dc80 69 76 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  ive.** implement
1dc90 61 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  ation of sqlite3
1dca0 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29  AssertMayAbort()
1dcb0 29 20 61 6e 64 20 73 6f 20 77 65 20 68 61 76 65  ) and so we have
1dcc0 20 63 68 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74 61   chosen.** to ta
1dcd0 6b 65 20 74 68 65 20 73 61 66 65 20 72 6f 75 74  ke the safe rout
1dce0 65 20 61 6e 64 20 73 6b 69 70 20 74 68 65 20 6f  e and skip the o
1dcf0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a  ptimization..*/.
1dd00 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 79 41  void sqlite3MayA
1dd10 62 6f 72 74 28 50 61 72 73 65 20 2a 70 50 61 72  bort(Parse *pPar
1dd20 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54  se){.  Parse *pT
1dd30 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
1dd40 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
1dd50 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65  Parse);.  pTople
1dd60 76 65 6c 2d 3e 6d 61 79 41 62 6f 72 74 20 3d 20  vel->mayAbort = 
1dd70 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  1;.}../*.** Code
1dd80 20 61 6e 20 4f 50 5f 48 61 6c 74 20 74 68 61 74   an OP_Halt that
1dd90 20 63 61 75 73 65 73 20 74 68 65 20 76 64 62 65   causes the vdbe
1dda0 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 53 51   to return an SQ
1ddb0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a  LITE_CONSTRAINT.
1ddc0 2a 2a 20 65 72 72 6f 72 2e 20 54 68 65 20 6f 6e  ** error. The on
1ddd0 45 72 72 6f 72 20 70 61 72 61 6d 65 74 65 72 20  Error parameter 
1dde0 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
1ddf0 20 28 69 66 20 61 6e 79 29 20 6f 66 20 74 68 65   (if any) of the
1de00 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e   statement.** an
1de10 64 2f 6f 72 20 63 75 72 72 65 6e 74 20 74 72 61  d/or current tra
1de20 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
1de30 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64  ed back..*/.void
1de40 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73   sqlite3HaltCons
1de50 74 72 61 69 6e 74 28 50 61 72 73 65 20 2a 70 50  traint(Parse *pP
1de60 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f  arse, int onErro
1de70 72 2c 20 63 68 61 72 20 2a 70 34 2c 20 69 6e 74  r, char *p4, int
1de80 20 70 34 74 79 70 65 29 7b 0a 20 20 56 64 62 65   p4type){.  Vdbe
1de90 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
1dea0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
1deb0 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  if( onError==OE_
1dec0 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 73 71 6c  Abort ){.    sql
1ded0 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
1dee0 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rse);.  }.  sqli
1def0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1df00 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
1df10 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 6f 6e 45  _CONSTRAINT, onE
1df20 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34 74  rror, 0, p4, p4t
1df30 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ype);.}../*.** C
1df40 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70  heck to see if p
1df50 49 6e 64 65 78 20 75 73 65 73 20 74 68 65 20 63  Index uses the c
1df60 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1df70 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e  e pColl.  Return
1df80 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20 64  .** true if it d
1df90 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66  oes and false if
1dfa0 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f   it does not..*/
1dfb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1dfc0 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61  OMIT_REINDEX.sta
1dfd0 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f  tic int collatio
1dfe0 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61  nMatch(const cha
1dff0 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20  r *zColl, Index 
1e000 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20  *pIndex){.  int 
1e010 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43 6f  i;.  assert( zCo
1e020 6c 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69  ll!=0 );.  for(i
1e030 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43  =0; i<pIndex->nC
1e040 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
1e050 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
1e060 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
1e070 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i];.    assert( 
1e080 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  z!=0 );.    if( 
1e090 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
1e0a0 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20  p(z, zColl) ){. 
1e0b0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1e0c0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1e0d0 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 0;.}.#endif../
1e0e0 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61  *.** Recompute a
1e0f0 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54  ll indices of pT
1e100 61 62 20 74 68 61 74 20 75 73 65 20 74 68 65 20  ab that use the 
1e110 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
1e120 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20  ce pColl..** If 
1e130 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65  pColl==0 then re
1e140 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
1e150 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a  ces of pTab..*/.
1e160 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e170 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
1e180 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54  ic void reindexT
1e190 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
1e1a0 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  se, Table *pTab,
1e1b0 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f   char const *zCo
1e1c0 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ll){.  Index *pI
1e1d0 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
1e1e0 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61     /* An index a
1e1f0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
1e200 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49  Tab */..  for(pI
1e210 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  ndex=pTab->pInde
1e220 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  x; pIndex; pInde
1e230 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29  x=pIndex->pNext)
1e240 7b 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d  {.    if( zColl=
1e250 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d  =0 || collationM
1e260 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64  atch(zColl, pInd
1e270 65 78 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ex) ){.      int
1e280 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
1e290 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
1e2a0 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
1e2b0 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71  chema);.      sq
1e2c0 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
1e2d0 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
1e2e0 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20   0, iDb);.      
1e2f0 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
1e300 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
1e310 78 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20  x, -1);.    }.  
1e320 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
1e330 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  * Recompute all 
1e340 69 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74  indices of all t
1e350 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74  ables in all dat
1e360 61 62 61 73 65 73 20 77 68 65 72 65 20 74 68 65  abases where the
1e370 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20  .** indices use 
1e380 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
1e390 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49  quence pColl.  I
1e3a0 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20  f pColl==0 then 
1e3b0 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c  recompute.** all
1e3c0 20 69 6e 64 69 63 65 73 20 65 76 65 72 79 77 68   indices everywh
1e3d0 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ere..*/.#ifndef 
1e3e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
1e3f0 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEX.static void 
1e400 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
1e410 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1e420 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
1e430 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20  l){.  Db *pDb;  
1e440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e450 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61    /* A single da
1e460 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
1e470 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
1e480 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
1e490 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75  atabase index nu
1e4a0 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  mber */.  sqlite
1e4b0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1e4c0 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74  db;   /* The dat
1e4d0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1e4e0 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a   */.  HashElem *
1e4f0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1e500 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
1e510 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20   over tables in 
1e520 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  pDb */.  Table *
1e530 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
1e540 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
1e550 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1e560 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
1e570 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
1e580 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b  llMutexes(db) );
1e590 20 20 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72 20    /* Needed for 
1e5a0 73 63 68 65 6d 61 20 61 63 63 65 73 73 20 2a 2f  schema access */
1e5b0 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44  .  for(iDb=0, pD
1e5c0 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64  b=db->aDb; iDb<d
1e5d0 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70  b->nDb; iDb++, p
1e5e0 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72  Db++){.    asser
1e5f0 74 28 20 70 44 62 21 3d 30 20 29 3b 0a 20 20 20  t( pDb!=0 );.   
1e600 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73   for(k=sqliteHas
1e610 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63  hFirst(&pDb->pSc
1e620 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
1e630 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68   k; k=sqliteHash
1e640 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20  Next(k)){.      
1e650 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73  pTab = (Table*)s
1e660 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29  qliteHashData(k)
1e670 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 54  ;.      reindexT
1e680 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
1e690 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d  b, zColl);.    }
1e6a0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
1e6b0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1e6c0 64 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44  de for the REIND
1e6d0 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  EX command..**.*
1e6e0 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
1e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e700 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31              -- 1
1e710 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
1e720 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20  EX  <collation> 
1e730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
1e740 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   2.**        REI
1e750 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65  NDEX  ?<database
1e760 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20  >.?<tablename>  
1e770 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 3.**        R
1e780 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61  EINDEX  ?<databa
1e790 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e  se>.?<indexname>
1e7a0 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72    -- 4.**.** For
1e7b0 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69  m 1 causes all i
1e7c0 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74  ndices in all at
1e7d0 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
1e7e0 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a   to be rebuilt..
1e7f0 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c  ** Form 2 rebuil
1e800 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69  ds all indices i
1e810 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  n all databases 
1e820 74 68 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d  that use the nam
1e830 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20  ed.** collating 
1e840 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73  function.  Forms
1e850 20 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64   3 and 4 rebuild
1e860 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
1e870 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63   or all.** indic
1e880 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
1e890 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  th the named tab
1e8a0 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  le..*/.#ifndef S
1e8b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
1e8c0 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  EX.void sqlite3R
1e8d0 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  eindex(Parse *pP
1e8e0 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
1e8f0 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  me1, Token *pNam
1e900 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  e2){.  CollSeq *
1e910 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
1e920 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
1e930 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72  sequence to be r
1e940 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c  eindexed, or NUL
1e950 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20  L */.  char *z; 
1e960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e970 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20     /* Name of a 
1e980 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a  table or index *
1e990 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1e9a0 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  zDb;            
1e9b0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
1e9c0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62  atabase */.  Tab
1e9d0 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
1e9e0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
1e9f0 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
1ea00 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ase */.  Index *
1ea10 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20  pIndex;         
1ea20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
1ea30 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1ea40 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69   pTab */.  int i
1ea50 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
1ea60 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
1ea70 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d  tabase index num
1ea80 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ber */.  sqlite3
1ea90 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1eaa0 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  b;   /* The data
1eab0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1eac0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a  */.  Token *pObj
1ead0 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
1eae0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1eaf0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
1eb00 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a  o be reindexed *
1eb10 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  /..  /* Read the
1eb20 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
1eb30 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
1eb40 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
1eb50 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
1eb60 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50  * and code in pP
1eb70 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
1eb80 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53  NULL. */.  if( S
1eb90 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
1eba0 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
1ebb0 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  se) ){.    retur
1ebc0 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e  n;.  }..  if( pN
1ebd0 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ame1==0 ){.    r
1ebe0 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
1ebf0 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20  pParse, 0);.    
1ec00 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20  return;.  }else 
1ec10 69 66 28 20 4e 45 56 45 52 28 70 4e 61 6d 65 32  if( NEVER(pName2
1ec20 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e  ==0) || pName2->
1ec30 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  z==0 ){.    char
1ec40 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73   *zColl;.    ass
1ec50 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29  ert( pName1->z )
1ec60 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71  ;.    zColl = sq
1ec70 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1ec80 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
1ec90 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20  Name1);.    if( 
1eca0 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b  !zColl ) return;
1ecb0 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
1ecc0 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
1ecd0 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f  db, ENC(db), zCo
1ece0 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ll, 0);.    if( 
1ecf0 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72  pColl ){.      r
1ed00 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
1ed10 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a  pParse, zColl);.
1ed20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
1ed30 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  ree(db, zColl);.
1ed40 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
1ed50 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
1ed60 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29  bFree(db, zColl)
1ed70 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
1ed80 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
1ed90 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
1eda0 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61   pName2, &pObjNa
1edb0 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30  me);.  if( iDb<0
1edc0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d   ) return;.  z =
1edd0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1ede0 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61  Token(db, pObjNa
1edf0 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  me);.  if( z==0 
1ee00 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20  ) return;.  zDb 
1ee10 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
1ee20 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73  Name;.  pTab = s
1ee30 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
1ee40 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69  db, z, zDb);.  i
1ee50 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72  f( pTab ){.    r
1ee60 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72  eindexTable(pPar
1ee70 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20  se, pTab, 0);.  
1ee80 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1ee90 64 62 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74 75  db, z);.    retu
1eea0 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78  rn;.  }.  pIndex
1eeb0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
1eec0 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b  dex(db, z, zDb);
1eed0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1eee0 28 64 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70  (db, z);.  if( p
1eef0 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c  Index ){.    sql
1ef00 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
1ef10 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
1ef20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  0, iDb);.    sql
1ef30 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
1ef40 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
1ef50 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  -1);.    return;
1ef60 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72  .  }.  sqlite3Er
1ef70 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1ef80 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69  unable to identi
1ef90 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f  fy the object to
1efa0 20 62 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b   be reindexed");
1efb0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1efc0 20 52 65 74 75 72 6e 20 61 20 64 79 6e 61 6d 69   Return a dynami
1efd0 63 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 4b 65  cly allocated Ke
1efe0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
1eff0 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
1f000 0a 2a 2a 20 77 69 74 68 20 4f 50 5f 4f 70 65 6e  .** with OP_Open
1f010 52 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65 6e 57  Read or OP_OpenW
1f020 72 69 74 65 20 74 6f 20 61 63 63 65 73 73 20 64  rite to access d
1f030 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 70 49  atabase index pI
1f040 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  dx..**.** If suc
1f050 63 65 73 73 66 75 6c 2c 20 61 20 70 6f 69 6e 74  cessful, a point
1f060 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74  er to the new st
1f070 72 75 63 74 75 72 65 20 69 73 20 72 65 74 75 72  ructure is retur
1f080 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
1f090 65 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  e.** the caller 
1f0a0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
1f0b0 6f 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  or calling sqlit
1f0c0 65 33 44 62 46 72 65 65 28 64 62 2c 20 29 20 6f  e3DbFree(db, ) o
1f0d0 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 0a  n the returned .
1f0e0 2a 2a 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 61  ** pointer. If a
1f0f0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28  n error occurs (
1f100 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 6f 72  out of memory or
1f110 20 6d 69 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69   missing collati
1f120 6f 6e 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65 29  on .** sequence)
1f130 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
1f140 65 64 20 61 6e 64 20 74 68 65 20 73 74 61 74 65  ed and the state
1f150 20 6f 66 20 70 50 61 72 73 65 20 75 70 64 61 74   of pParse updat
1f160 65 64 20 74 6f 20 72 65 66 6c 65 63 74 0a 2a 2a  ed to reflect.**
1f170 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 4b   the error..*/.K
1f180 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 49  eyInfo *sqlite3I
1f190 6e 64 65 78 4b 65 79 69 6e 66 6f 28 50 61 72 73  ndexKeyinfo(Pars
1f1a0 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
1f1b0 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20 69   *pIdx){.  int i
1f1c0 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70  ;.  int nCol = p
1f1d0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Idx->nColumn;.  
1f1e0 69 6e 74 20 6e 42 79 74 65 73 20 3d 20 73 69 7a  int nBytes = siz
1f1f0 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28  eof(KeyInfo) + (
1f200 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 43  nCol-1)*sizeof(C
1f210 6f 6c 6c 53 65 71 2a 29 20 2b 20 6e 43 6f 6c 3b  ollSeq*) + nCol;
1f220 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1f230 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b   pParse->db;.  K
1f240 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 28  eyInfo *pKey = (
1f250 4b 65 79 49 6e 66 6f 20 2a 29 73 71 6c 69 74 65  KeyInfo *)sqlite
1f260 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
1f270 2c 20 6e 42 79 74 65 73 29 3b 0a 0a 20 20 69 66  , nBytes);..  if
1f280 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 70 4b  ( pKey ){.    pK
1f290 65 79 2d 3e 64 62 20 3d 20 70 50 61 72 73 65 2d  ey->db = pParse-
1f2a0 3e 64 62 3b 0a 20 20 20 20 70 4b 65 79 2d 3e 61  >db;.    pKey->a
1f2b0 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 20  SortOrder = (u8 
1f2c0 2a 29 26 28 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b  *)&(pKey->aColl[
1f2d0 6e 43 6f 6c 5d 29 3b 0a 20 20 20 20 61 73 73 65  nCol]);.    asse
1f2e0 72 74 28 20 26 70 4b 65 79 2d 3e 61 53 6f 72 74  rt( &pKey->aSort
1f2f0 4f 72 64 65 72 5b 6e 43 6f 6c 5d 3d 3d 26 28 28  Order[nCol]==&((
1f300 28 75 38 20 2a 29 70 4b 65 79 29 5b 6e 42 79 74  (u8 *)pKey)[nByt
1f310 65 73 5d 29 20 29 3b 0a 20 20 20 20 66 6f 72 28  es]) );.    for(
1f320 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
1f330 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
1f340 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Coll = pIdx->azC
1f350 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73  oll[i];.      as
1f360 73 65 72 74 28 20 7a 43 6f 6c 6c 20 29 3b 0a 20  sert( zColl );. 
1f370 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c       pKey->aColl
1f380 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  [i] = sqlite3Loc
1f390 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
1f3a0 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  e, zColl);.     
1f3b0 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65   pKey->aSortOrde
1f3c0 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f  r[i] = pIdx->aSo
1f3d0 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20  rtOrder[i];.    
1f3e0 7d 0a 20 20 20 20 70 4b 65 79 2d 3e 6e 46 69 65  }.    pKey->nFie
1f3f0 6c 64 20 3d 20 28 75 31 36 29 6e 43 6f 6c 3b 0a  ld = (u16)nCol;.
1f400 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 72 73    }..  if( pPars
1f410 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73  e->nErr ){.    s
1f420 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1f430 20 70 4b 65 79 29 3b 0a 20 20 20 20 70 4b 65 79   pKey);.    pKey
1f440 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1f450 72 6e 20 70 4b 65 79 3b 0a 7d 0a                 rn pKey;.}.