/ Hex Artifact Content
Login

Artifact cd77ae979219d6363234b506de28c71f217063e1:


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 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
2940: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
2950: 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63  bes .** a partic
2960: 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e  ular index given
2970: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
2980: 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  t index.** and t
2990: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
29a0: 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e  atabase that con
29b0: 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e  tains the index.
29c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
29d0: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
29e0: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
29f0: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
2a00: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
2a10: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62  d for the.** tab
2a20: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  le and the first
2a30: 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20   matching index 
2a40: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
2a50: 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f  o checking.** fo
2a60: 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65  r duplicate inde
2a70: 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  x names is done.
2a80: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
2a90: 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66  der is.** TEMP f
2aa0: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2ab0: 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69   then any auxili
2ac0: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
2ad0: 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ded.** using the
2ae0: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
2af0: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
2b00: 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69  e3FindIndex(sqli
2b10: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
2b20: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
2b30: 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
2b40: 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20  Index *p = 0;.  
2b50: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61  int i;.  int nNa
2b60: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2b70: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 2f  en30(zName);.  /
2b80: 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72  * All mutexes ar
2b90: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  e required for s
2ba0: 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d  chema access.  M
2bb0: 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64  ake sure we hold
2bc0: 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65   them. */.  asse
2bd0: 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73 71  rt( zDb!=0 || sq
2be0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
2bf0: 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b  llMutexes(db) );
2c00: 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45  .  for(i=OMIT_TE
2c10: 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  MPDB; i<db->nDb;
2c20: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
2c30: 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a   = (i<2) ? i^1 :
2c40: 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54   i;  /* Search T
2c50: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
2c60: 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  */.    Schema *p
2c70: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
2c80: 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20  [j].pSchema;.   
2c90: 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d 61   assert( pSchema
2ca0: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20   );.    if( zDb 
2cb0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2cc0: 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a  p(zDb, db->aDb[j
2cd0: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
2ce0: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
2cf0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
2d00: 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30  texHeld(db, j, 0
2d10: 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  ) );.    p = sql
2d20: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 53  ite3HashFind(&pS
2d30: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
2d40: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
2d50: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
2d60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
2d70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61  ;.}../*.** Recla
2d80: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73  im the memory us
2d90: 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a  ed by an index.*
2da0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
2db0: 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  eeIndex(sqlite3 
2dc0: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a  *db, Index *p){.
2dd0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2de0: 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71  MIT_ANALYZE.  sq
2df0: 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78  lite3DeleteIndex
2e00: 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a  Samples(db, p);.
2e10: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
2e20: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 43  DbFree(db, p->zC
2e30: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
2e40: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
2e50: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  }../*.** For the
2e60: 20 69 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49   index called zI
2e70: 64 78 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20  dxName which is 
2e80: 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74  found in the dat
2e90: 61 62 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e  abase iDb,.** un
2ea0: 6c 69 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20  like that index 
2eb0: 66 72 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74  from its Table t
2ec0: 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69  hen remove the i
2ed0: 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  ndex from.** the
2ee0: 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
2ef0: 65 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d  e and free all m
2f00: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
2f10: 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
2f20: 69 74 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ith the index..*
2f30: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  /.void sqlite3Un
2f40: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64  linkAndDeleteInd
2f50: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ex(sqlite3 *db, 
2f60: 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63  int iDb, const c
2f70: 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a  har *zIdxName){.
2f80: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
2f90: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 48 61  .  int len;.  Ha
2fa0: 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73  sh *pHash;..  as
2fb0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
2fc0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
2fd0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48   iDb, 0) );.  pH
2fe0: 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  ash = &db->aDb[i
2ff0: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db].pSchema->idx
3000: 48 61 73 68 3b 0a 20 20 6c 65 6e 20 3d 20 73 71  Hash;.  len = sq
3010: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49  lite3Strlen30(zI
3020: 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65  dxName);.  pInde
3030: 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  x = sqlite3HashI
3040: 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64  nsert(pHash, zId
3050: 78 4e 61 6d 65 2c 20 6c 65 6e 2c 20 30 29 3b 0a  xName, len, 0);.
3060: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e    if( ALWAYS(pIn
3070: 64 65 78 29 20 29 7b 0a 20 20 20 20 69 66 28 20  dex) ){.    if( 
3080: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
3090: 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29  pIndex==pIndex )
30a0: 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
30b0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d  pTable->pIndex =
30c0: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
30d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30e0: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20   Index *p;.     
30f0: 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f   /* Justificatio
3100: 6e 20 6f 66 20 41 4c 57 41 59 53 28 29 3b 20 20  n of ALWAYS();  
3110: 54 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62  The index must b
3120: 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  e on the list of
3130: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 65  .      ** indice
3140: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 20 3d 20  s. */.      p = 
3150: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
3160: 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68  pIndex;.      wh
3170: 69 6c 65 28 20 41 4c 57 41 59 53 28 70 29 20 26  ile( ALWAYS(p) &
3180: 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64  & p->pNext!=pInd
3190: 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  ex ){ p = p->pNe
31a0: 78 74 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20  xt; }.      if( 
31b0: 41 4c 57 41 59 53 28 70 20 26 26 20 70 2d 3e 70  ALWAYS(p && p->p
31c0: 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29 20 29 7b  Next==pIndex) ){
31d0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78  .        p->pNex
31e0: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
31f0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
3200: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 64  .    freeIndex(d
3210: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
3220: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
3230: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
3240: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  ges;.}../*.** Er
3250: 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69  ase all schema i
3260: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
3270: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  the in-memory ha
3280: 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20  sh tables of.** 
3290: 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
32a0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
32b0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
32c0: 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20  claim memory.** 
32d0: 62 65 66 6f 72 65 20 74 68 65 20 64 61 74 61 62  before the datab
32e0: 61 73 65 20 63 6c 6f 73 65 73 2e 20 20 49 74 20  ase closes.  It 
32f0: 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64  is also called d
3300: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
3310: 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65 72  .** if there wer
3320: 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  e schema changes
3330: 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e   during the tran
3340: 73 61 63 74 69 6f 6e 20 6f 72 20 69 66 20 61 0a  saction or if a.
3350: 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65  ** schema-cookie
3360: 20 6d 69 73 6d 61 74 63 68 20 6f 63 63 75 72 73   mismatch occurs
3370: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30  ..**.** If iDb<0
3380: 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20   then reset the 
3390: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
33a0: 74 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64  tables for all d
33b0: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73  atabase.** files
33c0: 2e 20 20 49 66 20 69 44 62 3e 3d 30 20 74 68 65  .  If iDb>=0 the
33d0: 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65  n reset the inte
33e0: 72 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f 72 20  rnal schema for 
33f0: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67  only the.** sing
3400: 6c 65 20 66 69 6c 65 20 69 6e 64 69 63 61 74 65  le file indicate
3410: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
3420: 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
3430: 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64  chema(sqlite3 *d
3440: 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69  b, int iDb){.  i
3450: 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 73 73 65 72  nt i, j;.  asser
3460: 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  t( iDb<db->nDb )
3470: 3b 0a 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20  ;..  if( iDb>=0 
3480: 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31  ){.    /* Case 1
3490: 3a 20 20 52 65 73 65 74 20 74 68 65 20 73 69 6e  :  Reset the sin
34a0: 67 6c 65 20 73 63 68 65 6d 61 20 69 64 65 6e 74  gle schema ident
34b0: 69 66 69 65 64 20 62 79 20 69 44 62 20 2a 2f 0a  ified by iDb */.
34c0: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
34d0: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20  b->aDb[iDb];.   
34e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
34f0: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
3500: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
3510: 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e     assert( pDb->
3520: 70 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20  pSchema!=0 );.  
3530: 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43    sqlite3SchemaC
3540: 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d  lear(pDb->pSchem
3550: 61 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61  a);..    /* If a
3560: 6e 79 20 64 61 74 61 62 61 73 65 20 6f 74 68 65  ny database othe
3570: 72 20 74 68 61 6e 20 54 45 4d 50 20 69 73 20 72  r than TEMP is r
3580: 65 73 65 74 2c 20 74 68 65 6e 20 61 6c 73 6f 20  eset, then also 
3590: 72 65 73 65 74 20 54 45 4d 50 0a 20 20 20 20 2a  reset TEMP.    *
35a0: 2a 20 73 69 6e 63 65 20 54 45 4d 50 20 6d 69 67  * since TEMP mig
35b0: 68 74 20 62 65 20 68 6f 6c 64 69 6e 67 20 74 72  ht be holding tr
35c0: 69 67 67 65 72 73 20 74 68 61 74 20 72 65 66 65  iggers that refe
35d0: 72 65 6e 63 65 20 74 61 62 6c 65 73 20 69 6e 20  rence tables in 
35e0: 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  the.    ** other
35f0: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a   database..    *
3600: 2f 0a 20 20 20 20 69 66 28 20 69 44 62 21 3d 31  /.    if( iDb!=1
3610: 20 29 7b 0a 20 20 20 20 20 20 70 44 62 20 3d 20   ){.      pDb = 
3620: 26 64 62 2d 3e 61 44 62 5b 31 5d 3b 0a 20 20 20  &db->aDb[1];.   
3630: 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e     assert( pDb->
3640: 70 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20  pSchema!=0 );.  
3650: 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d      sqlite3Schem
3660: 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68  aClear(pDb->pSch
3670: 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ema);.    }.    
3680: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 2f 2a  return;.  }.  /*
3690: 20 43 61 73 65 20 32 20 28 66 72 6f 6d 20 68 65   Case 2 (from he
36a0: 72 65 20 74 6f 20 74 68 65 20 65 6e 64 29 3a 20  re to the end): 
36b0: 52 65 73 65 74 20 61 6c 6c 20 73 63 68 65 6d 61  Reset all schema
36c0: 73 20 66 6f 72 20 61 6c 6c 20 61 74 74 61 63 68  s for all attach
36d0: 65 64 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  ed.  ** database
36e0: 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  s. */.  assert( 
36f0: 69 44 62 3c 30 20 29 3b 0a 20 20 73 71 6c 69 74  iDb<0 );.  sqlit
3700: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
3710: 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  db);.  for(i=0; 
3720: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
3730: 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
3740: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
3750: 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
3760: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
3770: 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62  3SchemaClear(pDb
3780: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
3790: 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67  }.  }.  db->flag
37a0: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
37b0: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71  ernChanges;.  sq
37c0: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c  lite3VtabUnlockL
37d0: 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ist(db);.  sqlit
37e0: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
37f0: 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  db);..  /* If on
3800: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
3810: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
3820: 61 73 65 20 66 69 6c 65 73 20 68 61 73 20 62 65  ase files has be
3830: 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20  en closed,.  ** 
3840: 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 6d  then remove them
3850: 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c 69   from the auxili
3860: 61 72 79 20 64 61 74 61 62 61 73 65 20 6c 69 73  ary database lis
3870: 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65 0a  t.  We take the.
3880: 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79    ** opportunity
3890: 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72 65   to do this here
38a0: 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 6a   since we have j
38b0: 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c 20  ust deleted all 
38c0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68 65  of the.  ** sche
38d0: 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73 20 61  ma hash tables a
38e0: 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f 20  nd therefore do 
38f0: 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b 65  not have to make
3900: 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20 2a   any changes.  *
3910: 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73  * to any of thos
3920: 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
3930: 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62   for(i=j=2; i<db
3940: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
3950: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
3960: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
3970: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d     if( pDb->pBt=
3980: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
3990: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
39a0: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
39b0: 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b   pDb->zName = 0;
39c0: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
39d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
39e0: 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  <i ){.      db->
39f0: 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62  aDb[j] = db->aDb
3a00: 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  [i];.    }.    j
3a10: 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  ++;.  }.  memset
3a20: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c  (&db->aDb[j], 0,
3a30: 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a   (db->nDb-j)*siz
3a40: 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29  eof(db->aDb[j]))
3a50: 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b  ;.  db->nDb = j;
3a60: 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d  .  if( db->nDb<=
3a70: 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62  2 && db->aDb!=db
3a80: 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20  ->aDbStatic ){. 
3a90: 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44     memcpy(db->aD
3aa0: 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62  bStatic, db->aDb
3ab0: 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61  , 2*sizeof(db->a
3ac0: 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c  Db[0]));.    sql
3ad0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 64  ite3DbFree(db, d
3ae0: 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62 2d  b->aDb);.    db-
3af0: 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74  >aDb = db->aDbSt
3b00: 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  atic;.  }.}../*.
3b10: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3b20: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
3b30: 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a   commit occurs..
3b40: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
3b50: 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
3b60: 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
3b70: 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  ){.  db->flags &
3b80: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  = ~SQLITE_Intern
3b90: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
3ba0: 2a 20 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79 20  * Delete memory 
3bb0: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
3bc0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f  e column names o
3bd0: 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
3be0: 77 20 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65 2e  w (the.** Table.
3bf0: 61 43 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a 2a  aCol[] array)..*
3c00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
3c10: 6c 69 74 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e  liteDeleteColumn
3c20: 4e 61 6d 65 73 28 73 71 6c 69 74 65 33 20 2a 64  Names(sqlite3 *d
3c30: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  b, Table *pTable
3c40: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f  ){.  int i;.  Co
3c50: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73  lumn *pCol;.  as
3c60: 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20  sert( pTable!=0 
3c70: 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d  );.  if( (pCol =
3c80: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d   pTable->aCol)!=
3c90: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
3ca0: 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
3cb0: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
3cc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
3cd0: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e  ree(db, pCol->zN
3ce0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
3cf0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
3d00: 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a  , pCol->pDflt);.
3d10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
3d20: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44  ree(db, pCol->zD
3d30: 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  flt);.      sqli
3d40: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43  te3DbFree(db, pC
3d50: 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20  ol->zType);.    
3d60: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3d70: 64 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29  db, pCol->zColl)
3d80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
3d90: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
3da0: 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d  able->aCol);.  }
3db0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
3dc0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61   the memory data
3dd0: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
3de0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
3df0: 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20  given.** Table. 
3e00: 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
3e10: 6d 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20  made to disk by 
3e20: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
3e30: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3e40: 20 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68   just deletes th
3e50: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
3e60: 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75  .  It does not u
3e70: 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62  nlink.** the tab
3e80: 6c 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  le data structur
3e90: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
3ea0: 74 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64  table.  But it d
3eb0: 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d  oes destroy.** m
3ec0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
3ed0: 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20   of the indices 
3ee0: 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  and foreign keys
3ef0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3f00: 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a   .** the table..
3f10: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
3f20: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
3f30: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
3f40: 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20  Table){.  Index 
3f50: 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b  *pIndex, *pNext;
3f60: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 54 61  ..  assert( !pTa
3f70: 62 6c 65 20 7c 7c 20 70 54 61 62 6c 65 2d 3e 6e  ble || pTable->n
3f80: 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 44  Ref>0 );..  /* D
3f90: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
3fa0: 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65   table until the
3fb0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
3fc0: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a   reaches zero. *
3fd0: 2f 0a 20 20 69 66 28 20 21 70 54 61 62 6c 65 20  /.  if( !pTable 
3fe0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
3ff0: 28 28 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42  ((!db || db->pnB
4000: 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26  ytesFreed==0) &&
4010: 20 28 2d 2d 70 54 61 62 6c 65 2d 3e 6e 52 65 66   (--pTable->nRef
4020: 29 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  )>0) ) return;..
4030: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20    /* Delete all 
4040: 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
4050: 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62  ed with this tab
4060: 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e  le. */.  for(pIn
4070: 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49  dex = pTable->pI
4080: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
4090: 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20  ndex=pNext){.   
40a0: 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d   pNext = pIndex-
40b0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65  >pNext;.    asse
40c0: 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  rt( pIndex->pSch
40d0: 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63  ema==pTable->pSc
40e0: 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20  hema );.    if( 
40f0: 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74  !db || db->pnByt
4100: 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20  esFreed==0 ){.  
4110: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
4120: 3d 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b  = pIndex->zName;
4130: 20 0a 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59   .      TESTONLY
4140: 20 28 20 49 6e 64 65 78 20 2a 70 4f 6c 64 20 3d   ( Index *pOld =
4150: 20 29 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   ) sqlite3HashIn
4160: 73 65 72 74 28 0a 09 20 20 26 70 49 6e 64 65 78  sert(..  &pIndex
4170: 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
4180: 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74  sh, zName, sqlit
4190: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
41a0: 29 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  ), 0.      );.  
41b0: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 3d 3d      assert( db==
41c0: 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 63 68 65  0 || sqlite3Sche
41d0: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
41e0: 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  0, pIndex->pSche
41f0: 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ma) );.      ass
4200: 65 72 74 28 20 70 4f 6c 64 3d 3d 70 49 6e 64 65  ert( pOld==pInde
4210: 78 20 7c 7c 20 70 4f 6c 64 3d 3d 30 20 29 3b 0a  x || pOld==0 );.
4220: 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e      }.    freeIn
4230: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
4240: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
4250: 65 20 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65  e any foreign ke
4260: 79 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  ys attached to t
4270: 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  his table. */.  
4280: 73 71 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28  sqlite3FkDelete(
4290: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20  db, pTable);..  
42a0: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54 61  /* Delete the Ta
42b0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 74  ble structure it
42c0: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  self..  */.  sql
42d0: 69 74 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e  iteDeleteColumnN
42e0: 61 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29  ames(db, pTable)
42f0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
4300: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  e(db, pTable->zN
4310: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
4320: 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65  bFree(db, pTable
4330: 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71  ->zColAff);.  sq
4340: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
4350: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53  e(db, pTable->pS
4360: 65 6c 65 63 74 29 3b 0a 23 69 66 6e 64 65 66 20  elect);.#ifndef 
4370: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
4380: 4b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  K.  sqlite3ExprD
4390: 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65  elete(db, pTable
43a0: 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 65 6e 64 69  ->pCheck);.#endi
43b0: 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
43c0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
43d0: 4c 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  LE.  sqlite3Vtab
43e0: 43 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65  Clear(db, pTable
43f0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
4400: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
4410: 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  able);.}../*.** 
4420: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
4430: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
4440: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
4450: 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a  the delete the.*
4460: 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  * table structur
4470: 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69  e with all its i
4480: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
4490: 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64  gn keys..*/.void
44a0: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
44b0: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  dDeleteTable(sql
44c0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
44d0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
44e0: 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c  TabName){.  Tabl
44f0: 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b  e *p;.  Db *pDb;
4500: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
4510: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
4520: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
4530: 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
4540: 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20  ( zTabName );.  
4550: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
4560: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
4570: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
4580: 74 65 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61  testcase( zTabNa
4590: 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20  me[0]==0 );  /* 
45a0: 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c  Zero-length tabl
45b0: 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f  e names are allo
45c0: 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26  wed */.  pDb = &
45d0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
45e0: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
45f0: 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68  nsert(&pDb->pSch
4600: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54  ema->tblHash, zT
4610: 61 62 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  abName,.        
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4630: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
4640: 7a 54 61 62 4e 61 6d 65 29 2c 30 29 3b 0a 20 20  zTabName),0);.  
4650: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
4660: 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d  le(db, p);.  db-
4670: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
4680: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
4690: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
46a0: 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61   token, return a
46b0: 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e   string that con
46c0: 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65 78  sists of the tex
46d0: 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b  t of that.** tok
46e0: 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  en.  Space to ho
46f0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
4700: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74  string.** is obt
4710: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
4720: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
4730: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
4740: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
4750: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e  nction..**.** An
4760: 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b  y quotation mark
4770: 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20  s (ex:  "name", 
4780: 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20  'name', [name], 
4790: 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74 0a  or `name`) that.
47a0: 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65 20  ** surround the 
47b0: 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b 65  body of the toke
47c0: 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a  n are removed..*
47d0: 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20  *.** Tokens are 
47e0: 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74  often just point
47f0: 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ers into the ori
4800: 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61  ginal SQL text a
4810: 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74  nd so.** are not
4820: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
4830: 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72   and are not per
4840: 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65  sistent.  The re
4850: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a  turned string.**
4860: 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61   is \000 termina
4870: 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73 69  ted and is persi
4880: 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a  stent..*/.char *
4890: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
48a0: 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  oken(sqlite3 *db
48b0: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
48c0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
48d0: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
48e0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
48f0: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
4900: 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c  (char*)pName->z,
4910: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
4920: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
4930: 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Name);.  }else{.
4940: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20      zName = 0;. 
4950: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d   }.  return zNam
4960: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  e;.}../*.** Open
4970: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
4980: 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20  er table stored 
4990: 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62  in database numb
49a0: 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72  er iDb for.** wr
49b0: 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65  iting. The table
49c0: 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67   is opened using
49d0: 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f   cursor 0..*/.vo
49e0: 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61  id sqlite3OpenMa
49f0: 73 74 65 72 54 61 62 6c 65 28 50 61 72 73 65 20  sterTable(Parse 
4a00: 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  *p, int iDb){.  
4a10: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
4a20: 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73  3GetVdbe(p);.  s
4a30: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
4a40: 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52  p, iDb, MASTER_R
4a50: 4f 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54  OOT, 1, SCHEMA_T
4a60: 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 73 71  ABLE(iDb));.  sq
4a70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4a80: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
4a90: 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c   0, MASTER_ROOT,
4aa0: 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   iDb);.  sqlite3
4ab0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
4ac0: 2d 31 2c 20 28 63 68 61 72 20 2a 29 35 2c 20 50  -1, (char *)5, P
4ad0: 34 5f 49 4e 54 33 32 29 3b 20 20 2f 2a 20 35 20  4_INT32);  /* 5 
4ae0: 63 6f 6c 75 6d 6e 20 74 61 62 6c 65 20 2a 2f 0a  column table */.
4af0: 20 20 69 66 28 20 70 2d 3e 6e 54 61 62 3d 3d 30    if( p->nTab==0
4b00: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 54 61 62 20   ){.    p->nTab 
4b10: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
4b20: 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d  * Parameter zNam
4b30: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75  e points to a nu
4b40: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 62 75 66  l-terminated buf
4b50: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
4b60: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20  he name.** of a 
4b70: 64 61 74 61 62 61 73 65 20 28 22 6d 61 69 6e 22  database ("main"
4b80: 2c 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20  , "temp" or the 
4b90: 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63  name of an attac
4ba0: 68 65 64 20 64 62 29 2e 20 54 68 69 73 0a 2a 2a  hed db). This.**
4bb0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
4bc0: 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
4bd0: 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73  he named databas
4be0: 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20  e in db->aDb[], 
4bf0: 6f 72 0a 2a 2a 20 2d 31 20 69 66 20 74 68 65 20  or.** -1 if the 
4c00: 6e 61 6d 65 64 20 64 62 20 63 61 6e 6e 6f 74 20  named db cannot 
4c10: 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74  be found..*/.int
4c20: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
4c30: 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  me(sqlite3 *db, 
4c40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
4c50: 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31  e){.  int i = -1
4c60: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ;         /* Dat
4c70: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  abase number */.
4c80: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
4c90: 20 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 20 20     Db *pDb;.    
4ca0: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
4cb0: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
4cc0: 20 20 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e      for(i=(db->n
4cd0: 44 62 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e  Db-1), pDb=&db->
4ce0: 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d  aDb[i]; i>=0; i-
4cf0: 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20  -, pDb--){.     
4d00: 20 69 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50   if( (!OMIT_TEMP
4d10: 44 42 20 7c 7c 20 69 21 3d 31 20 29 20 26 26 20  DB || i!=1 ) && 
4d20: 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  n==sqlite3Strlen
4d30: 33 30 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26  30(pDb->zName) &
4d40: 26 20 0a 20 20 20 20 20 20 20 20 20 20 30 3d 3d  & .          0==
4d50: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
4d60: 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  Db->zName, zName
4d70: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  ) ){.        bre
4d80: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4d90: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  }.  }.  return i
4da0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  ;.}../*.** The t
4db0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74  oken *pName cont
4dc0: 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  ains the name of
4dd0: 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69 74   a database (eit
4de0: 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a  her "main" or.**
4df0: 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e   "temp" or the n
4e00: 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68  ame of an attach
4e10: 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75  ed db). This rou
4e20: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
4e30: 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65  .** index of the
4e40: 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20   named database 
4e50: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72  in db->aDb[], or
4e60: 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64   -1 if the named
4e70: 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74   db .** does not
4e80: 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73   exist..*/.int s
4e90: 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c  qlite3FindDb(sql
4ea0: 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20  ite3 *db, Token 
4eb0: 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *pName){.  int i
4ec0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ee0: 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62  /* Database numb
4ef0: 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  er */.  char *zN
4f00: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
4f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4f20: 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61 72  Name we are sear
4f30: 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a  ching for */.  z
4f40: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
4f50: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
4f60: 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71  pName);.  i = sq
4f70: 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
4f80: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  db, zName);.  sq
4f90: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4fa0: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
4fb0: 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61   i;.}../* The ta
4fc0: 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74  ble or view or t
4fd0: 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70  rigger name is p
4fe0: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f  assed to this ro
4ff0: 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73  utine via tokens
5000: 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70  .** pName1 and p
5010: 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61  Name2. If the ta
5020: 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c  ble name was ful
5030: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f  ly qualified, fo
5040: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
5050: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
5060: 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20  x.yyy (...);.** 
5070: 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20  .** Then pName1 
5080: 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20  is set to "xxx" 
5090: 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22  and pName2 "yyy"
50a0: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
50b0: 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61  and if.** the ta
50c0: 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  ble name is not 
50d0: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
50e0: 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45   i.e.:.**.** CRE
50f0: 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e  ATE TABLE yyy(..
5100: 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70  .);.**.** Then p
5110: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
5120: 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32  "yyy" and pName2
5130: 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68   is ""..**.** Th
5140: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
5150: 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f  the *ppUnqual po
5160: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  inter to point a
5170: 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61  t the token (pNa
5180: 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32  me1 or.** pName2
5190: 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68  ) that stores th
51a0: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61  e unqualified ta
51b0: 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69  ble name.  The i
51c0: 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64  ndex of the.** d
51d0: 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69 73  atabase "xxx" is
51e0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
51f0: 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  t sqlite3TwoPart
5200: 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70  Name(.  Parse *p
5210: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
5220: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
5230: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
5240: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
5250: 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54  Name1,      /* T
5260: 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65 20  he "xxx" in the 
5270: 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f  name "xxx.yyy" o
5280: 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b  r "xxx" */.  Tok
5290: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
52a0: 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e   /* The "yyy" in
52b0: 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79   the name "xxx.y
52c0: 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  yy" */.  Token *
52d0: 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20  *pUnqual     /* 
52e0: 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c  Write the unqual
52f0: 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d  ified object nam
5300: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
5310: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
5320: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
5330: 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74  tabase holding t
5340: 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  he object */.  s
5350: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
5360: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
5370: 41 4c 57 41 59 53 28 70 4e 61 6d 65 32 21 3d 30  ALWAYS(pName2!=0
5380: 29 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30  ) && pName2->n>0
5390: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
53a0: 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20  init.busy ) {.  
53b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
53c0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72  Msg(pParse, "cor
53d0: 72 75 70 74 20 64 61 74 61 62 61 73 65 22 29 3b  rupt database");
53e0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
53f0: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  Err++;.      ret
5400: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
5410: 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61    *pUnqual = pNa
5420: 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  me2;.    iDb = s
5430: 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c  qlite3FindDb(db,
5440: 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66   pName1);.    if
5450: 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20  ( iDb<0 ){.     
5460: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5470: 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
5480: 6e 20 64 61 74 61 62 61 73 65 20 25 54 22 2c 20  n database %T", 
5490: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 70  pName1);.      p
54a0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
54b0: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
54c0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
54d0: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69     assert( db->i
54e0: 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62  nit.iDb==0 || db
54f0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
5500: 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69     iDb = db->ini
5510: 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71  t.iDb;.    *pUnq
5520: 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20  ual = pName1;.  
5530: 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a  }.  return iDb;.
5540: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
5550: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
5560: 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 55 54   check if the UT
5570: 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65  F-8 string zName
5580: 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75   is a legal.** u
5590: 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
55a0: 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61  for a new schema
55b0: 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20   object (table, 
55c0: 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a  index, view or.*
55d0: 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20  * trigger). All 
55e0: 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20  names are legal 
55f0: 65 78 63 65 70 74 20 74 68 6f 73 65 20 74 68 61  except those tha
5600: 74 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  t begin with the
5610: 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69   string.** "sqli
5620: 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20  te_" (in upper, 
5630: 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63  lower or mixed c
5640: 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69  ase). This porti
5650: 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70  on of the namesp
5660: 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76  ace.** is reserv
5670: 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20  ed for internal 
5680: 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
5690: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
56a0: 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  me(Parse *pParse
56b0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
56c0: 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61  ame){.  if( !pPa
56d0: 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  rse->db->init.bu
56e0: 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65  sy && pParse->ne
56f0: 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20  sted==0 .       
5700: 20 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e 64     && (pParse->d
5710: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
5720: 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d 3d  E_WriteSchema)==
5730: 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30  0.          && 0
5740: 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ==sqlite3StrNICm
5750: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
5760: 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71  _", 7) ){.    sq
5770: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5780: 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61  arse, "object na
5790: 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  me reserved for 
57a0: 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73  internal use: %s
57b0: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ", zName);.    r
57c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
57d0: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
57e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
57f0: 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74  *.** Begin const
5800: 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ructing a new ta
5810: 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
5820: 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54  on in memory.  T
5830: 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  his is.** the fi
5840: 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61  rst of several a
5850: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74  ction routines t
5860: 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69  hat get called i
5870: 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f  n response.** to
5880: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
5890: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70  statement.  In p
58a0: 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20  articular, this 
58b0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
58c0: 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e  d.** after seein
58d0: 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45  g tokens "CREATE
58e0: 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e  " and "TABLE" an
58f0: 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  d the table name
5900: 2e 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20  . The isTemp.** 
5910: 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  flag is true if 
5920: 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  the table should
5930: 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68   be stored in th
5940: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
5950: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73  base.** file ins
5960: 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d  tead of in the m
5970: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
5980: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
5990: 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a  ally the case.**
59a0: 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22   when the "TEMP"
59b0: 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20   or "TEMPORARY" 
59c0: 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69  keyword occurs i
59d0: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45  n between.** CRE
59e0: 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a  ATE and TABLE..*
59f0: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62  *.** The new tab
5a00: 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69  le record is ini
5a10: 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74  tialized and put
5a20: 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77   in pParse->pNew
5a30: 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72  Table..** As mor
5a40: 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  e of the CREATE 
5a50: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
5a60: 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74  is parsed, addit
5a70: 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20  ional action.** 
5a80: 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65  routines will be
5a90: 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d   called to add m
5aa0: 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
5ab0: 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a  to this record..
5ac0: 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
5ad0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
5ae0: 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
5af0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
5b00: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  () routine.** is
5b10: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
5b20: 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63  ete the construc
5b30: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20  tion of the new 
5b40: 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f  table record..*/
5b50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61  .void sqlite3Sta
5b60: 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  rtTable(.  Parse
5b70: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
5b80: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
5b90: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
5ba0: 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72  ,   /* First par
5bb0: 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  t of the name of
5bc0: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
5bd0: 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ew */.  Token *p
5be0: 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f  Name2,   /* Seco
5bf0: 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  nd part of the n
5c00: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
5c10: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e   or view */.  in
5c20: 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f  t isTemp,      /
5c30: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
5c40: 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a  s a TEMP table *
5c50: 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20  /.  int isView, 
5c60: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5c70: 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a  this is a VIEW *
5c80: 2f 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75 61  /.  int isVirtua
5c90: 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  l,   /* True if 
5ca0: 74 68 69 73 20 69 73 20 61 20 56 49 52 54 55 41  this is a VIRTUA
5cb0: 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  L table */.  int
5cc0: 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a   noErr        /*
5cd0: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
5ce0: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
5cf0: 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  sts */.){.  Tabl
5d00: 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61  e *pTable;.  cha
5d10: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a  r *zName = 0; /*
5d20: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
5d30: 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20   new table */.  
5d40: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
5d50: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
5d60: 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20   *v;.  int iDb; 
5d70: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
5d80: 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72  ase number to cr
5d90: 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69  eate the table i
5da0: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
5db0: 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61  ame;    /* Unqua
5dc0: 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74  lified name of t
5dd0: 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61  he table to crea
5de0: 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  te */..  /* The 
5df0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
5e00: 6d 65 20 74 6f 20 63 72 65 61 74 65 20 69 73 20  me to create is 
5e10: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
5e20: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e  outine via token
5e30: 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e  s.  ** pName1 an
5e40: 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65  d pName2. If the
5e50: 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20   table name was 
5e60: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
5e70: 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20   for example:.  
5e80: 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54  **.  ** CREATE T
5e90: 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e  ABLE xxx.yyy (..
5ea0: 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54  .);.  ** .  ** T
5eb0: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
5ec0: 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70  t to "xxx" and p
5ed0: 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20  Name2 "yyy". On 
5ee0: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69  the other hand i
5ef0: 66 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65  f.  ** the table
5f00: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c   name is not ful
5f10: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e  ly qualified, i.
5f20: 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52  e.:.  **.  ** CR
5f30: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e  EATE TABLE yyy(.
5f40: 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ..);.  **.  ** T
5f50: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
5f60: 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70  t to "yyy" and p
5f70: 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 20 20 2a  Name2 is ""..  *
5f80: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20  *.  ** The call 
5f90: 62 65 6c 6f 77 20 73 65 74 73 20 74 68 65 20 70  below sets the p
5fa0: 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  Name pointer to 
5fb0: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b  point at the tok
5fc0: 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20  en (pName1 or.  
5fd0: 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20  ** pName2) that 
5fe0: 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61  stores the unqua
5ff0: 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d  lified table nam
6000: 65 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65 20  e. The variable 
6010: 69 44 62 20 69 73 0a 20 20 2a 2a 20 73 65 74 20  iDb is.  ** set 
6020: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
6030: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
6040: 74 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  t the table or v
6050: 69 65 77 20 69 73 20 74 6f 20 62 65 0a 20 20 2a  iew is to be.  *
6060: 2a 20 63 72 65 61 74 65 64 20 69 6e 2e 0a 20 20  * created in..  
6070: 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  */.  iDb = sqlit
6080: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
6090: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
60a0: 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
60b0: 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74   if( iDb<0 ) ret
60c0: 75 72 6e 3b 0a 20 20 69 66 28 20 21 4f 4d 49 54  urn;.  if( !OMIT
60d0: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
60e0: 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30  p && pName2->n>0
60f0: 20 26 26 20 69 44 62 21 3d 31 20 29 7b 0a 20 20   && iDb!=1 ){.  
6100: 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67    /* If creating
6110: 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 74   a temp table, t
6120: 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20  he name may not 
6130: 62 65 20 71 75 61 6c 69 66 69 65 64 2e 20 55 6e  be qualified. Un
6140: 6c 65 73 73 20 0a 20 20 20 20 2a 2a 20 74 68 65  less .    ** the
6150: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69   database name i
6160: 73 20 22 74 65 6d 70 22 20 61 6e 79 77 61 79 2e  s "temp" anyway.
6170: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
6180: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
6190: 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c   "temporary tabl
61a0: 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75  e name must be u
61b0: 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20  nqualified");.  
61c0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
61d0: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
61e0: 20 26 26 20 69 73 54 65 6d 70 20 29 20 69 44 62   && isTemp ) iDb
61f0: 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d   = 1;..  pParse-
6200: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70  >sNameToken = *p
6210: 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  Name;.  zName = 
6220: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
6230: 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
6240: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
6250: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
6260: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
6270: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
6280: 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29  e(pParse, zName)
6290: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67   ){.    goto beg
62a0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
62b0: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e    }.  if( db->in
62c0: 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65  it.iDb==1 ) isTe
62d0: 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  mp = 1;.#ifndef 
62e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
62f0: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65  ORIZATION.  asse
6300: 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31 29  rt( (isTemp & 1)
6310: 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a  ==isTemp );.  {.
6320: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
6330: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
6340: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
6350: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
6360: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
6370: 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
6380: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
6390: 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20  sTemp), 0, zDb) 
63a0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
63b0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
63c0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
63d0: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
63e0: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
63f0: 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  && isTemp ){.   
6400: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
6410: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
6420: 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
6430: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
6440: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
6450: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
6460: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
6470: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
6480: 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  & isTemp ){.    
6490: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
64a0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
64b0: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
64c0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
64d0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
64e0: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ABLE;.      }.  
64f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56    }.    if( !isV
6500: 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74 65  irtual && sqlite
6510: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
6520: 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20  e, code, zName, 
6530: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
6540: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
6550: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
6560: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
6570: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
6580: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65  w table name doe
6590: 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69  s not collide wi
65a0: 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  th an existing. 
65b0: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
65c0: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  le name in the s
65d0: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ame database.  I
65e0: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
65f0: 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74  ssage if.  ** it
6600: 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70   does. The excep
6610: 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73  tion is if the s
6620: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70  tatement being p
6630: 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64  arsed was passed
6640: 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69  .  ** to an sqli
6650: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
6660: 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74  () call. In that
6670: 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63   case only the c
6680: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a  olumn names.  **
6690: 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20   and types will 
66a0: 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72  be used, so ther
66b0: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
66c0: 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61  test for namespa
66d0: 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f  ce.  ** collisio
66e0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
66f0: 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
6700: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62  ){.    char *zDb
6710: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
6720: 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 53  zName;.    if( S
6730: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
6740: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
6750: 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  se) ){.      got
6760: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
6770: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ror;.    }.    p
6780: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46  Table = sqlite3F
6790: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
67a0: 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66  me, zDb);.    if
67b0: 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ( pTable ){.    
67c0: 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a    if( !noErr ){.
67d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
67e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
67f0: 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64  "table %T alread
6800: 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65  y exists", pName
6810: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
6820: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6830: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
6840: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6850: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
6860: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
6870: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
6880: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
6890: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
68a0: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49  if( sqlite3FindI
68b0: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
68c0: 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  zDb)!=0 ){.     
68d0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
68e0: 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
68f0: 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e  is already an in
6900: 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  dex named %s", z
6910: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
6920: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
6930: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ror;.    }.  }..
6940: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
6950: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
6960: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
6970: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  );.  if( pTable=
6980: 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  =0 ){.    db->ma
6990: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
69a0: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
69b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
69c0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
69d0: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69  +;.    goto begi
69e0: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
69f0: 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61   }.  pTable->zNa
6a00: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54  me = zName;.  pT
6a10: 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  able->iPKey = -1
6a20: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68  ;.  pTable->pSch
6a30: 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ema = db->aDb[iD
6a40: 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54  b].pSchema;.  pT
6a50: 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  able->nRef = 1;.
6a60: 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 45 73    pTable->nRowEs
6a70: 74 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 61  t = 1000000;.  a
6a80: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
6a90: 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  NewTable==0 );. 
6aa0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
6ab0: 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20  le = pTable;..  
6ac0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
6ad0: 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73  e magic sqlite_s
6ae0: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73  equence table us
6af0: 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d  ed by autoincrem
6b00: 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72  ent,.  ** then r
6b10: 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20  ecord a pointer 
6b20: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e  to this table in
6b30: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
6b40: 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
6b50: 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54  * so that INSERT
6b60: 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61   can find the ta
6b70: 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f  ble easily..  */
6b80: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6b90: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
6ba0: 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  NT.  if( !pParse
6bb0: 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72 63  ->nested && strc
6bc0: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
6bd0: 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20  e_sequence")==0 
6be0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
6bf0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
6c00: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
6c10: 29 20 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  ) );.    pTable-
6c20: 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61  >pSchema->pSeqTa
6c30: 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a  b = pTable;.  }.
6c40: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67  #endif..  /* Beg
6c50: 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  in generating th
6c60: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
6c70: 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c   insert the tabl
6c80: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20  e record into.  
6c90: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  ** the SQLITE_MA
6ca0: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74  STER table.  Not
6cb0: 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20  e in particular 
6cc0: 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20  that we must go 
6cd0: 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61  ahead.  ** and a
6ce0: 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f  llocate the reco
6cf0: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
6d00: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f  e table entry no
6d10: 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20  w.  Before any. 
6d20: 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
6d30: 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72  or UNIQUE keywor
6d40: 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20  ds are parsed.  
6d50: 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77  Those keywords w
6d60: 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69  ill cause.  ** i
6d70: 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65  ndices to be cre
6d80: 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62  ated and the tab
6d90: 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63  le record must c
6da0: 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a  ome before the .
6db0: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48    ** indices.  H
6dc0: 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64  ence, the record
6dd0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
6de0: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c  table must be al
6df0: 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77  located.  ** now
6e00: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
6e10: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28  ->init.busy && (
6e20: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
6e30: 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29  be(pParse))!=0 )
6e40: 7b 0a 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20  {.    int j1;.  
6e50: 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74    int fileFormat
6e60: 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20  ;.    int reg1, 
6e70: 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20  reg2, reg3;.    
6e80: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
6e90: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
6ea0: 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 23 69 66  e, 0, iDb);..#if
6eb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6ec0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
6ed0: 20 20 69 66 28 20 69 73 56 69 72 74 75 61 6c 20    if( isVirtual 
6ee0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6ef0: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
6f00: 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a  _VBegin);.    }.
6f10: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
6f20: 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  f the file forma
6f30: 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69  t and encoding i
6f40: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
6f50: 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74  ave not been set
6f60: 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  , .    ** set th
6f70: 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20  em now..    */. 
6f80: 20 20 20 72 65 67 31 20 3d 20 70 50 61 72 73 65     reg1 = pParse
6f90: 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70  ->regRowid = ++p
6fa0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
6fb0: 20 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e   reg2 = pParse->
6fc0: 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72  regRoot = ++pPar
6fd0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
6fe0: 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  g3 = ++pParse->n
6ff0: 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
7000: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7010: 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62  _ReadCookie, iDb
7020: 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46 49  , reg3, BTREE_FI
7030: 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20  LE_FORMAT);.    
7040: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
7050: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  tree(v, iDb);.  
7060: 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
7070: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
7080: 66 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 66 69  f, reg3);.    fi
7090: 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e  leFormat = (db->
70a0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c  flags & SQLITE_L
70b0: 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30  egacyFileFmt)!=0
70c0: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
70d0: 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f       1 : SQLITE_
70e0: 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b  MAX_FILE_FORMAT;
70f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7100: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
7110: 65 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61 74  eger, fileFormat
7120: 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c  , reg3);.    sql
7130: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7140: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
7150: 69 44 62 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f  iDb, BTREE_FILE_
7160: 46 4f 52 4d 41 54 2c 20 72 65 67 33 29 3b 0a 20  FORMAT, reg3);. 
7170: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7180: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
7190: 65 72 2c 20 45 4e 43 28 64 62 29 2c 20 72 65 67  er, ENC(db), reg
71a0: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
71b0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
71c0: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
71d0: 42 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44  BTREE_TEXT_ENCOD
71e0: 49 4e 47 2c 20 72 65 67 33 29 3b 0a 20 20 20 20  ING, reg3);.    
71f0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
7200: 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 20  ere(v, j1);..   
7210: 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72   /* This just cr
7220: 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f  eates a place-ho
7230: 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74  lder record in t
7240: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
7250: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54   table..    ** T
7260: 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 74 65  he record create
7270: 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  d does not conta
7280: 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e  in anything yet.
7290: 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70    It will be rep
72a0: 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  laced.    ** by 
72b0: 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69  the real entry i
72c0: 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  n code generated
72d0: 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61   at sqlite3EndTa
72e0: 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ble()..    **.  
72f0: 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66    ** The rowid f
7300: 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  or the new entry
7310: 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69   is left in regi
7320: 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67  ster pParse->reg
7330: 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68  Rowid..    ** Th
7340: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
7350: 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  er of the new ta
7360: 62 6c 65 20 69 73 20 6c 65 66 74 20 69 6e 20 72  ble is left in r
7370: 65 67 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  eg pParse->regRo
7380: 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  ot..    ** The r
7390: 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74 20 70 61  owid and root pa
73a0: 67 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 65 73  ge number values
73b0: 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20 74   are needed by t
73c0: 68 65 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20  he code that.   
73d0: 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64 54 61   ** sqlite3EndTa
73e0: 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  ble will generat
73f0: 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64  e..    */.#if !d
7400: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
7410: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
7420: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
7430: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20  _VIRTUALTABLE). 
7440: 20 20 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c     if( isView ||
7450: 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20   isVirtual ){.  
7460: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7470: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
7480: 67 65 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20  ger, 0, reg2);. 
7490: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
74a0: 20 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69      {.      sqli
74b0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
74c0: 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c   OP_CreateTable,
74d0: 20 69 44 62 2c 20 72 65 67 32 29 3b 0a 20 20 20   iDb, reg2);.   
74e0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70   }.    sqlite3Op
74f0: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50  enMasterTable(pP
7500: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
7510: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7520: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
7530: 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20 20  , 0, reg1);.    
7540: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7550: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
7560: 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69   reg3);.    sqli
7570: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7580: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 72   OP_Insert, 0, r
7590: 65 67 33 2c 20 72 65 67 31 29 3b 0a 20 20 20 20  eg3, reg1);.    
75a0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
75b0: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
75c0: 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69 74  PEND);.    sqlit
75d0: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
75e0: 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a  OP_Close);.  }..
75f0: 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e    /* Normal (non
7600: 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20  -error) return. 
7610: 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  */.  return;..  
7620: 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
7630: 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68  ccurs, we jump h
7640: 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62  ere */.begin_tab
7650: 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69  le_error:.  sqli
7660: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
7670: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
7680: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61  }../*.** This ma
7690: 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f 20 63  cro is used to c
76a0: 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 72 69 6e  ompare two strin
76b0: 67 73 20 69 6e 20 61 20 63 61 73 65 2d 69 6e 73  gs in a case-ins
76c0: 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e 65 72 2e  ensitive manner.
76d0: 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69 67 68 74  .** It is slight
76e0: 6c 79 20 66 61 73 74 65 72 20 74 68 61 6e 20 63  ly faster than c
76f0: 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 53 74  alling sqlite3St
7700: 72 49 43 6d 70 28 29 20 64 69 72 65 63 74 6c 79  rICmp() directly
7710: 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64 75 63 65  , but.** produce
7720: 73 20 6c 61 72 67 65 72 20 63 6f 64 65 2e 0a 2a  s larger code..*
7730: 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68  *.** WARNING: Th
7740: 69 73 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20  is macro is not 
7750: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
7760: 74 68 65 20 73 74 72 63 6d 70 28 29 20 66 61 6d  the strcmp() fam
7770: 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65 74 75 72  ily. It.** retur
7780: 6e 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74  ns true if the t
7790: 77 6f 20 73 74 72 69 6e 67 73 20 61 72 65 20 65  wo strings are e
77a0: 71 75 61 6c 2c 20 6f 74 68 65 72 77 69 73 65 20  qual, otherwise 
77b0: 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  false..*/.#defin
77c0: 65 20 53 54 52 49 43 4d 50 28 78 2c 20 79 29 20  e STRICMP(x, y) 
77d0: 28 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54  (\.sqlite3UpperT
77e0: 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65  oLower[*(unsigne
77f0: 64 20 63 68 61 72 20 2a 29 28 78 29 5d 3d 3d 20  d char *)(x)]== 
7800: 20 20 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72    \.sqlite3Upper
7810: 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e  ToLower[*(unsign
7820: 65 64 20 63 68 61 72 20 2a 29 28 79 29 5d 20 20  ed char *)(y)]  
7830: 20 20 20 5c 0a 26 26 20 73 71 6c 69 74 65 33 53     \.&& sqlite3S
7840: 74 72 49 43 6d 70 28 28 78 29 2b 31 2c 28 79 29  trICmp((x)+1,(y)
7850: 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20  +1)==0 )../*.** 
7860: 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e  Add a new column
7870: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
7880: 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
7890: 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a  nstructed..**.**
78a0: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
78b0: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  s this routine o
78c0: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  nce for each col
78d0: 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  umn declaration.
78e0: 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54  ** in a CREATE T
78f0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
7900: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
7910: 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64  le() gets called
7920: 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74  .** first to get
7930: 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20   things going.  
7940: 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  Then this routin
7950: 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  e is called for 
7960: 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a  each.** column..
7970: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
7980: 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a  ddColumn(Parse *
7990: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
79a0: 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Name){.  Table *
79b0: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
79c0: 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20  ar *z;.  Column 
79d0: 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33  *pCol;.  sqlite3
79e0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
79f0: 62 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  b;.  if( (p = pP
7a00: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
7a10: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69  ==0 ) return;.#i
7a20: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  f SQLITE_MAX_COL
7a30: 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 6e 43 6f  UMN.  if( p->nCo
7a40: 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  l+1>db->aLimit[S
7a50: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
7a60: 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MN] ){.    sqlit
7a70: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7a80: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c  e, "too many col
7a90: 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d 3e  umns on %s", p->
7aa0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
7ab0: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  rn;.  }.#endif. 
7ac0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65   z = sqlite3Name
7ad0: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
7ae0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  ame);.  if( z==0
7af0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
7b00: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
7b10: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53   i++){.    if( S
7b20: 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43 6f  TRICMP(z, p->aCo
7b30: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20  l[i].zName) ){. 
7b40: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7b50: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75  rMsg(pParse, "du
7b60: 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e  plicate column n
7b70: 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ame: %s", z);.  
7b80: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
7b90: 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e(db, z);.      
7ba0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
7bb0: 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c  }.  if( (p->nCol
7bc0: 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20   & 0x7)==0 ){.  
7bd0: 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a    Column *aNew;.
7be0: 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74      aNew = sqlit
7bf0: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70  e3DbRealloc(db,p
7c00: 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b  ->aCol,(p->nCol+
7c10: 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  8)*sizeof(p->aCo
7c20: 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  l[0]));.    if( 
7c30: 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
7c40: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7c50: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74  b, z);.      ret
7c60: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
7c70: 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20  ->aCol = aNew;. 
7c80: 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e   }.  pCol = &p->
7c90: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20  aCol[p->nCol];. 
7ca0: 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c   memset(pCol, 0,
7cb0: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b   sizeof(p->aCol[
7cc0: 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e  0]));.  pCol->zN
7cd0: 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20  ame = z;. .  /* 
7ce0: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74  If there is no t
7cf0: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63  ype specified, c
7d00: 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20  olumns have the 
7d10: 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79  default affinity
7d20: 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66  .  ** 'NONE'. If
7d30: 20 74 68 65 72 65 20 69 73 20 61 20 74 79 70 65   there is a type
7d40: 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e   specified, then
7d50: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
7d60: 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a  nType() will.  *
7d70: 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78 74  * be called next
7d80: 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66   to set pCol->af
7d90: 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c 79  finity correctly
7da0: 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61  ..  */.  pCol->a
7db0: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
7dc0: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e  _AFF_NONE;.  p->
7dd0: 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nCol++;.}../*.**
7de0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
7df0: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
7e00: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
7e10: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
7e20: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
7e30: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
7e40: 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20  .  A "NOT NULL" 
7e50: 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a  constraint has.*
7e60: 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61  * been seen on a
7e70: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72   column.  This r
7e80: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
7e90: 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a  notNull flag on.
7ea0: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75  ** the column cu
7eb0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
7ec0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
7ed0: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f  oid sqlite3AddNo
7ee0: 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61  tNull(Parse *pPa
7ef0: 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72  rse, int onError
7f00: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
7f10: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
7f20: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
7f30: 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e  =0 || NEVER(p->n
7f40: 43 6f 6c 3c 31 29 20 29 20 72 65 74 75 72 6e 3b  Col<1) ) return;
7f50: 0a 20 20 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43  .  p->aCol[p->nC
7f60: 6f 6c 2d 31 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20  ol-1].notNull = 
7f70: 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a  (u8)onError;.}..
7f80: 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63  /*.** Scan the c
7f90: 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20  olumn type name 
7fa0: 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54  zType (length nT
7fb0: 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20  ype) and return 
7fc0: 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  the.** associate
7fd0: 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e  d affinity type.
7fe0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7ff0: 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d  ine does a case-
8000: 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72  independent sear
8010: 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20  ch of zType for 
8020: 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e  the .** substrin
8030: 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  gs in the follow
8040: 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e  ing table. If on
8050: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
8060: 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c  ngs is.** found,
8070: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
8080: 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20 72  ng affinity is r
8090: 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70  eturned. If zTyp
80a0: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f  e contains.** mo
80b0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74  re than one of t
80c0: 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65  he substrings, e
80d0: 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74 68  ntries toward th
80e0: 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65  e top of .** the
80f0: 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f   table take prio
8100: 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c  rity. For exampl
8110: 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20 27  e, if zType is '
8120: 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51  BLOBINT', .** SQ
8130: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
8140: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
8150: 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20  .** Substring   
8160: 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20    | Affinity.** 
8170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8190: 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20  .** 'INT'       
81a0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49    | SQLITE_AFF_I
81b0: 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27  NTEGER.** 'CHAR'
81c0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
81d0: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c  _AFF_TEXT.** 'CL
81e0: 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OB'        | SQL
81f0: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
8200: 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c 20  'TEXT'        | 
8210: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
8220: 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20  ** 'BLOB'       
8230: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   | SQLITE_AFF_NO
8240: 4e 45 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20  NE.** 'REAL'    
8250: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
8260: 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20  _REAL.** 'FLOA' 
8270: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
8280: 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55  AFF_REAL.** 'DOU
8290: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
82a0: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a  TE_AFF_REAL.**.*
82b0: 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
82c0: 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74   substrings in t
82d0: 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61  he above table a
82e0: 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c  re found,.** SQL
82f0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
8300: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
8310: 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69  char sqlite3Affi
8320: 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63  nityType(const c
8330: 68 61 72 20 2a 7a 49 6e 29 7b 0a 20 20 75 33 32  har *zIn){.  u32
8340: 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61   h = 0;.  char a
8350: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
8360: 4e 55 4d 45 52 49 43 3b 0a 0a 20 20 69 66 28 20  NUMERIC;..  if( 
8370: 7a 49 6e 20 29 20 77 68 69 6c 65 28 20 7a 49 6e  zIn ) while( zIn
8380: 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20 28  [0] ){.    h = (
8390: 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55  h<<8) + sqlite3U
83a0: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49  pperToLower[(*zI
83b0: 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49  n)&0xff];.    zI
83c0: 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d  n++;.    if( h==
83d0: 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c  (('c'<<24)+('h'<
83e0: 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72  <16)+('a'<<8)+'r
83f0: 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  ') ){           
8400: 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20    /* CHAR */.   
8410: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
8420: 41 46 46 5f 54 45 58 54 3b 20 0a 20 20 20 20 7d  AFF_TEXT; .    }
8430: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63  else if( h==(('c
8440: 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29  '<<24)+('l'<<16)
8450: 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29  +('o'<<8)+'b') )
8460: 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20  {       /* CLOB 
8470: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
8480: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
8490: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
84a0: 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27  =(('t'<<24)+('e'
84b0: 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27  <<16)+('x'<<8)+'
84c0: 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20  t') ){       /* 
84d0: 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66  TEXT */.      af
84e0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
84f0: 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EXT;.    }else i
8500: 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29  f( h==(('b'<<24)
8510: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
8520: 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20  <8)+'b')        
8530: 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20    /* BLOB */.   
8540: 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51       && (aff==SQ
8550: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
8560: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
8570: 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20  AFF_REAL) ){.   
8580: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
8590: 41 46 46 5f 4e 4f 4e 45 3b 0a 23 69 66 6e 64 65  AFF_NONE;.#ifnde
85a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
85b0: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
85c0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
85d0: 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31  'r'<<24)+('e'<<1
85e0: 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29  6)+('a'<<8)+'l')
85f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41            /* REA
8600: 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  L */.        && 
8610: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
8620: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
8630: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
8640: 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73  F_REAL;.    }els
8650: 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c  e if( h==(('f'<<
8660: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
8670: 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20 20  o'<<8)+'a')     
8680: 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a       /* FLOA */.
8690: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
86a0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
86b0: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
86c0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
86d0: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  L;.    }else if(
86e0: 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28   h==(('d'<<24)+(
86f0: 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38  'o'<<16)+('u'<<8
8700: 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20  )+'b')          
8710: 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20  /* DOUB */.     
8720: 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54     && aff==SQLIT
8730: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b  E_AFF_NUMERIC ){
8740: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
8750: 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65  ITE_AFF_REAL;.#e
8760: 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69  ndif.    }else i
8770: 66 28 20 28 68 26 30 78 30 30 46 46 46 46 46 46  f( (h&0x00FFFFFF
8780: 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28 27  )==(('i'<<16)+('
8790: 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20  n'<<8)+'t') ){  
87a0: 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20    /* INT */.    
87b0: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
87c0: 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  FF_INTEGER;.    
87d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
87e0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 66 66   }..  return aff
87f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
8800: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
8810: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
8820: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
8830: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
8840: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
8850: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
8860: 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73   pFirst token is
8870: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f   the first.** to
8880: 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65  ken in the seque
8890: 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68  nce of tokens th
88a0: 61 74 20 64 65 73 63 72 69 62 65 20 74 68 65 20  at describe the 
88b0: 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  type of the.** c
88c0: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
88d0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
88e0: 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74  on.   pLast is t
88f0: 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a  he last token.**
8900: 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65   in the sequence
8910: 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f  .  Use this info
8920: 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74  rmation to const
8930: 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a  ruct a string.**
8940: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
8950: 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74  he typename of t
8960: 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74  he column and st
8970: 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a  ore that string.
8980: 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20  ** in zType..*/ 
8990: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
89a0: 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65  ColumnType(Parse
89b0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
89c0: 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65  *pType){.  Table
89d0: 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *p;.  Column *p
89e0: 43 6f 6c 3b 0a 0a 20 20 70 20 3d 20 70 50 61 72  Col;..  p = pPar
89f0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
8a00: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56   if( p==0 || NEV
8a10: 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20  ER(p->nCol<1) ) 
8a20: 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d  return;.  pCol =
8a30: 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f   &p->aCol[p->nCo
8a40: 6c 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  l-1];.  assert( 
8a50: 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20 29  pCol->zType==0 )
8a60: 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20  ;.  pCol->zType 
8a70: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
8a80: 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
8a90: 62 2c 20 70 54 79 70 65 29 3b 0a 20 20 70 43 6f  b, pType);.  pCo
8aa0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  l->affinity = sq
8ab0: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
8ac0: 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a  e(pCol->zType);.
8ad0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70  }../*.** The exp
8ae0: 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64  ression is the d
8af0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
8b00: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
8b10: 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a  ly added column.
8b20: 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
8b30: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
8b40: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a  construction..**
8b50: 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75  .** Default valu
8b60: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75  e expressions mu
8b70: 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20  st be constant. 
8b80: 20 52 61 69 73 65 20 61 6e 20 65 78 63 65 70 74   Raise an except
8b90: 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69  ion if this.** i
8ba0: 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a  s not the case..
8bb0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8bc0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
8bd0: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
8be0: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
8bf0: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
8c00: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
8c10: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
8c20: 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74  qlite3AddDefault
8c30: 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61  Value(Parse *pPa
8c40: 72 73 65 2c 20 45 78 70 72 53 70 61 6e 20 2a 70  rse, ExprSpan *p
8c50: 53 70 61 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Span){.  Table *
8c60: 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  p;.  Column *pCo
8c70: 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  l;.  sqlite3 *db
8c80: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
8c90: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
8ca0: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 21  wTable;.  if( p!
8cb0: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d  =0 ){.    pCol =
8cc0: 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43   &(p->aCol[p->nC
8cd0: 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28 20  ol-1]);.    if( 
8ce0: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
8cf0: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
8d00: 28 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 20 29  (pSpan->pExpr) )
8d10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
8d20: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
8d30: 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f  "default value o
8d40: 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73  f column [%s] is
8d50: 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a   not constant",.
8d60: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
8d70: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
8d80: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 63 6f  e{.      /* A co
8d90: 70 79 20 6f 66 20 70 45 78 70 72 20 69 73 20 75  py of pExpr is u
8da0: 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74  sed instead of t
8db0: 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20  he original, as 
8dc0: 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20  pExpr contains. 
8dd0: 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74       ** tokens t
8de0: 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c  hat point to vol
8df0: 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 20 54 68  atile memory. Th
8e00: 65 20 27 73 70 61 6e 27 20 6f 66 20 74 68 65 20  e 'span' of the 
8e10: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 20  expression.     
8e20: 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 20   ** is required 
8e30: 62 79 20 70 72 61 67 6d 61 20 74 61 62 6c 65 5f  by pragma table_
8e40: 69 6e 66 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  info..      */. 
8e50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8e60: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d  Delete(db, pCol-
8e70: 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 70  >pDflt);.      p
8e80: 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c  Col->pDflt = sql
8e90: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
8ea0: 70 53 70 61 6e 2d 3e 70 45 78 70 72 2c 20 45 58  pSpan->pExpr, EX
8eb0: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
8ec0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
8ed0: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66  ee(db, pCol->zDf
8ee0: 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  lt);.      pCol-
8ef0: 3e 7a 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33  >zDflt = sqlite3
8f00: 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
8f10: 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61  har*)pSpan->zSta
8f20: 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rt,.            
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f40: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70           (int)(p
8f50: 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70  Span->zEnd - pSp
8f60: 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20  an->zStart));.  
8f70: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
8f80: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
8f90: 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 3b 0a 7d  pSpan->pExpr);.}
8fa0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74  ../*.** Designat
8fb0: 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  e the PRIMARY KE
8fc0: 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  Y for the table.
8fd0: 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73    pList is a lis
8fe0: 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f  t of names .** o
8ff0: 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66  f columns that f
9000: 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20  orm the primary 
9010: 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69  key.  If pList i
9020: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  s NULL, then the
9030: 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  .** most recentl
9040: 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f  y added column o
9050: 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 74  f the table is t
9060: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a  he primary key..
9070: 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61  **.** A table ca
9080: 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f  n have at most o
9090: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  ne primary key. 
90a0: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c   If the table al
90b0: 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70  ready has.** a p
90c0: 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20  rimary key (and 
90d0: 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f  this is the seco
90e0: 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20  nd primary key) 
90f0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a  then create an.*
9100: 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  * error..**.** I
9110: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
9120: 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65  Y is on a single
9130: 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61   column whose da
9140: 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47 45  tatype is INTEGE
9150: 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69  R,.** then we wi
9160: 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  ll try to use th
9170: 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65  at column as the
9180: 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65   rowid.  Set the
9190: 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20   Table.iPKey.** 
91a0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62  field of the tab
91b0: 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
91c0: 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20  ction to be the 
91d0: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
91e0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
91f0: 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62  KEY column.  Tab
9200: 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20  le.iPKey is set 
9210: 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69  to -1 if there i
9220: 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20  s.** no INTEGER 
9230: 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a  PRIMARY KEY..**.
9240: 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73  ** If the key is
9250: 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20   not an INTEGER 
9260: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
9270: 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  n create a uniqu
9280: 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74  e.** index for t
9290: 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65  he key.  No inde
92a0: 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72  x is created for
92b0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
92c0: 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   KEYs..*/.void s
92d0: 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79  qlite3AddPrimary
92e0: 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Key(.  Parse *pP
92f0: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
9300: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9310: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
9320: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69  ,  /* List of fi
9330: 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20  eld names to be 
9340: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
9350: 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
9360: 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
9370: 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63  h a uniqueness c
9380: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74  onflict */.  int
9390: 20 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f   autoInc,      /
93a0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41 55  * True if the AU
93b0: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77  TOINCREMENT keyw
93c0: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
93d0: 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
93e0: 72 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  r     /* SQLITE_
93f0: 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45  SO_ASC or SQLITE
9400: 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20  _SO_DESC */.){. 
9410: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
9420: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
9430: 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20  ;.  char *zType 
9440: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20  = 0;.  int iCol 
9450: 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20 70  = -1, i;.  if( p
9460: 54 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43  Tab==0 || IN_DEC
9470: 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f  LARE_VTAB ) goto
9480: 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69   primary_key_exi
9490: 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74  t;.  if( pTab->t
94a0: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73  abFlags & TF_Has
94b0: 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20  PrimaryKey ){.  
94c0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
94d0: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
94e0: 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68   "table \"%s\" h
94f0: 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  as more than one
9500: 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70   primary key", p
9510: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
9520: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
9530: 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54  y_exit;.  }.  pT
9540: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
9550: 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79  TF_HasPrimaryKey
9560: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
9570: 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
9580: 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20  Tab->nCol - 1;. 
9590: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43     pTab->aCol[iC
95a0: 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20  ol].isPrimKey = 
95b0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
95c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
95d0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
95e0: 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b       for(iCol=0;
95f0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
9600: 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
9610: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
9620: 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
9630: 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61  ].zName, pTab->a
9640: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29  Col[iCol].zName)
9650: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
9660: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
9670: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
9680: 69 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  if( iCol<pTab->n
9690: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Col ){.        p
96a0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
96b0: 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20  isPrimKey = 1;. 
96c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
96d0: 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70   if( pList->nExp
96e0: 72 3e 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b  r>1 ) iCol = -1;
96f0: 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e  .  }.  if( iCol>
9700: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
9710: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79  >nCol ){.    zTy
9720: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
9730: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d  iCol].zType;.  }
9740: 0a 20 20 69 66 28 20 7a 54 79 70 65 20 26 26 20  .  if( zType && 
9750: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
9760: 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29  Type, "INTEGER")
9770: 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 73  ==0.        && s
9780: 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45  ortOrder==SQLITE
9790: 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 70  _SO_ASC ){.    p
97a0: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f  Tab->iPKey = iCo
97b0: 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79  l;.    pTab->key
97c0: 43 6f 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72 72  Conf = (u8)onErr
97d0: 6f 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  or;.    assert( 
97e0: 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75  autoInc==0 || au
97f0: 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20  toInc==1 );.    
9800: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
9810: 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74  = autoInc*TF_Aut
9820: 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 7d 65  oincrement;.  }e
9830: 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20  lse if( autoInc 
9840: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
9850: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
9860: 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33  MENT.    sqlite3
9870: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
9880: 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20   "AUTOINCREMENT 
9890: 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20  is only allowed 
98a0: 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22  on an ".       "
98b0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
98c0: 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  KEY");.#endif.  
98d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65 78  }else{.    Index
98e0: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c   *p;.    p = sql
98f0: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
9900: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c  pParse, 0, 0, 0,
9910: 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c   pList, onError,
9920: 20 30 2c 20 30 2c 20 73 6f 72 74 4f 72 64 65 72   0, 0, sortOrder
9930: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 20  , 0);.    if( p 
9940: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  ){.      p->auto
9950: 49 6e 64 65 78 20 3d 20 32 3b 0a 20 20 20 20 7d  Index = 2;.    }
9960: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a  .    pList = 0;.
9970: 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79    }..primary_key
9980: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
9990: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
99a0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74  Parse->db, pList
99b0: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
99c0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
99d0: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
99e0: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
99f0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
9a00: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
9a10: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 68  oid sqlite3AddCh
9a20: 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20  eckConstraint(. 
9a30: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9a40: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
9a50: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
9a60: 2a 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20  *pCheckExpr  /* 
9a70: 54 68 65 20 63 68 65 63 6b 20 65 78 70 72 65 73  The check expres
9a80: 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  sion */.){.  sql
9a90: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9aa0: 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53  e->db;.#ifndef S
9ab0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
9ac0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
9ad0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
9ae0: 6c 65 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26  le;.  if( pTab &
9af0: 26 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  & !IN_DECLARE_VT
9b00: 41 42 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  AB ){.    pTab->
9b10: 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33  pCheck = sqlite3
9b20: 45 78 70 72 41 6e 64 28 64 62 2c 20 70 54 61 62  ExprAnd(db, pTab
9b30: 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68 65 63 6b  ->pCheck, pCheck
9b40: 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  Expr);.  }else.#
9b50: 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71  endif.  {.    sq
9b60: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
9b70: 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b  db, pCheckExpr);
9b80: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
9b90: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  t the collation 
9ba0: 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  function of the 
9bb0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61  most recently pa
9bc0: 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d  rsed table colum
9bd0: 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c  n.** to the Coll
9be0: 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f  Seq given..*/.vo
9bf0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
9c00: 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a  lateType(Parse *
9c10: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
9c20: 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20  Token){.  Table 
9c30: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
9c40: 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20  har *zColl;     
9c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71 75           /* Dequ
9c60: 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c  oted name of col
9c70: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
9c80: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
9c90: 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  ;..  if( (p = pP
9ca0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
9cb0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
9cc0: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
9cd0: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
9ce0: 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69  ;.  zColl = sqli
9cf0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
9d00: 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  (db, pToken);.  
9d10: 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74  if( !zColl ) ret
9d20: 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  urn;..  if( sqli
9d30: 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
9d40: 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20  (pParse, zColl) 
9d50: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
9d60: 64 78 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b  dx;.    p->aCol[
9d70: 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c  i].zColl = zColl
9d80: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  ;.  .    /* If t
9d90: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63  he column is dec
9da0: 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e  lared as "<name>
9db0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c   PRIMARY KEY COL
9dc0: 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20  LATE <type>",.  
9dd0: 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64    ** then an ind
9de0: 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ex may have been
9df0: 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73   created on this
9e00: 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74   column before t
9e10: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74  he.    ** collat
9e20: 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64  ion type was add
9e30: 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73  ed. Correct this
9e40: 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61   if it is the ca
9e50: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  se..    */.    f
9e60: 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65  or(pIdx=p->pInde
9e70: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
9e80: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
9e90: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
9ea0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
9eb0: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
9ec0: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a  Column[0]==i ){.
9ed0: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
9ee0: 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f  Coll[0] = p->aCo
9ef0: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[i].zColl;.    
9f00: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
9f10: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  e{.    sqlite3Db
9f20: 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
9f30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
9f40: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
9f50: 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  rns the collatio
9f60: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64  n sequence for d
9f70: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74  atabase native t
9f80: 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20  ext.** encoding 
9f90: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
9fa0: 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20  e string zName, 
9fb0: 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a  length nName..**
9fc0: 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
9fd0: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  sted collation s
9fe0: 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61  equence is not a
9ff0: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74  vailable, or not
a000: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e   available.** in
a010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
a020: 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74  tive encoding, t
a030: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
a040: 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20  tory is invoked 
a050: 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74  to.** request it
a060: 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  . If the collati
a070: 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20  on factory does 
a080: 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20  not supply such 
a090: 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61  a sequence,.** a
a0a0: 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  nd the sequence 
a0b0: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
a0c0: 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63  another text enc
a0d0: 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74  oding, then that
a0e0: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
a0f0: 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
a100: 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66  f no versions of
a110: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
a120: 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e  ollations sequen
a130: 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ce are available
a140: 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20  , or.** another 
a150: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
a160: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
a170: 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nd an error mess
a180: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
a190: 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a  .** pParse..**.*
a1a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
a1b0: 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
a1c0: 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  nd sqlite3FindCo
a1d0: 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20 72  llSeq().  This r
a1e0: 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65  outine.** invoke
a1f0: 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
a200: 66 61 63 74 6f 72 79 20 69 66 20 74 68 65 20 6e  factory if the n
a210: 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63  amed collation c
a220: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a  annot be found.*
a230: 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 20  * and generates 
a240: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
a250: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
a260: 3a 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  : sqlite3FindCol
a270: 6c 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33 47  lSeq(), sqlite3G
a280: 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43  etCollSeq().*/.C
a290: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c  ollSeq *sqlite3L
a2a0: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72  ocateCollSeq(Par
a2b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
a2c0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
a2d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
a2e0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38  pParse->db;.  u8
a2f0: 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a   enc = ENC(db);.
a300: 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20    u8 initbusy = 
a310: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20  db->init.busy;. 
a320: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
a330: 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
a340: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
a350: 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69  b, enc, zName, i
a360: 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20  nitbusy);.  if( 
a370: 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70  !initbusy && (!p
a380: 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e  Coll || !pColl->
a390: 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f  xCmp) ){.    pCo
a3a0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43  ll = sqlite3GetC
a3b0: 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20  ollSeq(db, enc, 
a3c0: 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20  pColl, zName);. 
a3d0: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
a3e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
a3f0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
a400: 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f  no such collatio
a410: 6e 20 73 65 71 75 65 6e 63 65 3a 20 25 73 22 2c  n sequence: %s",
a420: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   zName);.    }. 
a430: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 6f   }..  return pCo
a440: 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  ll;.}.../*.** Ge
a450: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
a460: 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20   will increment 
a470: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
a480: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68  e..**.** The sch
a490: 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73  ema cookie is us
a4a0: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
a4b0: 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20  when the schema 
a4c0: 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  for the.** datab
a4d0: 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66  ase changes.  Af
a4e0: 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61 20  ter each schema 
a4f0: 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b  change, the cook
a500: 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e  ie value.** chan
a510: 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f  ges.  When a pro
a520: 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64 73  cess first reads
a530: 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20 72   the schema it r
a540: 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f  ecords the.** co
a550: 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74 65  okie.  Thereafte
a560: 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20 67  r, whenever it g
a570: 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68  oes to access th
a580: 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69  e database,.** i
a590: 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f  t checks the coo
a5a0: 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  kie to make sure
a5b0: 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20   the schema has 
a5c0: 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73  not changed.** s
a5d0: 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74  ince it was last
a5e0: 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   read..**.** Thi
a5f0: 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f  s plan is not co
a600: 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d  mpletely bullet-
a610: 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f  proof.  It is po
a620: 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68  ssible for.** th
a630: 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e  e schema to chan
a640: 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ge multiple time
a650: 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f  s and for the co
a660: 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65  okie to be.** se
a670: 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20  t back to prior 
a680: 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65  value.  But sche
a690: 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20 69  ma changes are i
a6a0: 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64  nfrequent.** and
a6b0: 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
a6c0: 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65 20   of hitting the 
a6d0: 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75  same cookie valu
a6e0: 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63  e is only.** 1 c
a6f0: 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20  hance in 2^32.  
a700: 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65 6e  So we're safe en
a710: 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ough..*/.void sq
a720: 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
a730: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
a740: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e 74   int iDb){.  int
a750: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
a760: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
a770: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
a780: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56   pParse->db;.  V
a790: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
a7a0: 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
a7b0: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
a7c0: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
a7d0: 2c 20 30 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  , 0) );.  sqlite
a7e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a7f0: 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61  P_Integer, db->a
a800: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
a810: 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31  >schema_cookie+1
a820: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
a830: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
a840: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
a850: 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45   BTREE_SCHEMA_VE
a860: 52 53 49 4f 4e 2c 20 72 31 29 3b 0a 20 20 73 71  RSION, r1);.  sq
a870: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
a880: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
a890: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72  .}../*.** Measur
a8a0: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
a8b0: 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65  characters neede
a8c0: 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20  d to output the 
a8d0: 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66  given.** identif
a8e0: 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ier.  The number
a8f0: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
a900: 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73  es any quotes us
a910: 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e  ed.** but does n
a920: 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  ot include the n
a930: 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  ull terminator..
a940: 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61  **.** The estima
a950: 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69  te is conservati
a960: 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65  ve.  It might be
a970: 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68 61   larger that wha
a980: 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e  t is.** really n
a990: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
a9a0: 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68   int identLength
a9b0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
a9c0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28  .  int n;.  for(
a9d0: 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b  n=0; *z; n++, z+
a9e0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  +){.    if( *z==
a9f0: 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20  '"' ){ n++; }.  
aa00: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32  }.  return n + 2
aa10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
aa20: 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 69  irst parameter i
aa30: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
aa40: 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e  n output buffer.
aa50: 20 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   The second .** 
aa60: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
aa70: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74  ointer to an int
aa80: 65 67 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69  eger that contai
aa90: 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20 61 74  ns the offset at
aaa0: 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20 77 72 69  .** which to wri
aab0: 74 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  te into the outp
aac0: 75 74 20 62 75 66 66 65 72 2e 20 54 68 69 73 20  ut buffer. This 
aad0: 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73 20  function copies 
aae0: 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  the.** nul-termi
aaf0: 6e 61 74 65 64 20 73 74 72 69 6e 67 20 70 6f 69  nated string poi
ab00: 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 74  nted to by the t
ab10: 68 69 72 64 20 70 61 72 61 6d 65 74 65 72 2c 20  hird parameter, 
ab20: 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a  zSignedIdent,.**
ab30: 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
ab40: 64 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  d offset in the 
ab50: 62 75 66 66 65 72 20 61 6e 64 20 75 70 64 61 74  buffer and updat
ab60: 65 73 20 2a 70 49 64 78 20 74 6f 20 72 65 66 65  es *pIdx to refe
ab70: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73  r.** to the firs
ab80: 74 20 62 79 74 65 20 61 66 74 65 72 20 74 68 65  t byte after the
ab90: 20 6c 61 73 74 20 62 79 74 65 20 77 72 69 74 74   last byte writt
aba0: 65 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  en before return
abb0: 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  ing..** .** If t
abc0: 68 65 20 73 74 72 69 6e 67 20 7a 53 69 67 6e 65  he string zSigne
abd0: 64 49 64 65 6e 74 20 63 6f 6e 73 69 73 74 73 20  dIdent consists 
abe0: 65 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c 70 68  entirely of alph
abf0: 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68 61  a-numeric.** cha
ac00: 72 61 63 74 65 72 73 2c 20 64 6f 65 73 20 6e 6f  racters, does no
ac10: 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 64  t begin with a d
ac20: 69 67 69 74 20 61 6e 64 20 69 73 20 6e 6f 74 20  igit and is not 
ac30: 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c 0a  an SQL keyword,.
ac40: 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f  ** then it is co
ac50: 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70  pied to the outp
ac60: 75 74 20 62 75 66 66 65 72 20 65 78 61 63 74 6c  ut buffer exactl
ac70: 79 20 61 73 20 69 74 20 69 73 2e 20 4f 74 68 65  y as it is. Othe
ac80: 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20  rwise,.** it is 
ac90: 71 75 6f 74 65 64 20 75 73 69 6e 67 20 64 6f 75  quoted using dou
aca0: 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73  ble-quotes..*/.s
acb0: 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74  tatic void ident
acc0: 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74  Put(char *z, int
acd0: 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53   *pIdx, char *zS
ace0: 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75  ignedIdent){.  u
acf0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49  nsigned char *zI
ad00: 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  dent = (unsigned
ad10: 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64   char*)zSignedId
ad20: 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  ent;.  int i, j,
ad30: 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20   needQuote;.  i 
ad40: 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72 28  = *pIdx;..  for(
ad50: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
ad60: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73  j++){.    if( !s
ad70: 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 49  qlite3Isalnum(zI
ad80: 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65  dent[j]) && zIde
ad90: 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65  nt[j]!='_' ) bre
ada0: 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75  ak;.  }.  needQu
adb0: 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 49 73 64  ote = sqlite3Isd
adc0: 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 20  igit(zIdent[0]) 
add0: 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72  || sqlite3Keywor
ade0: 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29  dCode(zIdent, j)
adf0: 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20 21  !=TK_ID;.  if( !
ae00: 6e 65 65 64 51 75 6f 74 65 20 29 7b 0a 20 20 20  needQuote ){.   
ae10: 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 7a 49 64   needQuote = zId
ae20: 65 6e 74 5b 6a 5d 3b 0a 20 20 7d 0a 0a 20 20 69  ent[j];.  }..  i
ae30: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
ae40: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66  [i++] = '"';.  f
ae50: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
ae60: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69  ]; j++){.    z[i
ae70: 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b  ++] = zIdent[j];
ae80: 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b  .    if( zIdent[
ae90: 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d  j]=='"' ) z[i++]
aea0: 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66   = '"';.  }.  if
aeb0: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
aec0: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b  i++] = '"';.  z[
aed0: 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20  i] = 0;.  *pIdx 
aee0: 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = i;.}../*.** Ge
aef0: 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20  nerate a CREATE 
af00: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
af10: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
af20: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62  the given.** tab
af30: 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68  le.  Memory to h
af40: 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20  old the text of 
af50: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
af60: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f   obtained.** fro
af70: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
af80: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
af90: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
afa0: 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  g function..*/.s
afb0: 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61  tatic char *crea
afc0: 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71 6c 69  teTableStmt(sqli
afd0: 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  te3 *db, Table *
afe0: 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20  p){.  int i, k, 
aff0: 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  n;.  char *zStmt
b000: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20  ;.  char *zSep, 
b010: 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20  *zSep2, *zEnd;. 
b020: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
b030: 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   n = 0;.  for(pC
b040: 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d  ol = p->aCol, i=
b050: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
b060: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
b070: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
b080: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20  (pCol->zName) + 
b090: 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64  5;.  }.  n += id
b0a0: 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61  entLength(p->zNa
b0b0: 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20  me);.  if( n<50 
b0c0: 29 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d 20 22  ){ .    zSep = "
b0d0: 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22  ";.    zSep2 = "
b0e0: 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22  ,";.    zEnd = "
b0f0: 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  )";.  }else{.   
b100: 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a   zSep = "\n  ";.
b110: 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e      zSep2 = ",\n
b120: 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20    ";.    zEnd = 
b130: 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b  "\n)";.  }.  n +
b140: 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c  = 35 + 6*p->nCol
b150: 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69  ;.  zStmt = sqli
b160: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30  te3DbMallocRaw(0
b170: 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d  , n);.  if( zStm
b180: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  t==0 ){.    db->
b190: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
b1a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
b1b0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e    }.  sqlite3_sn
b1c0: 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c  printf(n, zStmt,
b1d0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22   "CREATE TABLE "
b1e0: 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65 33  );.  k = sqlite3
b1f0: 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29 3b  Strlen30(zStmt);
b200: 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d  .  identPut(zStm
b210: 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29  t, &k, p->zName)
b220: 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d  ;.  zStmt[k++] =
b230: 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c   '(';.  for(pCol
b240: 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69  =p->aCol, i=0; i
b250: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  <p->nCol; i++, p
b260: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74  Col++){.    stat
b270: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  ic const char * 
b280: 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20 3d  const azType[] =
b290: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51   {.        /* SQ
b2a0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20  LITE_AFF_TEXT   
b2b0: 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20 20 20   */ " TEXT",.   
b2c0: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
b2d0: 46 46 5f 4e 4f 4e 45 20 20 20 20 2a 2f 20 22 22  FF_NONE    */ ""
b2e0: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
b2f0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
b300: 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20 20  */ " NUM",.     
b310: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
b320: 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20 49 4e  _INTEGER */ " IN
b330: 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  T",.        /* S
b340: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20  QLITE_AFF_REAL  
b350: 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20 20    */ " REAL".   
b360: 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b   };.    int len;
b370: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
b380: 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c  *zType;..    sql
b390: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d  ite3_snprintf(n-
b3a0: 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53  k, &zStmt[k], zS
b3b0: 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71  ep);.    k += sq
b3c0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a  lite3Strlen30(&z
b3d0: 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53  Stmt[k]);.    zS
b3e0: 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20  ep = zSep2;.    
b3f0: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
b400: 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  &k, pCol->zName)
b410: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
b420: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c  ol->affinity-SQL
b430: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 3e 3d 20  ITE_AFF_TEXT >= 
b440: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
b450: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d   pCol->affinity-
b460: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
b470: 3c 20 41 72 72 61 79 53 69 7a 65 28 61 7a 54 79  < ArraySize(azTy
b480: 70 65 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63  pe) );.    testc
b490: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
b4a0: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
b4b0: 54 45 58 54 20 29 3b 0a 20 20 20 20 74 65 73 74  TEXT );.    test
b4c0: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
b4d0: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
b4e0: 5f 4e 4f 4e 45 20 29 3b 0a 20 20 20 20 74 65 73  _NONE );.    tes
b4f0: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
b500: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
b510: 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20  F_NUMERIC );.   
b520: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
b530: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
b540: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b  E_AFF_INTEGER );
b550: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
b560: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
b570: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29  QLITE_AFF_REAL )
b580: 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79 70 65  ;.    .    zType
b590: 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e   = azType[pCol->
b5a0: 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c 49 54  affinity - SQLIT
b5b0: 45 5f 41 46 46 5f 54 45 58 54 5d 3b 0a 20 20 20  E_AFF_TEXT];.   
b5c0: 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74   len = sqlite3St
b5d0: 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20  rlen30(zType);. 
b5e0: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
b5f0: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
b600: 45 5f 41 46 46 5f 4e 4f 4e 45 20 0a 20 20 20 20  E_AFF_NONE .    
b610: 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c 2d          || pCol-
b620: 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69 74  >affinity==sqlit
b630: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a  e3AffinityType(z
b640: 54 79 70 65 29 20 29 3b 0a 20 20 20 20 6d 65 6d  Type) );.    mem
b650: 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  cpy(&zStmt[k], z
b660: 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  Type, len);.    
b670: 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61 73  k += len;.    as
b680: 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20  sert( k<=n );.  
b690: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  }.  sqlite3_snpr
b6a0: 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74  intf(n-k, &zStmt
b6b0: 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29  [k], "%s", zEnd)
b6c0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74  ;.  return zStmt
b6d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
b6e0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
b6f0: 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20  d to report the 
b700: 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74  final ")" that t
b710: 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43  erminates.** a C
b720: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
b730: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ement..**.** The
b740: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
b750: 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74 69   that other acti
b760: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65  on routines have
b770: 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a   been building.*
b780: 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  * is added to th
b790: 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  e internal hash 
b7a0: 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67  tables, assuming
b7b0: 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a   no errors have.
b7c0: 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a  ** occurred..**.
b7d0: 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20  ** An entry for 
b7e0: 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64  the table is mad
b7f0: 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20  e in the master 
b800: 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75  table on disk, u
b810: 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73  nless.** this is
b820: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
b830: 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62  le or db->init.b
b840: 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62  usy==1.  When db
b850: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a  ->init.busy==1.*
b860: 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  * it means we ar
b870: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71  e reading the sq
b880: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
b890: 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  e because we jus
b8a0: 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74  t.** connected t
b8b0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  o the database o
b8c0: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71  r because the sq
b8d0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
b8e0: 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c  e has.** recentl
b8f0: 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68  y changed, so th
b900: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73  e entry for this
b910: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65   table already e
b920: 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20  xists in.** the 
b930: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
b940: 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  ble.  We do not 
b950: 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69  want to create i
b960: 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49  t again..**.** I
b970: 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61 72  f the pSelect ar
b980: 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  gument is not NU
b990: 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  LL, it means tha
b9a0: 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
b9b0: 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  * was called to 
b9c0: 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 67  create a table g
b9d0: 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20  enerated from a 
b9e0: 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c  .** "CREATE TABL
b9f0: 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20  E ... AS SELECT 
ba00: 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20  ..." statement. 
ba10: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   The column name
ba20: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  s of.** the new 
ba30: 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68  table will match
ba40: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
ba50: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  of the SELECT..*
ba60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e  /.void sqlite3En
ba70: 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  dTable(.  Parse 
ba80: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
ba90: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
baa0: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
bab0: 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20  Cons,           
bac0: 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e  /* The ',' token
bad0: 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20   after the last 
bae0: 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a  column defn. */.
baf0: 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20    Token *pEnd,  
bb00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
bb10: 20 66 69 6e 61 6c 20 27 29 27 20 74 6f 6b 65 6e   final ')' token
bb20: 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54   in the CREATE T
bb30: 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ABLE */.  Select
bb40: 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20   *pSelect       
bb50: 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d    /* Select from
bb60: 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41   a "CREATE ... A
bb70: 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a  S SELECT" */.){.
bb80: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71    Table *p;.  sq
bb90: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
bba0: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
bbb0: 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e 64 3d  b;..  if( (pEnd=
bbc0: 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30  =0 && pSelect==0
bbd0: 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ) || db->mallocF
bbe0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
bbf0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 70  urn;.  }.  p = p
bc00: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
bc10: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
bc20: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
bc30: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
bc40: 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a   || !pSelect );.
bc50: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
bc60: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
bc70: 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a  , p->pSchema);..
bc80: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
bc90: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52  MIT_CHECK.  /* R
bca0: 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20  esolve names in 
bcb0: 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  all CHECK constr
bcc0: 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73  aint expressions
bcd0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
bce0: 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 53 72  pCheck ){.    Sr
bcf0: 63 4c 69 73 74 20 73 53 72 63 3b 20 20 20 20 20  cList sSrc;     
bd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bd10: 20 46 61 6b 65 20 53 72 63 4c 69 73 74 20 66 6f   Fake SrcList fo
bd20: 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  r pParse->pNewTa
bd30: 62 6c 65 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43  ble */.    NameC
bd40: 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20  ontext sNC;     
bd50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
bd60: 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
bd70: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
bd80: 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28   */..    memset(
bd90: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
bda0: 73 4e 43 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65  sNC));.    memse
bdb0: 74 28 26 73 53 72 63 2c 20 30 2c 20 73 69 7a 65  t(&sSrc, 0, size
bdc0: 6f 66 28 73 53 72 63 29 29 3b 0a 20 20 20 20 73  of(sSrc));.    s
bdd0: 53 72 63 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 20  Src.nSrc = 1;.  
bde0: 20 20 73 53 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d    sSrc.a[0].zNam
bdf0: 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  e = p->zName;.  
be00: 20 20 73 53 72 63 2e 61 5b 30 5d 2e 70 54 61 62    sSrc.a[0].pTab
be10: 20 3d 20 70 3b 0a 20 20 20 20 73 53 72 63 2e 61   = p;.    sSrc.a
be20: 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31  [0].iCursor = -1
be30: 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65  ;.    sNC.pParse
be40: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73   = pParse;.    s
be50: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 26 73  NC.pSrcList = &s
be60: 53 72 63 3b 0a 20 20 20 20 73 4e 43 2e 69 73 43  Src;.    sNC.isC
be70: 68 65 63 6b 20 3d 20 31 3b 0a 20 20 20 20 69 66  heck = 1;.    if
be80: 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  ( sqlite3Resolve
be90: 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20  ExprNames(&sNC, 
bea0: 70 2d 3e 70 43 68 65 63 6b 29 20 29 7b 0a 20 20  p->pCheck) ){.  
beb0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
bec0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
bed0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
bee0: 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a  OMIT_CHECK) */..
bef0: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
bf00: 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69  init.busy is 1 i
bf10: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
bf20: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
bf30: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
bf40: 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22  ite_master" or "
bf50: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
bf60: 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
bf70: 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64   disk..  ** So d
bf80: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
bf90: 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20  he disk again.  
bfa0: 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74  Extract the root
bfb0: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
bfc0: 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  * for the table 
bfd0: 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69  from the db->ini
bfe0: 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e  t.newTnum field.
bff0: 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62    (The page numb
c000: 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68  er.  ** should h
c010: 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65  ave been put the
c020: 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  re by the sqlite
c030: 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29  OpenCb routine.)
c040: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
c050: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
c060: 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69   p->tnum = db->i
c070: 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d  nit.newTnum;.  }
c080: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e  ..  /* If not in
c090: 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e  itializing, then
c0a0: 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64   create a record
c0b0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
c0c0: 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53  le.  ** in the S
c0d0: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
c0e0: 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  le of the databa
c0f0: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  se..  **.  ** If
c100: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f   this is a TEMPO
c110: 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74  RARY table, writ
c120: 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f  e the entry into
c130: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20   the auxiliary. 
c140: 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64   ** file instead
c150: 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69   of into the mai
c160: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
c170: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
c180: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
c190: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62    int n;.    Vdb
c1a0: 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a  e *v;.    char *
c1b0: 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69  zType;    /* "vi
c1c0: 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a  ew" or "table" *
c1d0: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  /.    char *zTyp
c1e0: 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20  e2;   /* "VIEW" 
c1f0: 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20  or "TABLE" */.  
c200: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20    char *zStmt;  
c210: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
c220: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72   CREATE TABLE or
c230: 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
c240: 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76  tement */..    v
c250: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
c260: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
c270: 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
c280: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71   return;..    sq
c290: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
c2a0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b  v, OP_Close, 0);
c2b0: 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a  ..    /* .    **
c2c0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70   Initialize zTyp
c2d0: 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69  e for the new vi
c2e0: 65 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20  ew or table..   
c2f0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
c300: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
c310: 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20     /* A regular 
c320: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a  table */.      z
c330: 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a  Type = "table";.
c340: 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22        zType2 = "
c350: 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20  TABLE";.#ifndef 
c360: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
c370: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c380: 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20    /* A view */. 
c390: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69       zType = "vi
c3a0: 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  ew";.      zType
c3b0: 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64  2 = "VIEW";.#end
c3c0: 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
c3d0: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 43 52   If this is a CR
c3e0: 45 41 54 45 20 54 41 42 4c 45 20 78 78 20 41 53  EATE TABLE xx AS
c3f0: 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65   SELECT ..., exe
c400: 63 75 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a  cute the SELECT.
c410: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
c420: 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65   to populate the
c430: 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20   new table. The 
c440: 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
c450: 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20   for the.    ** 
c460: 6e 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e 20  new table is in 
c470: 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d  register pParse-
c480: 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a  >regRoot..    **
c490: 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65  .    ** Once the
c4a0: 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e   SELECT has been
c4b0: 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65   coded by sqlite
c4c0: 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73  3Select(), it is
c4d0: 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69   in a.    ** sui
c4e0: 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71  table state to q
c4f0: 75 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  uery for the col
c500: 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79  umn names and ty
c510: 70 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20  pes to be used. 
c520: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77     ** by the new
c530: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20   table..    **. 
c540: 20 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63     ** A shared-c
c550: 61 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ache write-lock 
c560: 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  is not required 
c570: 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
c580: 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a  new table,.    *
c590: 2a 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f  * as a schema-lo
c5a0: 63 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  ck must have alr
c5b0: 65 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e  eady been obtain
c5c0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e  ed to create it.
c5d0: 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20   Since.    ** a 
c5e0: 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c  schema-lock excl
c5f0: 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64  udes all other d
c600: 61 74 61 62 61 73 65 20 75 73 65 72 73 2c 20 74  atabase users, t
c610: 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f  he write-lock wo
c620: 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65  uld.    ** be re
c630: 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a  dundant..    */.
c640: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
c650: 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  ){.      SelectD
c660: 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20  est dest;.      
c670: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a  Table *pSelTab;.
c680: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50  .      assert(pP
c690: 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a  arse->nTab==1);.
c6a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c6b0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
c6c0: 65 6e 57 72 69 74 65 2c 20 31 2c 20 70 50 61 72  enWrite, 1, pPar
c6d0: 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44 62  se->regRoot, iDb
c6e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c6f0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
c700: 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  1);.      pParse
c710: 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20  ->nTab = 2;.    
c720: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
c730: 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
c740: 52 54 5f 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20  RT_Table, 1);.  
c750: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
c760: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
c770: 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  t, &dest);.     
c780: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c790: 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
c7a0: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  1);.      if( pP
c7b0: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b  arse->nErr==0 ){
c7c0: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
c7d0: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
c7e0: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
c7f0: 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  se, pSelect);.  
c800: 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61        if( pSelTa
c810: 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  b==0 ) return;. 
c820: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
c830: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
c840: 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70       p->nCol = p
c850: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
c860: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20        p->aCol = 
c870: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
c880: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e         pSelTab->
c890: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
c8a0: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
c8b0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
c8c0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
c8d0: 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  db, pSelTab);.  
c8e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
c8f0: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
c900: 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
c910: 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74   the CREATE stat
c920: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28  ement */.    if(
c930: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
c940: 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65    zStmt = create
c950: 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20 70 29  TableStmt(db, p)
c960: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c970: 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e     n = (int)(pEn
c980: 64 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73  d->z - pParse->s
c990: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31  NameToken.z) + 1
c9a0: 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  ;.      zStmt = 
c9b0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
c9c0: 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 43  b, .          "C
c9d0: 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20  REATE %s %.*s", 
c9e0: 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73  zType2, n, pPars
c9f0: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a  e->sNameToken.z.
ca00: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
ca10: 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f      /* A slot fo
ca20: 72 20 74 68 65 20 72 65 63 6f 72 64 20 68 61 73  r the record has
ca30: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
ca40: 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a  located in the .
ca50: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41      ** SQLITE_MA
ca60: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20  STER table.  We 
ca70: 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64  just need to upd
ca80: 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69  ate that slot wi
ca90: 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68  th all.    ** th
caa0: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65  e information we
cab0: 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 0a 20  've collected.. 
cac0: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
cad0: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
cae0: 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50 44 41  rse,.      "UPDA
caf0: 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20 20 20  TE %Q.%s ".     
cb00: 20 20 20 20 22 53 45 54 20 74 79 70 65 3d 27 25      "SET type='%
cb10: 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c  s', name=%Q, tbl
cb20: 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61  _name=%Q, rootpa
cb30: 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20 22  ge=#%d, sql=%Q "
cb40: 0a 20 20 20 20 20 20 20 22 57 48 45 52 45 20 72  .       "WHERE r
cb50: 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20 20 20  owid=#%d",.     
cb60: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
cb70: 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
cb80: 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 7a 54  E(iDb),.      zT
cb90: 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e  ype,.      p->zN
cba0: 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e  ame,.      p->zN
cbb0: 61 6d 65 2c 0a 20 20 20 20 20 20 70 50 61 72 73  ame,.      pPars
cbc0: 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20 20  e->regRoot,.    
cbd0: 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 70    zStmt,.      p
cbe0: 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a  Parse->regRowid.
cbf0: 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
cc00: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74  e3DbFree(db, zSt
cc10: 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mt);.    sqlite3
cc20: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
cc30: 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e  rse, iDb);..#ifn
cc40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cc50: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
cc60: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
cc70: 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  e if we need to 
cc80: 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65  create an sqlite
cc90: 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
cca0: 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69  for.    ** keepi
ccb0: 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f  ng track of auto
ccc0: 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a  increment keys..
ccd0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
cce0: 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
ccf0: 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b  Autoincrement ){
cd00: 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d  .      Db *pDb =
cd10: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
cd20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
cd30: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
cd40: 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
cd50: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44   );.      if( pD
cd60: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71  b->pSchema->pSeq
cd70: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
cd80: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
cd90: 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
cda0: 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54         "CREATE T
cdb0: 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f 73  ABLE %Q.sqlite_s
cdc0: 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71  equence(name,seq
cdd0: 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44  )",.          pD
cde0: 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20  b->zName.       
cdf0: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
ce00: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
ce10: 20 52 65 70 61 72 73 65 20 65 76 65 72 79 74 68   Reparse everyth
ce20: 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75  ing to update ou
ce30: 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20  r internal data 
ce40: 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20  structures */.  
ce50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ce60: 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c  ParseSchemaOp(v,
ce70: 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20   iDb,.          
ce80: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
ce90: 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d  ntf(db, "tbl_nam
cea0: 65 3d 27 25 71 27 22 2c 20 70 2d 3e 7a 4e 61 6d  e='%q'", p->zNam
ceb0: 65 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  e));.  }...  /* 
cec0: 41 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f  Add the table to
ced0: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
cee0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
cef0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
cf00: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
cf10: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 54  it.busy ){.    T
cf20: 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20  able *pOld;.    
cf30: 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20  Schema *pSchema 
cf40: 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  = p->pSchema;.  
cf50: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
cf60: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
cf70: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
cf80: 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
cf90: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 53  e3HashInsert(&pS
cfa0: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
cfb0: 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  p->zName,.      
cfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74         sqlite3St
cfe0: 72 6c 65 6e 33 30 28 70 2d 3e 7a 4e 61 6d 65 29  rlen30(p->zName)
cff0: 2c 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  ,p);.    if( pOl
d000: 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  d ){.      asser
d010: 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f  t( p==pOld );  /
d020: 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
d030: 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65  ve failed inside
d040: 20 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f   HashInsert() */
d050: 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  .      db->mallo
d060: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
d070: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
d080: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  .    pParse->pNe
d090: 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  wTable = 0;.    
d0a0: 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20  db->nTable++;.  
d0b0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
d0c0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
d0d0: 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ges;..#ifndef SQ
d0e0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54  LITE_OMIT_ALTERT
d0f0: 41 42 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d  ABLE.    if( !p-
d100: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
d110: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
d120: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
d130: 72 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d  r *)pParse->sNam
d140: 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20  eToken.z;.      
d150: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20  int nName;.     
d160: 20 61 73 73 65 72 74 28 20 21 70 53 65 6c 65 63   assert( !pSelec
d170: 74 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45  t && pCons && pE
d180: 6e 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nd );.      if( 
d190: 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  pCons->z==0 ){. 
d1a0: 20 20 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70         pCons = p
d1b0: 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  End;.      }.   
d1c0: 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29     nName = (int)
d1d0: 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70  ((const char *)p
d1e0: 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29  Cons->z - zName)
d1f0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f  ;.      p->addCo
d200: 6c 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73  lOffset = 13 + s
d210: 71 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c 65  qlite3Utf8CharLe
d220: 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  n(zName, nName);
d230: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
d240: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
d250: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
d260: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
d270: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
d280: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72  e in order to cr
d290: 65 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a  eate a new VIEW.
d2a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
d2b0: 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72  reateView(.  Par
d2c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d2d0: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
d2e0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
d2f0: 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f  n *pBegin,     /
d300: 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
d310: 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74  en that begins t
d320: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
d330: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
d340: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65       /* The toke
d350: 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  n that holds the
d360: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65   name of the vie
d370: 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  w */.  Token *pN
d380: 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame2,     /* The
d390: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
d3a0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
d3b0: 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65  e view */.  Sele
d3c0: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f  ct *pSelect,   /
d3d0: 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65  * A SELECT state
d3e0: 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62  ment that will b
d3f0: 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69  ecome the new vi
d400: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  ew */.  int isTe
d410: 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 52  mp,        /* TR
d420: 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41  UE for a TEMPORA
d430: 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  RY view */.  int
d440: 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20 20   noErr          
d450: 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72 72 6f  /* Suppress erro
d460: 72 20 6d 65 73 73 61 67 65 73 20 69 66 20 56 49  r messages if VI
d470: 45 57 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  EW already exist
d480: 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  s */.){.  Table 
d490: 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63  *p;.  int n;.  c
d4a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
d4b0: 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62  Token sEnd;.  Db
d4c0: 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f  Fixer sFix;.  To
d4d0: 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 20 20 69 6e  ken *pName;.  in
d4e0: 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33  t iDb;.  sqlite3
d4f0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d500: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
d510: 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20 20  ->nVar>0 ){.    
d520: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
d530: 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65 74  pParse, "paramet
d540: 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f  ers are not allo
d550: 77 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b 0a  wed in views");.
d560: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
d570: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
d580: 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ect);.    return
d590: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
d5a0: 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65  tartTable(pParse
d5b0: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
d5c0: 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20  , isTemp, 1, 0, 
d5d0: 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50  noErr);.  p = pP
d5e0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
d5f0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
d600: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
d610: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
d620: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65  Delete(db, pSele
d630: 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ct);.    return;
d640: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 77  .  }.  sqlite3Tw
d650: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
d660: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
d670: 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62  , &pName);.  iDb
d680: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
d690: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70  ToIndex(db, p->p
d6a0: 53 63 68 65 6d 61 29 3b 0a 20 20 69 66 28 20 73  Schema);.  if( s
d6b0: 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
d6c0: 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62  Fix, pParse, iDb
d6d0: 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29  , "view", pName)
d6e0: 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 46  .    && sqlite3F
d6f0: 69 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20  ixSelect(&sFix, 
d700: 70 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20  pSelect).  ){.  
d710: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
d720: 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63  elete(db, pSelec
d730: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
d740: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61    }..  /* Make a
d750: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74   copy of the ent
d760: 69 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ire SELECT state
d770: 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
d780: 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a  s the view..  **
d790: 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65   This will force
d7a0: 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f   all the Expr.to
d7b0: 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20  ken.z values to 
d7c0: 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20  be dynamically. 
d7d0: 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61   ** allocated ra
d7e0: 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20  ther than point 
d7f0: 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  to the input str
d800: 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e  ing - which mean
d810: 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79  s that.  ** they
d820: 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66   will persist af
d830: 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ter the current 
d840: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63  sqlite3_exec() c
d850: 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a  all returns..  *
d860: 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d  /.  p->pSelect =
d870: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
d880: 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c 20 45  p(db, pSelect, E
d890: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
d8a0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
d8b0: 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63  elete(db, pSelec
d8c0: 74 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  t);.  if( db->ma
d8d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
d8e0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
d8f0: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
d900: 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  sy ){.    sqlite
d910: 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
d920: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  mes(pParse, p);.
d930: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
d940: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
d950: 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74  CREATE VIEW stat
d960: 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e  ement.  Make sEn
d970: 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20  d point to.  ** 
d980: 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20  the end..  */.  
d990: 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73  sEnd = pParse->s
d9a0: 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28  LastToken;.  if(
d9b0: 20 41 4c 57 41 59 53 28 73 45 6e 64 2e 7a 5b 30   ALWAYS(sEnd.z[0
d9c0: 5d 21 3d 30 29 20 26 26 20 73 45 6e 64 2e 7a 5b  ]!=0) && sEnd.z[
d9d0: 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73  0]!=';' ){.    s
d9e0: 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b  End.z += sEnd.n;
d9f0: 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  .  }.  sEnd.n = 
da00: 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28 73  0;.  n = (int)(s
da10: 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e  End.z - pBegin->
da20: 7a 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e  z);.  z = pBegin
da30: 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 41 4c  ->z;.  while( AL
da40: 57 41 59 53 28 6e 3e 30 29 20 26 26 20 73 71 6c  WAYS(n>0) && sql
da50: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d  ite3Isspace(z[n-
da60: 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  1]) ){ n--; }.  
da70: 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d  sEnd.z = &z[n-1]
da80: 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a  ;.  sEnd.n = 1;.
da90: 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65  .  /* Use sqlite
daa0: 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61  3EndTable() to a
dab0: 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20 74  dd the view to t
dac0: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
dad0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
dae0: 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72  te3EndTable(pPar
daf0: 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 29  se, 0, &sEnd, 0)
db00: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65  ;.  return;.}.#e
db10: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
db20: 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66  MIT_VIEW */..#if
db30: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
db40: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
db50: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
db60: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
db70: 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c  )./*.** The Tabl
db80: 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61 62  e structure pTab
db90: 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56  le is really a V
dba0: 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68  IEW.  Fill in th
dbb0: 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68  e names of.** th
dbc0: 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
dbd0: 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54 61   view in the pTa
dbe0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  ble structure.  
dbf0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
dc00: 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20  r.** of errors. 
dc10: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
dc20: 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72  seen leave an er
dc30: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
dc40: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
dc50: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69  */.int sqlite3Vi
dc60: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
dc70: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
dc80: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
dc90: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
dca0: 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61  ;   /* A fake ta
dcb0: 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77  ble from which w
dcc0: 65 20 67 65 74 20 74 68 65 20 72 65 73 75 6c 74  e get the result
dcd0: 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74   set */.  Select
dce0: 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43   *pSel;     /* C
dcf0: 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
dd00: 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  T that implement
dd10: 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  s the view */.  
dd20: 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20  int nErr = 0;   
dd30: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
dd40: 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65  rrors encountere
dd50: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  d */.  int n;   
dd60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
dd70: 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68  orarily holds th
dd80: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  e number of curs
dd90: 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a  ors assigned */.
dda0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
ddb0: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20  pParse->db;  /* 
ddc0: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
ddd0: 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65  ion for malloc e
dde0: 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 28  rrors */.  int (
ddf0: 2a 78 41 75 74 68 29 28 76 6f 69 64 2a 2c 69 6e  *xAuth)(void*,in
de00: 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  t,const char*,co
de10: 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20  nst char*,const 
de20: 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72  char*,const char
de30: 2a 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *);..  assert( p
de40: 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65  Table );..#ifnde
de50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
de60: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
de70: 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c   sqlite3VtabCall
de80: 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20  Connect(pParse, 
de90: 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72  pTable) ){.    r
dea0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
deb0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73  OR;.  }.  if( Is
dec0: 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20  Virtual(pTable) 
ded0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
dee0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
def0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f  TE_OMIT_VIEW.  /
df00: 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f  * A positive nCo
df10: 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75  l means the colu
df20: 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68  mns names for th
df30: 69 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a  is view are.  **
df40: 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a   already known..
df50: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
df60: 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75  e->nCol>0 ) retu
df70: 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65  rn 0;..  /* A ne
df80: 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61  gative nCol is a
df90: 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20   special marker 
dfa0: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20  meaning that we 
dfb0: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  are currently.  
dfc0: 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d  ** trying to com
dfd0: 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  pute the column 
dfe0: 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e  names.  If we en
dff0: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
e000: 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67   with.  ** a neg
e010: 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d  ative nCol, it m
e020: 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65  eans two or more
e030: 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f   views form a lo
e040: 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20  op, like this:. 
e050: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45   **.  **     CRE
e060: 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20  ATE VIEW one AS 
e070: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77  SELECT * FROM tw
e080: 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  o;.  **     CREA
e090: 54 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53  TE VIEW two AS S
e0a0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65  ELECT * FROM one
e0b0: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75  ;.  **.  ** Actu
e0c0: 61 6c 6c 79 2c 20 74 68 65 20 65 72 72 6f 72 20  ally, the error 
e0d0: 61 62 6f 76 65 20 69 73 20 6e 6f 77 20 63 61 75  above is now cau
e0e0: 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61  ght prior to rea
e0f0: 63 68 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74  ching this point
e100: 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 66  ..  ** But the f
e110: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20 69 73  ollowing test is
e120: 20 73 74 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74   still important
e130: 20 61 73 20 69 74 20 64 6f 65 73 20 63 6f 6d 65   as it does come
e140: 20 75 70 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20   up.  ** in the 
e150: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20  following:.  ** 
e160: 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
e170: 20 54 41 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28   TABLE main.ex1(
e180: 61 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  a);.  **     CRE
e190: 41 54 45 20 54 45 4d 50 20 56 49 45 57 20 65 78  ATE TEMP VIEW ex
e1a0: 31 20 41 53 20 53 45 4c 45 43 54 20 61 20 46 52  1 AS SELECT a FR
e1b0: 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20  OM ex1;.  **    
e1c0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
e1d0: 65 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20  emp.ex1;.  */.  
e1e0: 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
e1f0: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
e200: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
e210: 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69  , "view %s is ci
e220: 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64  rcularly defined
e230: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
e240: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
e250: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
e260: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29  Table->nCol>=0 )
e270: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65  ;..  /* If we ge
e280: 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
e290: 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20  eans we need to 
e2a0: 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c  compute the tabl
e2b0: 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f  e names..  ** No
e2c0: 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  te that the call
e2d0: 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c   to sqlite3Resul
e2e0: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77  tSetOfSelect() w
e2f0: 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20  ill expand any. 
e300: 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73   ** "*" elements
e310: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20   in the results 
e320: 73 65 74 20 6f 66 20 74 68 65 20 76 69 65 77 20  set of the view 
e330: 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20  and will assign 
e340: 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20  cursors.  ** to 
e350: 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  the elements of 
e360: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
e370: 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20    But we do not 
e380: 77 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67  want these chang
e390: 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65  es.  ** to be pe
e3a0: 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65  rmanent.  So the
e3b0: 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
e3c0: 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f  done on a copy o
e3d0: 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a  f the SELECT.  *
e3e0: 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  * statement that
e3f0: 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
e400: 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  w..  */.  assert
e410: 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  ( pTable->pSelec
e420: 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71  t );.  pSel = sq
e430: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
e440: 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  b, pTable->pSele
e450: 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53  ct, 0);.  if( pS
e460: 65 6c 20 29 7b 0a 20 20 20 20 75 38 20 65 6e 61  el ){.    u8 ena
e470: 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 64  bleLookaside = d
e480: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
e490: 61 62 6c 65 64 3b 0a 20 20 20 20 6e 20 3d 20 70  abled;.    n = p
e4a0: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20  Parse->nTab;.   
e4b0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
e4c0: 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
e4d0: 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29  rse, pSel->pSrc)
e4e0: 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43  ;.    pTable->nC
e4f0: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 64 62 2d  ol = -1;.    db-
e500: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
e510: 6c 65 64 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  led = 0;.#ifndef
e520: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
e530: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 78  HORIZATION.    x
e540: 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75 74 68  Auth = db->xAuth
e550: 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20  ;.    db->xAuth 
e560: 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62  = 0;.    pSelTab
e570: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
e580: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
e590: 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 64  se, pSel);.    d
e5a0: 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68  b->xAuth = xAuth
e5b0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 53 65 6c  ;.#else.    pSel
e5c0: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
e5d0: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
e5e0: 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 23 65  Parse, pSel);.#e
e5f0: 6e 64 69 66 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  ndif.    db->loo
e600: 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20  kaside.bEnabled 
e610: 3d 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64  = enableLookasid
e620: 65 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  e;.    pParse->n
e630: 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28  Tab = n;.    if(
e640: 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20   pSelTab ){.    
e650: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
e660: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
e670: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
e680: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
e690: 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61  .      pTable->a
e6a0: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
e6b0: 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  Col;.      pSelT
e6c0: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
e6d0: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
e6e0: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  l = 0;.      sql
e6f0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
e700: 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  db, pSelTab);.  
e710: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
e720: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
e730: 6c 64 28 64 62 2c 20 30 2c 20 70 54 61 62 6c 65  ld(db, 0, pTable
e740: 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
e750: 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68      pTable->pSch
e760: 65 6d 61 2d 3e 66 6c 61 67 73 20 7c 3d 20 44 42  ema->flags |= DB
e770: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 20  _UnresetViews;. 
e780: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e790: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
e7a0: 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  ;.      nErr++;.
e7b0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
e7c0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
e7d0: 2c 20 70 53 65 6c 29 3b 0a 20 20 7d 20 65 6c 73  , pSel);.  } els
e7e0: 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  e {.    nErr++;.
e7f0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
e800: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
e810: 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  /.  return nErr;
e820: 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21    .}.#endif /* !
e830: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
e840: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
e850: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e860: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
e870: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
e880: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
e890: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c  ** Clear the col
e8a0: 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65  umn names from e
e8b0: 76 65 72 79 20 56 49 45 57 20 69 6e 20 64 61 74  very VIEW in dat
e8c0: 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74  abase idx..*/.st
e8d0: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
e8e0: 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c  ViewResetAll(sql
e8f0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64  ite3 *db, int id
e900: 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  x){.  HashElem *
e910: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  i;.  assert( sql
e920: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
e930: 65 6c 64 28 64 62 2c 20 69 64 78 2c 20 30 29 20  eld(db, idx, 0) 
e940: 29 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73 50  );.  if( !DbHasP
e950: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c  roperty(db, idx,
e960: 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
e970: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  ) ) return;.  fo
e980: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
e990: 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78  rst(&db->aDb[idx
e9a0: 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ].pSchema->tblHa
e9b0: 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48  sh); i;i=sqliteH
e9c0: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
e9d0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
e9e0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29  qliteHashData(i)
e9f0: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
ea00: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
ea10: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 43 6f 6c   sqliteDeleteCol
ea20: 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54 61  umnNames(db, pTa
ea30: 62 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  b);.      pTab->
ea40: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  aCol = 0;.      
ea50: 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  pTab->nCol = 0;.
ea60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c      }.  }.  DbCl
ea70: 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20  earProperty(db, 
ea80: 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56  idx, DB_UnresetV
ea90: 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  iews);.}.#else.#
eaa0: 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69   define sqliteVi
eab0: 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a  ewResetAll(A,B).
eac0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
ead0: 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f  _OMIT_VIEW */../
eae0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
eaf0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
eb00: 74 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75  the VDBE to adju
eb10: 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  st the internal 
eb20: 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62  schema.** used b
eb30: 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68  y SQLite when th
eb40: 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f  e btree layer mo
eb50: 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74  ves a table root
eb60: 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f   page. The.** ro
eb70: 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62  ot-page of a tab
eb80: 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64  le or index in d
eb90: 61 74 61 62 61 73 65 20 69 44 62 20 68 61 73 20  atabase iDb has 
eba0: 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72  changed from iFr
ebb0: 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a  om.** to iTo..**
ebc0: 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31 37 32 38  .** Ticket #1728
ebd0: 3a 20 20 54 68 65 20 73 79 6d 62 6f 6c 20 74 61  :  The symbol ta
ebe0: 62 6c 65 20 6d 69 67 68 74 20 73 74 69 6c 6c 20  ble might still 
ebf0: 63 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74  contain informat
ec00: 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73  ion.** on tables
ec10: 20 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73 20   and/or indices 
ec20: 74 68 61 74 20 61 72 65 20 74 68 65 20 70 72 6f  that are the pro
ec30: 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 64 65  cess of being de
ec40: 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75  leted..** If you
ec50: 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e   are unlucky, on
ec60: 65 20 6f 66 20 74 68 6f 73 65 20 64 65 6c 65 74  e of those delet
ec70: 65 64 20 69 6e 64 69 63 65 73 20 6f 72 20 74 61  ed indices or ta
ec80: 62 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61  bles might.** ha
ec90: 76 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74  ve the same root
eca0: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 74  page number as t
ecb0: 68 65 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72  he real table or
ecc0: 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a 2a   index that is.*
ecd0: 2a 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20  * being moved.  
ece0: 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f  So we cannot sto
ecf0: 70 20 73 65 61 72 63 68 69 6e 67 20 61 66 74 65  p searching afte
ed00: 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  r the first matc
ed10: 68 20 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68  h .** because th
ed20: 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 6d 69  e first match mi
ed30: 67 68 74 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f  ght be for one o
ed40: 66 20 74 68 65 20 64 65 6c 65 74 65 64 20 69 6e  f the deleted in
ed50: 64 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c  dices.** or tabl
ed60: 65 73 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74  es and not the t
ed70: 61 62 6c 65 2f 69 6e 64 65 78 20 74 68 61 74 20  able/index that 
ed80: 69 73 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  is actually bein
ed90: 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d  g moved..** We m
eda0: 75 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f  ust continue loo
edb0: 70 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74  ping until all t
edc0: 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65  ables and indice
edd0: 73 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61  s with.** rootpa
ede0: 67 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20 62  ge==iFrom have b
edf0: 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 74 6f  een converted to
ee00: 20 68 61 76 65 20 61 20 72 6f 6f 74 70 61 67 65   have a rootpage
ee10: 20 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72   of iTo.** in or
ee20: 64 65 72 20 74 6f 20 62 65 20 63 65 72 74 61 69  der to be certai
ee30: 6e 20 74 68 61 74 20 77 65 20 67 6f 74 20 74 68  n that we got th
ee40: 65 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a  e right one..*/.
ee50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ee60: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76  MIT_AUTOVACUUM.v
ee70: 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50  oid sqlite3RootP
ee80: 61 67 65 4d 6f 76 65 64 28 73 71 6c 69 74 65 33  ageMoved(sqlite3
ee90: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69   *db, int iDb, i
eea0: 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
eeb0: 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  o){.  HashElem *
eec0: 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70  pElem;.  Hash *p
eed0: 48 61 73 68 3b 0a 20 20 44 62 20 2a 70 44 62 3b  Hash;.  Db *pDb;
eee0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
eef0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
ef00: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
ef10: 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
ef20: 44 62 5b 69 44 62 5d 3b 0a 20 20 70 48 61 73 68  Db[iDb];.  pHash
ef30: 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61   = &pDb->pSchema
ef40: 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72  ->tblHash;.  for
ef50: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
ef60: 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70  hFirst(pHash); p
ef70: 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
ef80: 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
ef90: 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  )){.    Table *p
efa0: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
efb0: 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
efc0: 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d   if( pTab->tnum=
efd0: 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
efe0: 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f  pTab->tnum = iTo
eff0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48  ;.    }.  }.  pH
f000: 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68  ash = &pDb->pSch
f010: 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20  ema->idxHash;.  
f020: 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65  for(pElem=sqlite
f030: 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29  HashFirst(pHash)
f040: 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
f050: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
f060: 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78  lem)){.    Index
f070: 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48   *pIdx = sqliteH
f080: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
f090: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e      if( pIdx->tn
f0a0: 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  um==iFrom ){.   
f0b0: 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20     pIdx->tnum = 
f0c0: 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  iTo;.    }.  }.}
f0d0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
f0e0: 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61  rite code to era
f0f0: 73 65 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  se the table wit
f100: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
f110: 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  le from database
f120: 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72   iDb..** Also wr
f130: 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69  ite code to modi
f140: 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  fy the sqlite_ma
f150: 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69  ster table and i
f160: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a  nternal schema.*
f170: 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65  * if a root-page
f180: 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   of another tabl
f190: 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68  e is moved by th
f1a0: 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68  e btree-layer wh
f1b0: 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20  ilst.** erasing 
f1c0: 69 54 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e  iTable (this can
f1d0: 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20   happen with an 
f1e0: 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
f1f0: 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69  base)..*/ .stati
f200: 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f  c void destroyRo
f210: 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a 70 50  otPage(Parse *pP
f220: 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65  arse, int iTable
f230: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
f240: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
f250: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
f260: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
f270: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
f280: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rse);.  sqlite3V
f290: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
f2a0: 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c  Destroy, iTable,
f2b0: 20 72 31 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c   r1, iDb);.  sql
f2c0: 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
f2d0: 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  rse);.#ifndef SQ
f2e0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
f2f0: 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73  CUUM.  /* OP_Des
f300: 74 72 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69  troy stores an i
f310: 6e 20 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66  n integer r1. If
f320: 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20   this integer.  
f330: 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ** is non-zero, 
f340: 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72  then it is the r
f350: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
f360: 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64  of a table moved
f370: 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f   to.  ** locatio
f380: 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f  n iTable. The fo
f390: 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64  llowing code mod
f3a0: 69 66 69 65 73 20 74 68 65 20 73 71 6c 69 74 65  ifies the sqlite
f3b0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f  _master table to
f3c0: 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68  .  ** reflect th
f3d0: 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  is..  **.  ** Th
f3e0: 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20  e "#NNN" in the 
f3f0: 53 51 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c  SQL is a special
f400: 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d   constant that m
f410: 65 61 6e 73 20 77 68 61 74 65 76 65 72 20 76 61  eans whatever va
f420: 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72  lue.  ** is in r
f430: 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65  egister NNN.  Se
f440: 65 20 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 20  e grammar rules 
f450: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
f460: 74 68 65 20 54 4b 5f 52 45 47 49 53 54 45 52 0a  the TK_REGISTER.
f470: 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61    ** token for a
f480: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
f490: 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71  ation..  */.  sq
f4a0: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
f4b0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22  (pParse, .     "
f4c0: 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54  UPDATE %Q.%s SET
f4d0: 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45   rootpage=%d WHE
f4e0: 52 45 20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70  RE #%d AND rootp
f4f0: 61 67 65 3d 23 25 64 22 2c 0a 20 20 20 20 20 70  age=#%d",.     p
f500: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
f510: 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
f520: 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69 54  A_TABLE(iDb), iT
f530: 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23  able, r1, r1);.#
f540: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 52  endif.  sqlite3R
f550: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
f560: 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a  arse, r1);.}../*
f570: 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20 63  .** Write VDBE c
f580: 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61 62  ode to erase tab
f590: 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20  le pTab and all 
f5a0: 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63  associated indic
f5b0: 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43  es on disk..** C
f5c0: 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74 68  ode to update th
f5d0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
f5e0: 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72  tables and inter
f5f0: 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e  nal schema defin
f600: 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73  itions.** in cas
f610: 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65  e a root-page be
f620: 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68  longing to anoth
f630: 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
f640: 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 6c  d by the btree l
f650: 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20  ayer.** is also 
f660: 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e 20  added (this can 
f670: 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61  happen with an a
f680: 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
f690: 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ase)..*/.static 
f6a0: 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c  void destroyTabl
f6b0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
f6c0: 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23   Table *pTab){.#
f6d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
f6e0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 49  T_AUTOVACUUM.  I
f6f0: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e  ndex *pIdx;.  in
f700: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
f710: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
f720: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
f730: 53 63 68 65 6d 61 29 3b 0a 20 20 64 65 73 74 72  Schema);.  destr
f740: 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
f750: 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69  e, pTab->tnum, i
f760: 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  Db);.  for(pIdx=
f770: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
f780: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
f790: 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74 72  Next){.    destr
f7a0: 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
f7b0: 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  e, pIdx->tnum, i
f7c0: 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  Db);.  }.#else. 
f7d0: 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
f7e0: 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d  ase may be auto-
f7f0: 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28  vacuum capable (
f800: 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  if SQLITE_OMIT_A
f810: 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69  UTOVACUUM.  ** i
f820: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20  s not defined), 
f830: 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72  then it is impor
f840: 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f  tant to call OP_
f850: 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20  Destroy on the. 
f860: 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e   ** table and in
f870: 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69  dex root-pages i
f880: 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e  n order, startin
f890: 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72  g with the numer
f8a0: 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72  ically .  ** lar
f8b0: 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
f8c0: 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61 72  umber. This guar
f8d0: 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65  antees that none
f8e0: 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   of the root-pag
f8f0: 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65  es.  ** to be de
f900: 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63  stroyed is reloc
f910: 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ated by an earli
f920: 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69  er OP_Destroy. i
f930: 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  .e. if the.  ** 
f940: 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63  following were c
f950: 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  oded:.  **.  ** 
f960: 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20  OP_Destroy 4 0. 
f970: 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f   ** ....  ** OP_
f980: 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a  Destroy 5 0.  **
f990: 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70  .  ** and root p
f9a0: 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20 74  age 5 happened t
f9b0: 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73 74  o be the largest
f9c0: 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
f9d0: 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  r in the.  ** da
f9e0: 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f  tabase, then roo
f9f0: 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62  t page 5 would b
fa00: 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20  e moved to page 
fa10: 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22  4 by the .  ** "
fa20: 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20  OP_Destroy 4 0" 
fa30: 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73  opcode. The subs
fa40: 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72  equent "OP_Destr
fa50: 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69  oy 5 0" would hi
fa60: 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69  t.  ** a free-li
fa70: 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  st page..  */.  
fa80: 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d  int iTab = pTab-
fa90: 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65  >tnum;.  int iDe
faa0: 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20  stroyed = 0;..  
fab0: 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
fac0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
fad0: 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20   int iLargest = 
fae0: 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73  0;..    if( iDes
faf0: 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61  troyed==0 || iTa
fb00: 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a  b<iDestroyed ){.
fb10: 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d        iLargest =
fb20: 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20   iTab;.    }.   
fb30: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
fb40: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
fb50: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
fb60: 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20  .      int iIdx 
fb70: 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20  = pIdx->tnum;.  
fb80: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
fb90: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
fba0: 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
fbb0: 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79 65    if( (iDestroye
fbc0: 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44  d==0 || (iIdx<iD
fbd0: 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69 49  estroyed)) && iI
fbe0: 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20  dx>iLargest ){. 
fbf0: 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20         iLargest 
fc00: 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a  = iIdx;.      }.
fc10: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c      }.    if( iL
fc20: 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20  argest==0 ){.   
fc30: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
fc40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
fc50: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
fc60: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
fc70: 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
fc80: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 64 65 73  hema);.      des
fc90: 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
fca0: 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69  rse, iLargest, i
fcb0: 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74  Db);.      iDest
fcc0: 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74  royed = iLargest
fcd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
fce0: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  if.}../*.** Remo
fcf0: 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20  ve entries from 
fd00: 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31  the sqlite_stat1
fd10: 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74   and sqlite_stat
fd20: 32 20 74 61 62 6c 65 73 0a 2a 2a 20 61 66 74 65  2 tables.** afte
fd30: 72 20 61 20 44 52 4f 50 20 49 4e 44 45 58 20 6f  r a DROP INDEX o
fd40: 72 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d  r DROP TABLE com
fd50: 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mand..*/.static 
fd60: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61  void sqlite3Clea
fd70: 72 53 74 61 74 54 61 62 6c 65 73 28 0a 20 20 50  rStatTables(.  P
fd80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
fd90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
fda0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
fdb0: 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20    int iDb,      
fdc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
fdd0: 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  database number 
fde0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
fdf0: 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a 20 22  *zType,     /* "
fe00: 69 64 78 22 20 6f 72 20 22 74 62 6c 22 20 2a 2f  idx" or "tbl" */
fe10: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
fe20: 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20 4e 61 6d  Name      /* Nam
fe30: 65 20 6f 66 20 69 6e 64 65 78 20 6f 72 20 74 61  e of index or ta
fe40: 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74  ble */.){.  stat
fe50: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
fe60: 7a 53 74 61 74 54 61 62 5b 5d 20 3d 20 7b 20 0a  zStatTab[] = { .
fe70: 20 20 20 20 22 73 71 6c 69 74 65 5f 73 74 61 74      "sqlite_stat
fe80: 31 22 2c 0a 20 20 20 20 22 73 71 6c 69 74 65 5f  1",.    "sqlite_
fe90: 73 74 61 74 32 22 2c 0a 20 20 20 20 22 73 71 6c  stat2",.    "sql
fea0: 69 74 65 5f 73 74 61 74 33 22 2c 0a 20 20 7d 3b  ite_stat3",.  };
feb0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
fec0: 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20  t char *zDbName 
fed0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  = pParse->db->aD
fee0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
fef0: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
ff00: 53 69 7a 65 28 61 7a 53 74 61 74 54 61 62 29 3b  Size(azStatTab);
ff10: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
ff20: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
ff30: 70 50 61 72 73 65 2d 3e 64 62 2c 20 61 7a 53 74  pParse->db, azSt
ff40: 61 74 54 61 62 5b 69 5d 2c 20 7a 44 62 4e 61 6d  atTab[i], zDbNam
ff50: 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  e) ){.      sqli
ff60: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
ff70: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
ff80: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
ff90: 73 20 57 48 45 52 45 20 25 73 3d 25 51 22 2c 0a  s WHERE %s=%Q",.
ffa0: 20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c          zDbName,
ffb0: 20 61 7a 53 74 61 74 54 61 62 5b 69 5d 2c 20 7a   azStatTab[i], z
ffc0: 54 79 70 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20  Type, zName.    
ffd0: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d    );.    }.  }.}
ffe0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
fff0: 20 63 6f 64 65 20 74 6f 20 64 72 6f 70 20 61 20   code to drop a 
10000 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
10010 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61  qlite3CodeDropTa
10020 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
10030 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
10040 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 69 73 56  int iDb, int isV
10050 69 65 77 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  iew){.  Vdbe *v;
10060 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
10070 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 54   pParse->db;.  T
10080 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
10090 3b 0a 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64  ;.  Db *pDb = &d
100a0 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20  b->aDb[iDb];..  
100b0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
100c0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  be(pParse);.  as
100d0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
100e0 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
100f0 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
10100 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66  e, 1, iDb);..#if
10110 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10120 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
10130 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
10140 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ab) ){.    sqlit
10150 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
10160 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 7d 0a  OP_VBegin);.  }.
10170 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f  #endif..  /* Dro
10180 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61  p all triggers a
10190 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
101a0 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
101b0 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 2a  ropped. Code.  *
101c0 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74  * is generated t
101d0 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73  o remove entries
101e0 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73   from sqlite_mas
101f0 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20  ter and/or.  ** 
10200 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
10210 65 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a  er if required..
10220 20 20 2a 2f 0a 20 20 70 54 72 69 67 67 65 72 20    */.  pTrigger 
10230 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72  = sqlite3Trigger
10240 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 61  List(pParse, pTa
10250 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 54 72  b);.  while( pTr
10260 69 67 67 65 72 20 29 7b 0a 20 20 20 20 61 73 73  igger ){.    ass
10270 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70  ert( pTrigger->p
10280 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
10290 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20  chema || .      
102a0 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68    pTrigger->pSch
102b0 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e  ema==db->aDb[1].
102c0 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73  pSchema );.    s
102d0 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65  qlite3DropTrigge
102e0 72 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72  rPtr(pParse, pTr
102f0 69 67 67 65 72 29 3b 0a 20 20 20 20 70 54 72 69  igger);.    pTri
10300 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d  gger = pTrigger-
10310 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 23 69 66  >pNext;.  }..#if
10320 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10330 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
10340 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65   /* Remove any e
10350 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71  ntries of the sq
10360 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
10370 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
10380 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 74 61 62  ith.  ** the tab
10390 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
103a0 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62  . This is done b
103b0 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20  efore the table 
103c0 69 73 20 64 72 6f 70 70 65 64 0a 20 20 2a 2a 20  is dropped.  ** 
103d0 61 74 20 74 68 65 20 62 74 72 65 65 20 6c 65 76  at the btree lev
103e0 65 6c 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20  el, in case the 
103f0 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
10400 74 61 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20  table needs to. 
10410 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65   ** move as a re
10420 73 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70  sult of the drop
10430 20 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20   (can happen in 
10440 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
10450 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  )..  */.  if( pT
10460 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
10470 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  F_Autoincrement 
10480 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  ){.    sqlite3Ne
10490 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
104a0 2c 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20  ,.      "DELETE 
104b0 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73  FROM %Q.sqlite_s
104c0 65 71 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61  equence WHERE na
104d0 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 70 44  me=%Q",.      pD
104e0 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  b->zName, pTab->
104f0 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d  zName.    );.  }
10500 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72  .#endif..  /* Dr
10510 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41  op all SQLITE_MA
10520 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69  STER table and i
10530 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74 68 61  ndex entries tha
10540 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20  t refer to the. 
10550 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70   ** table. The p
10560 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70  rogram name loop
10570 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61  s through the ma
10580 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64  ster table and d
10590 65 6c 65 74 65 73 0a 20 20 2a 2a 20 65 76 65 72  eletes.  ** ever
105a0 79 20 72 6f 77 20 74 68 61 74 20 72 65 66 65 72  y row that refer
105b0 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20  s to a table of 
105c0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
105d0 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20   the one being. 
105e0 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69   ** dropped. Tri
105f0 67 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65  ggers are handle
10600 64 20 73 65 70 65 72 61 74 65 6c 79 20 62 65 63  d seperately bec
10610 61 75 73 65 20 61 20 74 72 69 67 67 65 72 20 63  ause a trigger c
10620 61 6e 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74  an be.  ** creat
10630 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64  ed in the temp d
10640 61 74 61 62 61 73 65 20 74 68 61 74 20 72 65 66  atabase that ref
10650 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69  ers to a table i
10660 6e 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 64  n another.  ** d
10670 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
10680 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
10690 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
106a0 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
106b0 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e  Q.%s WHERE tbl_n
106c0 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21  ame=%Q and type!
106d0 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20  ='trigger'",.   
106e0 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53     pDb->zName, S
106f0 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
10700 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
10710 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26    if( !isView &&
10720 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
10730 29 20 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79  ) ){.    destroy
10740 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
10750 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ab);.  }..  /* R
10760 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20  emove the table 
10770 65 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74  entry from SQLit
10780 65 27 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  e's internal sch
10790 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20  ema and modify. 
107a0 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 63   ** the schema c
107b0 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  ookie..  */.  if
107c0 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
107d0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
107e0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
107f0 5f 56 44 65 73 74 72 6f 79 2c 20 69 44 62 2c 20  _VDestroy, iDb, 
10800 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  0, 0, pTab->zNam
10810 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  e, 0);.  }.  sql
10820 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
10830 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20  , OP_DropTable, 
10840 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d  iDb, 0, 0, pTab-
10850 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71  >zName, 0);.  sq
10860 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
10870 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
10880 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65    sqliteViewRese
10890 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 0a  tAll(db, iDb);..
108a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
108b0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
108c0 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f  to do the work o
108d0 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73  f a DROP TABLE s
108e0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61  tatement..** pNa
108f0 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
10900 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
10910 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f  e dropped..*/.vo
10920 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61  id sqlite3DropTa
10930 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
10940 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d  e, SrcList *pNam
10950 65 2c 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69  e, int isView, i
10960 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62  nt noErr){.  Tab
10970 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65  le *pTab;.  Vdbe
10980 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
10990 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
109a0 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69  .  int iDb;..  i
109b0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
109c0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
109d0 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
109e0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
109f0 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
10a00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d  ;.  assert( pNam
10a10 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  e->nSrc==1 );.  
10a20 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e  if( noErr ) db->
10a30 73 75 70 70 72 65 73 73 45 72 72 2b 2b 3b 0a 20  suppressErr++;. 
10a40 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
10a50 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
10a60 65 2c 20 69 73 56 69 65 77 2c 20 0a 20 20 20 20  e, isView, .    
10a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a80 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 61          pName->a
10a90 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65  [0].zName, pName
10aa0 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
10ab0 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29  );.  if( noErr )
10ac0 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72   db->suppressErr
10ad0 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  --;..  if( pTab=
10ae0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f  =0 ){.    if( no
10af0 45 72 72 20 29 20 73 71 6c 69 74 65 33 43 6f 64  Err ) sqlite3Cod
10b00 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65  eVerifyNamedSche
10b10 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  ma(pParse, pName
10b20 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
10b30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
10b40 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
10b50 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
10b60 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
10b70 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
10b80 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
10b90 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
10ba0 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54  b );..  /* If pT
10bb0 61 62 20 69 73 20 61 20 76 69 72 74 75 61 6c 20  ab is a virtual 
10bc0 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77  table, call View
10bd0 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29  GetColumnNames()
10be0 20 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20   to ensure.  ** 
10bf0 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  it is initialize
10c00 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73  d..  */.  if( Is
10c10 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26  Virtual(pTab) &&
10c20 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
10c30 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
10c40 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20  e, pTab) ){.    
10c50 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
10c60 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  able;.  }.#ifnde
10c70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
10c80 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
10c90 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
10ca0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
10cb0 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c  ab = SCHEMA_TABL
10cc0 45 28 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73  E(iDb);.    cons
10cd0 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
10ce0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
10cf0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
10d00 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20 20 20   *zArg2 = 0;.   
10d10 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
10d20 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
10d30 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
10d40 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20  b, 0, zDb)){.   
10d50 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
10d60 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
10d70 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b     if( isView ){
10d80 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
10d90 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
10da0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  1 ){.        cod
10db0 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
10dc0 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  TEMP_VIEW;.     
10dd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10de0 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
10df0 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  OP_VIEW;.      }
10e00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10e10 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
10e20 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  E.    }else if( 
10e30 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
10e40 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 20 3d 20  ){.      code = 
10e50 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42  SQLITE_DROP_VTAB
10e60 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72 67 32 20  LE;.      zArg2 
10e70 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  = sqlite3GetVTab
10e80 6c 65 28 64 62 2c 20 70 54 61 62 29 2d 3e 70 4d  le(db, pTab)->pM
10e90 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69  od->zName;.#endi
10ea0 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
10eb0 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
10ec0 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
10ed0 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
10ee0 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
10ef0 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65  _TABLE;.      }e
10f00 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
10f10 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
10f20 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20  TABLE;.      }. 
10f30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
10f40 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
10f50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62  arse, code, pTab
10f60 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20  ->zName, zArg2, 
10f70 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
10f80 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
10f90 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  le;.    }.    if
10fa0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
10fb0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
10fc0 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e  E_DELETE, pTab->
10fd0 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29  zName, 0, zDb) )
10fe0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
10ff0 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
11000 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
11010 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65   if( !pParse->ne
11020 73 74 65 64 20 26 26 20 73 71 6c 69 74 65 33 53  sted && sqlite3S
11030 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e  trNICmp(pTab->zN
11040 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
11050 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  7)==0 ){.    sql
11060 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11070 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
11080 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  ay not be droppe
11090 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
110a0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
110b0 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
110c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
110d0 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45  OMIT_VIEW.  /* E
110e0 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45  nsure DROP TABLE
110f0 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20   is not used on 
11100 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50  a view, and DROP
11110 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65   VIEW is not use
11120 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c  d.  ** on a tabl
11130 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  e..  */.  if( is
11140 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53  View && pTab->pS
11150 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
11160 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
11170 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
11180 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74  P TABLE to delet
11190 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61  e table %s", pTa
111a0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
111b0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
111c0 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  ble;.  }.  if( !
111d0 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e  isView && pTab->
111e0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
111f0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
11200 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50  Parse, "use DROP
11210 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20   VIEW to delete 
11220 76 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e  view %s", pTab->
11230 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
11240 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
11250 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
11260 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
11270 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74   to remove the t
11280 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61  able from the ma
11290 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20  ster table.  ** 
112a0 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
112b0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
112c0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
112d0 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
112e0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
112f0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
11300 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
11310 65 33 46 6b 44 72 6f 70 54 61 62 6c 65 28 70 50  e3FkDropTable(pP
11320 61 72 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54 61  arse, pName, pTa
11330 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  b);.    sqlite3C
11340 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 70 50 61  odeDropTable(pPa
11350 72 73 65 2c 20 70 54 61 62 2c 20 69 44 62 2c 20  rse, pTab, iDb, 
11360 69 73 56 69 65 77 29 3b 0a 20 20 20 20 73 71 6c  isView);.    sql
11370 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62  ite3ClearStatTab
11380 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c  les(pParse, iDb,
11390 20 22 74 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e   "tbl", pTab->zN
113a0 61 6d 65 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f  ame);.  }..exit_
113b0 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71  drop_table:.  sq
113c0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
113d0 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d  te(db, pName);.}
113e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
113f0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
11400 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66  o create a new f
11410 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68  oreign key on th
11420 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65  e table.** curre
11430 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
11440 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43  ruction.  pFromC
11450 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  ol determines wh
11460 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69  ich columns.** i
11470 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  n the current ta
11480 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ble point to the
11490 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49   foreign key.  I
114a0 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68  f pFromCol==0 th
114b0 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68  en.** connect th
114c0 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73  e key to the las
114d0 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65  t column inserte
114e0 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e  d.  pTo is the n
114f0 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61  ame of.** the ta
11500 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e  ble referred to.
11510 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69    pToCol is a li
11520 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  st of tables in 
11530 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f  the other.** pTo
11540 20 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20   table that the 
11550 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e  foreign key poin
11560 74 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f  ts to.  flags co
11570 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e  ntains all.** in
11580 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
11590 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73  the conflict res
115a0 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
115b0 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  ms specified.** 
115c0 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45  in the ON DELETE
115d0 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20  , ON UPDATE and 
115e0 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65  ON INSERT clause
115f0 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79  s..**.** An FKey
11600 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72   structure is cr
11610 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64 20  eated and added 
11620 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
11630 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20  rently.** under 
11640 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20  construction in 
11650 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  the pParse->pNew
11660 54 61 62 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a  Table field..**.
11670 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b  ** The foreign k
11680 65 79 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d  ey is set for IM
11690 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73 73 69  MEDIATE processi
116a0 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e  ng.  A subsequen
116b0 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c  t call.** to sql
116c0 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
116d0 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e  Key() might chan
116e0 67 65 20 74 68 69 73 20 74 6f 20 44 45 46 45 52  ge this to DEFER
116f0 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  RED..*/.void sql
11700 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 69 67  ite3CreateForeig
11710 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70  nKey(.  Parse *p
11720 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
11730 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
11740 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
11750 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c  FromCol,  /* Col
11760 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62  umns in this tab
11770 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  le that point to
11780 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
11790 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20    Token *pTo,   
117a0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
117b0 66 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c  f the other tabl
117c0 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
117d0 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43  *pToCol,    /* C
117e0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74  olumns in the ot
117f0 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  her table */.  i
11800 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
11810 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20      /* Conflict 
11820 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72  resolution algor
11830 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73  ithms. */.){.  s
11840 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
11850 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66  rse->db;.#ifndef
11860 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
11870 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20  EIGN_KEY.  FKey 
11880 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 46 4b  *pFKey = 0;.  FK
11890 65 79 20 2a 70 4e 65 78 74 54 6f 3b 0a 20 20 54  ey *pNextTo;.  T
118a0 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65  able *p = pParse
118b0 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
118c0 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
118d0 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20  i;.  int nCol;. 
118e0 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73   char *z;..  ass
118f0 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20  ert( pTo!=0 );. 
11900 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 49 4e 5f   if( p==0 || IN_
11910 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67  DECLARE_VTAB ) g
11920 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66  oto fk_end;.  if
11930 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b  ( pFromCol==0 ){
11940 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  .    int iCol = 
11950 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69  p->nCol-1;.    i
11960 66 28 20 4e 45 56 45 52 28 69 43 6f 6c 3c 30 29  f( NEVER(iCol<0)
11970 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
11980 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26      if( pToCol &
11990 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21  & pToCol->nExpr!
119a0 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
119b0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
119c0 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79  se, "foreign key
119d0 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20   on %s".        
119e0 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65   " should refere
119f0 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c  nce only one col
11a00 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22  umn of table %T"
11a10 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43  ,.         p->aC
11a20 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20  ol[iCol].zName, 
11a30 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  pTo);.      goto
11a40 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20   fk_end;.    }. 
11a50 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d     nCol = 1;.  }
11a60 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20  else if( pToCol 
11a70 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72  && pToCol->nExpr
11a80 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70  !=pFromCol->nExp
11a90 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
11aa0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11ab0 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72  .        "number
11ac0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66   of columns in f
11ad0 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20  oreign key does 
11ae0 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75  not match the nu
11af0 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20  mber of ".      
11b00 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68    "columns in th
11b10 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  e referenced tab
11b20 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66  le");.    goto f
11b30 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  k_end;.  }else{.
11b40 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d      nCol = pFrom
11b50 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a  Col->nExpr;.  }.
11b60 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
11b70 28 2a 70 46 4b 65 79 29 20 2b 20 28 6e 43 6f 6c  (*pFKey) + (nCol
11b80 2d 31 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79  -1)*sizeof(pFKey
11b90 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f  ->aCol[0]) + pTo
11ba0 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70  ->n + 1;.  if( p
11bb0 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72  ToCol ){.    for
11bc0 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e  (i=0; i<pToCol->
11bd0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
11be0 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69     nByte += sqli
11bf0 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43  te3Strlen30(pToC
11c00 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20  ol->a[i].zName) 
11c10 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  + 1;.    }.  }. 
11c20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   pFKey = sqlite3
11c30 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
11c40 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
11c50 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20  pFKey==0 ){.    
11c60 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d  goto fk_end;.  }
11c70 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20  .  pFKey->pFrom 
11c80 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e  = p;.  pFKey->pN
11c90 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b  extFrom = p->pFK
11ca0 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a  ey;.  z = (char*
11cb0 29 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43  )&pFKey->aCol[nC
11cc0 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54  ol];.  pFKey->zT
11cd0 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28  o = z;.  memcpy(
11ce0 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e  z, pTo->z, pTo->
11cf0 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20  n);.  z[pTo->n] 
11d00 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  = 0;.  sqlite3De
11d10 71 75 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d  quote(z);.  z +=
11d20 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b   pTo->n+1;.  pFK
11d30 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b  ey->nCol = nCol;
11d40 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d  .  if( pFromCol=
11d50 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d  =0 ){.    pFKey-
11d60 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d  >aCol[0].iFrom =
11d70 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65   p->nCol-1;.  }e
11d80 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  lse{.    for(i=0
11d90 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
11da0 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
11db0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
11dc0 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
11dd0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
11de0 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b  StrICmp(p->aCol[
11df0 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43  j].zName, pFromC
11e00 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  ol->a[i].zName)=
11e10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11e20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  pFKey->aCol[i].i
11e30 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20  From = j;.      
11e40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
11e50 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
11e60 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f     if( j>=p->nCo
11e70 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
11e80 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11e90 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
11ea0 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20  "unknown column 
11eb0 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67  \"%s\" in foreig
11ec0 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
11ed0 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46  ", .          pF
11ee0 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
11ef0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
11f00 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20  o fk_end;.      
11f10 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
11f20 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
11f30 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
11f40 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
11f50 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
11f60 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  en30(pToCol->a[i
11f70 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
11f80 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  pFKey->aCol[i].z
11f90 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d  Col = z;.      m
11fa0 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d  emcpy(z, pToCol-
11fb0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b  >a[i].zName, n);
11fc0 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b  .      z[n] = 0;
11fd0 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b  .      z += n+1;
11fe0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
11ff0 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
12000 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63   0;.  pFKey->aAc
12010 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28 66  tion[0] = (u8)(f
12020 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20 20 20  lags & 0xff);   
12030 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 44           /* ON D
12040 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a  ELETE action */.
12050 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e    pFKey->aAction
12060 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c 61 67  [1] = (u8)((flag
12070 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 29  s >> 8 ) & 0xff)
12080 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54  ;    /* ON UPDAT
12090 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61  E action */..  a
120a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
120b0 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
120c0 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  , 0, p->pSchema)
120d0 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d 20   );.  pNextTo = 
120e0 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65 33 48  (FKey *)sqlite3H
120f0 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53  ashInsert(&p->pS
12100 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c  chema->fkeyHash,
12110 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a   .      pFKey->z
12120 54 6f 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  To, sqlite3Strle
12130 6e 33 30 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2c  n30(pFKey->zTo),
12140 20 28 76 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20   (void *)pFKey. 
12150 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 78 74 54   );.  if( pNextT
12160 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a 20 20 20 20  o==pFKey ){.    
12170 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
12180 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 66   = 1;.    goto f
12190 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  k_end;.  }.  if(
121a0 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20 20 20   pNextTo ){.    
121b0 61 73 73 65 72 74 28 20 70 4e 65 78 74 54 6f 2d  assert( pNextTo-
121c0 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20  >pPrevTo==0 );. 
121d0 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54     pFKey->pNextT
121e0 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20  o = pNextTo;.   
121f0 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54   pNextTo->pPrevT
12200 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a  o = pFKey;.  }..
12210 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f    /* Link the fo
12220 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65  reign key to the
12230 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61   table as the la
12240 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20  st step..  */.  
12250 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79  p->pFKey = pFKey
12260 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a  ;.  pFKey = 0;..
12270 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65  fk_end:.  sqlite
12280 33 44 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65  3DbFree(db, pFKe
12290 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  y);.#endif /* !d
122a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
122b0 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20  IT_FOREIGN_KEY) 
122c0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
122d0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
122e0 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  FromCol);.  sqli
122f0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
12300 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d  e(db, pToCol);.}
12310 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
12320 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
12330 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59  hen an INITIALLY
12340 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e   IMMEDIATE or IN
12350 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
12360 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65  .** clause is se
12370 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  en as part of a 
12380 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
12390 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44  nition.  The isD
123a0 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d  eferred.** param
123b0 65 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e  eter is 1 for IN
123c0 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
123d0 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49   and 0 for INITI
123e0 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a  ALLY IMMEDIATE..
123f0 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20  ** The behavior 
12400 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
12410 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72  ntly created for
12420 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75  eign key is adju
12430 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e  sted.** accordin
12440 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  gly..*/.void sql
12450 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
12460 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  Key(Parse *pPars
12470 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65  e, int isDeferre
12480 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  d){.#ifndef SQLI
12490 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
124a0 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  KEY.  Table *pTa
124b0 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  b;.  FKey *pFKey
124c0 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20  ;.  if( (pTab = 
124d0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
124e0 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20  e)==0 || (pFKey 
124f0 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d  = pTab->pFKey)==
12500 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
12510 73 65 72 74 28 20 69 73 44 65 66 65 72 72 65 64  sert( isDeferred
12520 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65 72 72 65  ==0 || isDeferre
12530 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52  d==1 ); /* EV: R
12540 2d 33 30 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a  -30323-21917 */.
12550 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72    pFKey->isDefer
12560 72 65 64 20 3d 20 28 75 38 29 69 73 44 65 66 65  red = (u8)isDefe
12570 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rred;.#endif.}..
12580 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
12590 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72  ode that will er
125a0 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69  ase and refill i
125b0 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69  ndex *pIdx.  Thi
125c0 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  s is.** used to 
125d0 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77  initialize a new
125e0 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 65 78  ly created index
125f0 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65   or to recompute
12600 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
12610 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72  of an index in r
12620 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49  esponse to a REI
12630 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  NDEX command..**
12640 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61  .** if memRootPa
12650 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69  ge is not negati
12660 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ve, it means tha
12670 74 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e  t the index is n
12680 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e  ewly.** created.
12690 20 20 54 68 65 20 72 65 67 69 73 74 65 72 20 73    The register s
126a0 70 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52  pecified by memR
126b0 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  ootPage contains
126c0 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
126d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
126e0 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f  index.  If memRo
126f0 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  otPage is negati
12700 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ve, then.** the 
12710 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
12720 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65  ists and must be
12730 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20   cleared before 
12740 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61  being refilled a
12750 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70  nd.** the root p
12760 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
12770 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e  e index is taken
12780 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e   from pIndex->tn
12790 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  um..*/.static vo
127a0 69 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c  id sqlite3Refill
127b0 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
127c0 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64  rse, Index *pInd
127d0 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50  ex, int memRootP
127e0 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  age){.  Table *p
127f0 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54  Tab = pIndex->pT
12800 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61  able;  /* The ta
12810 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64 65  ble that is inde
12820 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  xed */.  int iTa
12830 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
12840 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65  ++;     /* Btree
12850 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   cursor used for
12860 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69   pTab */.  int i
12870 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
12880 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72  ab++;     /* Btr
12890 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
128a0 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69  or pIndex */.  i
128b0 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20  nt addr1;       
128c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
128d0 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20   Address of top 
128e0 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  of loop */.  int
128f0 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20   tnum;          
12900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
12910 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65  oot page of inde
12920 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  x */.  Vdbe *v; 
12930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12940 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
12950 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
12960 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
12970 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
12980 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  Key;            
12990 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20       /* KeyInfo 
129a0 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  for index */.  i
129b0 6e 74 20 72 65 67 49 64 78 4b 65 79 3b 20 20 20  nt regIdxKey;   
129c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
129d0 20 52 65 67 69 73 74 65 72 73 20 63 6f 6e 74 61   Registers conta
129e0 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  ining the index 
129f0 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  key */.  int reg
12a00 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20  Record;         
12a10 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
12a20 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73 73 65  ter holding asse
12a30 6d 62 6c 69 65 64 20 69 6e 64 65 78 20 72 65 63  mblied index rec
12a40 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ord */.  sqlite3
12a50 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
12a60 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  b;      /* The d
12a70 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
12a80 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20  on */.  int iDb 
12a90 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
12aa0 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  oIndex(db, pInde
12ab0 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69  x->pSchema);..#i
12ac0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12ad0 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
12ae0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
12af0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
12b00 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20 70  QLITE_REINDEX, p
12b10 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c  Index->zName, 0,
12b20 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
12b30 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20  Db].zName ) ){. 
12b40 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
12b50 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75  endif..  /* Requ
12b60 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
12b70 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f   on the table to
12b80 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70   perform this op
12b90 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  eration */.  sql
12ba0 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
12bb0 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
12bc0 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e  >tnum, 1, pTab->
12bd0 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73  zName);..  v = s
12be0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
12bf0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
12c00 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
12c10 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30  ( memRootPage>=0
12c20 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d   ){.    tnum = m
12c30 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65  emRootPage;.  }e
12c40 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20  lse{.    tnum = 
12c50 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20  pIndex->tnum;.  
12c60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12c70 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c  Op2(v, OP_Clear,
12c80 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d   tnum, iDb);.  }
12c90 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  .  pKey = sqlite
12ca0 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
12cb0 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20  arse, pIndex);. 
12cc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12cd0 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  p4(v, OP_OpenWri
12ce0 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20  te, iIdx, tnum, 
12cf0 69 44 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  iDb, .          
12d00 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 20            (char 
12d10 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e  *)pKey, P4_KEYIN
12d20 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 69  FO_HANDOFF);.  i
12d30 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d  f( memRootPage>=
12d40 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
12d50 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
12d60 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  1);.  }.  sqlite
12d70 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
12d80 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54  e, iTab, iDb, pT
12d90 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
12da0 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
12db0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12dc0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62   OP_Rewind, iTab
12dd0 2c 20 30 29 3b 0a 20 20 72 65 67 52 65 63 6f 72  , 0);.  regRecor
12de0 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
12df0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
12e00 20 72 65 67 49 64 78 4b 65 79 20 3d 20 73 71 6c   regIdxKey = sql
12e10 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65  ite3GenerateInde
12e20 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49 6e  xKey(pParse, pIn
12e30 64 65 78 2c 20 69 54 61 62 2c 20 72 65 67 52 65  dex, iTab, regRe
12e40 63 6f 72 64 2c 20 31 29 3b 0a 20 20 69 66 28 20  cord, 1);.  if( 
12e50 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21  pIndex->onError!
12e60 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20  =OE_None ){.    
12e70 63 6f 6e 73 74 20 69 6e 74 20 72 65 67 52 6f 77  const int regRow
12e80 69 64 20 3d 20 72 65 67 49 64 78 4b 65 79 20 2b  id = regIdxKey +
12e90 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
12ea0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  ;.    const int 
12eb0 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j2 = sqlite3Vdbe
12ec0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
12ed0 20 32 3b 0a 20 20 20 20 76 6f 69 64 20 2a 20 63   2;.    void * c
12ee0 6f 6e 73 74 20 70 52 65 67 4b 65 79 20 3d 20 53  onst pRegKey = S
12ef0 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
12f00 28 72 65 67 49 64 78 4b 65 79 29 3b 0a 0a 20 20  (regIdxKey);..  
12f10 20 20 2f 2a 20 54 68 65 20 72 65 67 69 73 74 65    /* The registe
12f20 72 73 20 61 63 63 65 73 73 65 64 20 62 79 20 74  rs accessed by t
12f30 68 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 20 6f  he OP_IsUnique o
12f40 70 63 6f 64 65 20 77 65 72 65 20 61 6c 6c 6f 63  pcode were alloc
12f50 61 74 65 64 0a 20 20 20 20 2a 2a 20 75 73 69 6e  ated.    ** usin
12f60 67 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  g sqlite3GetTemp
12f70 52 61 6e 67 65 28 29 20 69 6e 73 69 64 65 20 6f  Range() inside o
12f80 66 20 74 68 65 20 73 71 6c 69 74 65 33 47 65 6e  f the sqlite3Gen
12f90 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 29 0a  erateIndexKey().
12fa0 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76      ** call abov
12fb0 65 2e 20 4a 75 73 74 20 62 65 66 6f 72 65 20 74  e. Just before t
12fc0 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  hat function was
12fd0 20 66 72 65 65 64 20 74 68 65 79 20 77 65 72 65   freed they were
12fe0 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a   released.    **
12ff0 20 28 6d 61 64 65 20 61 76 61 69 6c 61 62 6c 65   (made available
13000 20 74 6f 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   to the compiler
13010 20 66 6f 72 20 72 65 75 73 65 29 20 75 73 69 6e   for reuse) usin
13020 67 20 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  g .    ** sqlite
13030 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
13040 65 28 29 2e 20 53 6f 20 69 6e 20 73 6f 6d 65 20  e(). So in some 
13050 77 61 79 73 20 68 61 76 69 6e 67 20 74 68 65 20  ways having the 
13060 4f 50 5f 49 73 55 6e 69 71 75 65 0a 20 20 20 20  OP_IsUnique.    
13070 2a 2a 20 6f 70 63 6f 64 65 20 75 73 65 20 74 68  ** opcode use th
13080 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20  e values stored 
13090 77 69 74 68 69 6e 20 73 65 65 6d 73 20 64 61 6e  within seems dan
130a0 67 65 72 6f 75 73 2e 20 48 6f 77 65 76 65 72 2c  gerous. However,
130b0 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20 77 65   since.    ** we
130c0 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 61   can be sure tha
130d0 74 20 6e 6f 20 6f 74 68 65 72 20 74 65 6d 70 20  t no other temp 
130e0 72 65 67 69 73 74 65 72 73 20 68 61 76 65 20 62  registers have b
130f0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20  een allocated.  
13100 20 20 2a 2a 20 73 69 6e 63 65 20 73 71 6c 69 74    ** since sqlit
13110 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
13120 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2c  ge() was called,
13130 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 64   it is safe to d
13140 6f 20 73 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o so..    */.   
13150 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13160 70 34 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71 75  p4(v, OP_IsUniqu
13170 65 2c 20 69 49 64 78 2c 20 6a 32 2c 20 72 65 67  e, iIdx, j2, reg
13180 52 6f 77 69 64 2c 20 70 52 65 67 4b 65 79 2c 20  Rowid, pRegKey, 
13190 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 73  P4_INT32);.    s
131a0 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72  qlite3HaltConstr
131b0 61 69 6e 74 28 0a 20 20 20 20 20 20 20 20 70 50  aint(.        pP
131c0 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20  arse, OE_Abort, 
131d0 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73  "indexed columns
131e0 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22   are not unique"
131f0 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
13200 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
13210 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
13220 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72 65 67  nsert, iIdx, reg
13230 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
13240 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
13250 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
13260 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74  RESULT);.  sqlit
13270 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
13280 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
13290 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rd);.  sqlite3Vd
132a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
132b0 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31  ext, iTab, addr1
132c0 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  +1);.  sqlite3Vd
132d0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
132e0 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  dr1);.  sqlite3V
132f0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
13300 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20 20  Close, iTab);.  
13310 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13320 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
13330 49 64 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  Idx);.}../*.** C
13340 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65  reate a new inde
13350 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62  x for an SQL tab
13360 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d  le.  pName1.pNam
13370 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  e2 is the name o
13380 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20  f the index .** 
13390 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20  and pTblList is 
133a0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
133b0 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
133c0 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f   be indexed.  Bo
133d0 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e  th will .** be N
133e0 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72  ULL for a primar
133f0 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65  y key or an inde
13400 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65  x that is create
13410 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a  d to satisfy a.*
13420 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
13430 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20  int.  If pTable 
13440 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e  and pIndex are N
13450 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d  ULL, use pParse-
13460 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73  >pNewTable.** as
13470 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
13480 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73   indexed.  pPars
13490 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20  e->pNewTable is 
134a0 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a  a table that is.
134b0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ** currently bei
134c0 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ng constructed b
134d0 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  y a CREATE TABLE
134e0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
134f0 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73  * pList is a lis
13500 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
13510 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69  be indexed.  pLi
13520 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  st will be NULL 
13530 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20  if this.** is a 
13540 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75  primary key or u
13550 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74  nique-constraint
13560 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
13570 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ent column added
13580 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65  .** to the table
13590 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
135a0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
135b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
135c0 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20 73  dex is created s
135d0 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 72 65 74  uccessfully, ret
135e0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
135f0 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 0a 2a   the new Index.*
13600 2a 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 69  * structure. Thi
13610 73 20 69 73 20 75 73 65 64 20 62 79 20 73 71 6c  s is used by sql
13620 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65  ite3AddPrimaryKe
13630 79 28 29 20 74 6f 20 6d 61 72 6b 20 74 68 65 20  y() to mark the 
13640 69 6e 64 65 78 0a 2a 2a 20 61 73 20 74 68 65 20  index.** as the 
13650 74 61 62 6c 65 73 20 70 72 69 6d 61 72 79 20 6b  tables primary k
13660 65 79 20 28 49 6e 64 65 78 2e 61 75 74 6f 49 6e  ey (Index.autoIn
13670 64 65 78 3d 3d 32 29 2e 0a 2a 2f 0a 49 6e 64 65  dex==2)..*/.Inde
13680 78 20 2a 73 71 6c 69 74 65 33 43 72 65 61 74 65  x *sqlite3Create
13690 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
136a0 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41  pParse,     /* A
136b0 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ll information a
136c0 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20  bout this parse 
136d0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
136e0 65 31 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74  e1,     /* First
136f0 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e   part of index n
13700 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ame. May be NULL
13710 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
13720 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f  me2,     /* Seco
13730 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78  nd part of index
13740 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55   name. May be NU
13750 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  LL */.  SrcList 
13760 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61  *pTblName, /* Ta
13770 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73  ble to index. Us
13780 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
13790 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78  ble if 0 */.  Ex
137a0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
137b0 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f   /* A list of co
137c0 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65  lumns to be inde
137d0 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  xed */.  int onE
137e0 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f  rror,       /* O
137f0 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f  E_Abort, OE_Igno
13800 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20  re, OE_Replace, 
13810 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20  or OE_None */.  
13820 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20  Token *pStart,  
13830 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
13840 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
13850 6e 73 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  ns this statemen
13860 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45  t */.  Token *pE
13870 6e 64 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  nd,       /* The
13880 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73   ")" that closes
13890 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45   the CREATE INDE
138a0 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  X statement */. 
138b0 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20   int sortOrder, 
138c0 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65      /* Sort orde
138d0 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79  r of primary key
138e0 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c   when pList==NUL
138f0 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74  L */.  int ifNot
13900 45 78 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69  Exist     /* Omi
13910 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78  t error if index
13920 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
13930 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
13940 52 65 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Ret = 0;     /* 
13950 50 6f 69 6e 74 65 72 20 74 6f 20 72 65 74 75 72  Pointer to retur
13960 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  n */.  Table *pT
13970 61 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  ab = 0;     /* T
13980 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
13990 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
139a0 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20  Index = 0;   /* 
139b0 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
139c0 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61  created */.  cha
139d0 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20  r *zName = 0;   
139e0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
139f0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
13a00 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
13a10 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
13a20 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d  aracters in zNam
13a30 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  e */.  int i, j;
13a40 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b  .  Token nullId;
13a50 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20          /* Fake 
13a60 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70  token for an emp
13a70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20  ty ID list */.  
13a80 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20  DbFixer sFix;   
13a90 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69       /* For assi
13aa0 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e  gning database n
13ab0 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a  ames to pTable *
13ac0 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
13ad0 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f  rMask;   /* 1 to
13ae0 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69   honor DESC in i
13af0 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f  ndex.  0 to igno
13b00 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  re. */.  sqlite3
13b10 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
13b20 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  b;.  Db *pDb;   
13b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13b40 20 73 70 65 63 69 66 69 63 20 74 61 62 6c 65 20   specific table 
13b50 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69  containing the i
13b60 6e 64 65 78 65 64 20 64 61 74 61 62 61 73 65 20  ndexed database 
13b70 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
13b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
13b90 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
13ba0 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  se that is being
13bb0 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f   written */.  To
13bc0 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20  ken *pName = 0; 
13bd0 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65     /* Unqualifie
13be0 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  d name of the in
13bf0 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f  dex to create */
13c00 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
13c10 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74  st_item *pListIt
13c20 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  em; /* For loopi
13c30 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f  ng over pList */
13c40 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 69  .  int nCol;.  i
13c50 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20  nt nExtra = 0;. 
13c60 20 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a 0a   char *zExtra;..
13c70 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74    assert( pStart
13c80 3d 3d 30 20 7c 7c 20 70 45 6e 64 21 3d 30 20 29  ==0 || pEnd!=0 )
13c90 3b 20 2f 2a 20 70 45 6e 64 20 6d 75 73 74 20 62  ; /* pEnd must b
13ca0 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 70 53  e non-NULL if pS
13cb0 74 61 72 74 20 69 73 20 2a 2f 0a 20 20 61 73 73  tart is */.  ass
13cc0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
13cd0 72 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  r==0 );      /* 
13ce0 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74  Never called wit
13cf0 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a  h prior errors *
13d00 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  /.  if( db->mall
13d10 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49 4e 5f 44  ocFailed || IN_D
13d20 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20  ECLARE_VTAB ){. 
13d30 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
13d40 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
13d50 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
13d60 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
13d70 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
13d80 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
13d90 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  e_index;.  }..  
13da0 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
13db0 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
13dc0 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52  o be indexed.  R
13dd0 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e  eturn early if n
13de0 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20  ot found..  */. 
13df0 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
13e00 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20   ){..    /* Use 
13e10 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64  the two-part ind
13e20 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72  ex name to deter
13e30 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73  mine the databas
13e40 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61  e .    ** to sea
13e50 72 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c  rch for the tabl
13e60 65 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62  e. 'Fix' the tab
13e70 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20  le name to this 
13e80 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  db.    ** before
13e90 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20   looking up the 
13ea0 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
13eb0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31    assert( pName1
13ec0 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20   && pName2 );.  
13ed0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
13ee0 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
13ef0 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
13f00 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20  2, &pName);.    
13f10 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f  if( iDb<0 ) goto
13f20 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
13f30 65 78 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ex;..#ifndef SQL
13f40 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a  ITE_OMIT_TEMPDB.
13f50 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e      /* If the in
13f60 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71  dex name was unq
13f70 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20  ualified, check 
13f80 69 66 20 74 68 65 20 74 68 65 20 74 61 62 6c 65  if the the table
13f90 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d  .    ** is a tem
13fa0 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20  p table. If so, 
13fb0 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  set the database
13fc0 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f   to 1. Do not do
13fd0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 66 20   this.    ** if 
13fe0 69 6e 69 74 69 61 6c 69 73 69 6e 67 20 61 20 64  initialising a d
13ff0 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a  atabase schema..
14000 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
14010 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
14020 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71  .      pTab = sq
14030 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b  lite3SrcListLook
14040 75 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e  up(pParse, pTblN
14050 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
14060 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20  pName2->n==0 && 
14070 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53  pTab && pTab->pS
14080 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31  chema==db->aDb[1
14090 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ].pSchema ){.   
140a0 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20       iDb = 1;.  
140b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
140c0 69 66 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69  if..    if( sqli
140d0 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78  te3FixInit(&sFix
140e0 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  , pParse, iDb, "
140f0 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 20 26  index", pName) &
14100 26 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  &.        sqlite
14110 33 46 69 78 53 72 63 4c 69 73 74 28 26 73 46 69  3FixSrcList(&sFi
14120 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20 20  x, pTblName).   
14130 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63   ){.      /* Bec
14140 61 75 73 65 20 74 68 65 20 70 61 72 73 65 72 20  ause the parser 
14150 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e  constructs pTblN
14160 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  ame from a singl
14170 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20  e identifier,.  
14180 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69      ** sqlite3Fi
14190 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76  xSrcList can nev
141a0 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20  er fail. */.    
141b0 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20    assert(0);.   
141c0 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71   }.    pTab = sq
141d0 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
141e0 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54 62 6c  (pParse, 0, pTbl
141f0 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  Name->a[0].zName
14200 2c 20 0a 20 20 20 20 20 20 20 20 70 54 62 6c 4e  , .        pTblN
14210 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
14220 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ase);.    if( !p
14230 54 61 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Tab || db->mallo
14240 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65  cFailed ) goto e
14250 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
14260 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
14270 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
14280 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
14290 61 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  a );.  }else{.  
142a0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d    assert( pName=
142b0 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d  =0 );.    pTab =
142c0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
142d0 6c 65 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61  le;.    if( !pTa
142e0 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  b ) goto exit_cr
142f0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
14300 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
14310 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
14320 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
14330 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e   }.  pDb = &db->
14340 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 61 73 73  aDb[iDb];..  ass
14350 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
14360 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
14370 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69  ->nErr==0 );.  i
14380 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
14390 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  mp(pTab->zName, 
143a0 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
143b0 20 0a 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63   .       && memc
143c0 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b  mp(&pTab->zName[
143d0 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c 39  7],"altertab_",9
143e0 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
143f0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14400 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
14410 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
14420 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
14430 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
14440 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
14450 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14460 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20  OMIT_VIEW.  if( 
14470 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
14480 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
14490 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
144a0 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  ews may not be i
144b0 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f  ndexed");.    go
144c0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
144d0 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ndex;.  }.#endif
144e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
144f0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
14500 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  E.  if( IsVirtua
14510 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73  l(pTab) ){.    s
14520 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
14530 50 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c 20  Parse, "virtual 
14540 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62  tables may not b
14550 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20  e indexed");.   
14560 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
14570 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e  e_index;.  }.#en
14580 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46  dif..  /*.  ** F
14590 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ind the name of 
145a0 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65  the index.  Make
145b0 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e   sure there is n
145c0 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68  ot already anoth
145d0 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72  er.  ** index or
145e0 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
145f0 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a  same name.  .  *
14600 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e  *.  ** Exception
14610 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65 61  :  If we are rea
14620 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f  ding the names o
14630 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69  f permanent indi
14640 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a  ces from the.  *
14650 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  * sqlite_master 
14660 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20 73  table (because s
14670 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
14680 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73 63  s changed the sc
14690 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f  hema) and.  ** o
146a0 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ne of the index 
146b0 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77  names collides w
146c0 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ith the name of 
146d0 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
146e0 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c  e or.  ** index,
146f0 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f   then we will co
14700 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73  ntinue to proces
14710 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20  s this index..  
14720 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65  **.  ** If pName
14730 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ==0 it means tha
14740 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65  t we are.  ** de
14750 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72 69  aling with a pri
14760 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51  mary key or UNIQ
14770 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20  UE constraint.  
14780 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e  We have to inven
14790 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e  t our.  ** own n
147a0 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ame..  */.  if( 
147b0 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61  pName ){.    zNa
147c0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
147d0 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
147e0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  ame);.    if( zN
147f0 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ame==0 ) goto ex
14800 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
14810 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
14820 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
14830 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
14840 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
14850 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
14860 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
14870 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
14880 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20  it.busy ){.     
14890 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
148a0 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
148b0 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)!=0 ){.      
148c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
148d0 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
148e0 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61   is already a ta
148f0 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  ble named %s", z
14900 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
14910 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
14920 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
14930 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
14940 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
14950 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e  , zName, pDb->zN
14960 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
14970 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74   if( !ifNotExist
14980 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
14990 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
149a0 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c  se, "index %s al
149b0 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a  ready exists", z
149c0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Name);.      }el
149d0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
149e0 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  rt( !db->init.bu
149f0 73 79 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  sy );.        sq
14a00 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
14a10 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
14a20 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
14a30 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
14a40 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
14a50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
14a60 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   n;.    Index *p
14a70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c  Loop;.    for(pL
14a80 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  oop=pTab->pIndex
14a90 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c  , n=1; pLoop; pL
14aa0 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74  oop=pLoop->pNext
14ab0 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61  , n++){}.    zNa
14ac0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
14ad0 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f  ntf(db, "sqlite_
14ae0 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22  autoindex_%s_%d"
14af0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e  , pTab->zName, n
14b00 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
14b10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
14b20 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
14b30 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  dex;.    }.  }..
14b40 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61    /* Check for a
14b50 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20  uthorization to 
14b60 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e  create an index.
14b70 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
14b80 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
14b90 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
14ba0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
14bb0 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  = pDb->zName;.  
14bc0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
14bd0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
14be0 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
14bf0 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
14c00 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
14c10 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
14c20 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
14c30 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43      i = SQLITE_C
14c40 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20  REATE_INDEX;.   
14c50 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
14c60 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20  B && iDb==1 ) i 
14c70 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
14c80 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  TEMP_INDEX;.    
14c90 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
14ca0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20  heck(pParse, i, 
14cb0 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
14cc0 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
14cd0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
14ce0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
14cf0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
14d00 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74   If pList==0, it
14d10 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74   means this rout
14d20 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74  ine was called t
14d30 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79  o make a primary
14d40 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66  .  ** key out of
14d50 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
14d60 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
14d70 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
14d80 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20  uction..  ** So 
14d90 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69  create a fake li
14da0 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74  st to simulate t
14db0 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  his..  */.  if( 
14dc0 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
14dd0 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62 2d  nullId.z = pTab-
14de0 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c  >aCol[pTab->nCol
14df0 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e  -1].zName;.    n
14e00 75 6c 6c 49 64 2e 6e 20 3d 20 73 71 6c 69 74 65  ullId.n = sqlite
14e10 33 53 74 72 6c 65 6e 33 30 28 28 63 68 61 72 2a  3Strlen30((char*
14e20 29 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20  )nullId.z);.    
14e30 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
14e40 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
14e50 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  arse, 0, 0);.   
14e60 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
14e70 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
14e80 5f 69 6e 64 65 78 3b 0a 20 20 20 20 73 71 6c 69  _index;.    sqli
14e90 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
14ea0 6d 65 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  me(pParse, pList
14eb0 2c 20 26 6e 75 6c 6c 49 64 2c 20 30 29 3b 0a 20  , &nullId, 0);. 
14ec0 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73     pList->a[0].s
14ed0 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29 73  ortOrder = (u8)s
14ee0 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20  ortOrder;.  }.. 
14ef0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
14f00 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ow many bytes of
14f10 20 73 70 61 63 65 20 61 72 65 20 72 65 71 75 69   space are requi
14f20 72 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70  red to store exp
14f30 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65  licitly.  ** spe
14f40 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  cified collation
14f50 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e   sequence names.
14f60 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
14f70 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
14f80 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
14f90 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e  *pExpr = pList->
14fa0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
14fb0 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20  if( pExpr ){.   
14fc0 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
14fd0 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  l = pExpr->pColl
14fe0 3b 0a 20 20 20 20 20 20 2f 2a 20 45 69 74 68 65  ;.      /* Eithe
14ff0 72 20 70 43 6f 6c 6c 21 3d 30 20 6f 72 20 74 68  r pColl!=0 or th
15000 65 72 65 20 77 61 73 20 61 6e 20 4f 4f 4d 20 66  ere was an OOM f
15010 61 69 6c 75 72 65 2e 20 20 42 75 74 20 69 66 20  ailure.  But if 
15020 61 6e 20 4f 4f 4d 0a 20 20 20 20 20 20 2a 2a 20  an OOM.      ** 
15030 66 61 69 6c 75 72 65 20 77 65 20 68 61 76 65 20  failure we have 
15040 71 75 69 74 20 62 65 66 6f 72 65 20 72 65 61 63  quit before reac
15050 68 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74 2e  hing this point.
15060 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c   */.      if( AL
15070 57 41 59 53 28 70 43 6f 6c 6c 29 20 29 7b 0a 20  WAYS(pColl) ){. 
15080 20 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b 3d         nExtra +=
15090 20 28 31 20 2b 20 73 71 6c 69 74 65 33 53 74 72   (1 + sqlite3Str
150a0 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  len30(pColl->zNa
150b0 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  me));.      }.  
150c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20    }.  }..  /* . 
150d0 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   ** Allocate the
150e0 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
150f0 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20  . .  */.  nName 
15100 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
15110 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 43 6f 6c  0(zName);.  nCol
15120 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
15130 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
15140 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
15150 64 62 2c 20 0a 20 20 20 20 20 20 73 69 7a 65 6f  db, .      sizeo
15160 66 28 49 6e 64 65 78 29 20 2b 20 20 20 20 20 20  f(Index) +      
15170 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
15180 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20   structure  */. 
15190 20 20 20 20 20 73 69 7a 65 6f 66 28 74 52 6f 77       sizeof(tRow
151a0 63 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20  cnt)*(nCol+1) + 
151b0 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77    /* Index.aiRow
151c0 45 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20 73  Est   */.      s
151d0 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 43 6f 6c 20  izeof(int)*nCol 
151e0 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  +           /* I
151f0 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20  ndex.aiColumn   
15200 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
15210 63 68 61 72 20 2a 29 2a 6e 43 6f 6c 20 2b 20 20  char *)*nCol +  
15220 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
15230 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20  zColl     */.   
15240 20 20 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43     sizeof(u8)*nC
15250 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20 20  ol +            
15260 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72  /* Index.aSortOr
15270 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 61  der */.      nNa
15280 6d 65 20 2b 20 31 20 2b 20 20 20 20 20 20 20 20  me + 1 +        
15290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
152a0 65 78 2e 7a 4e 61 6d 65 20 20 20 20 20 20 2a 2f  ex.zName      */
152b0 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 20 20  .      nExtra   
152c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152d0 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e      /* Collation
152e0 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 20   sequence names 
152f0 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 64 62  */.  );.  if( db
15300 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
15310 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
15320 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
15330 7d 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f  }.  pIndex->aiRo
15340 77 45 73 74 20 3d 20 28 74 52 6f 77 63 6e 74 2a  wEst = (tRowcnt*
15350 29 28 26 70 49 6e 64 65 78 5b 31 5d 29 3b 0a 20  )(&pIndex[1]);. 
15360 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 20   pIndex->azColl 
15370 3d 20 28 63 68 61 72 2a 2a 29 28 26 70 49 6e 64  = (char**)(&pInd
15380 65 78 2d 3e 61 69 52 6f 77 45 73 74 5b 6e 43 6f  ex->aiRowEst[nCo
15390 6c 2b 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d  l+1]);.  pIndex-
153a0 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74  >aiColumn = (int
153b0 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 7a 43   *)(&pIndex->azC
153c0 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49  oll[nCol]);.  pI
153d0 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
153e0 20 3d 20 28 75 38 20 2a 29 28 26 70 49 6e 64 65   = (u8 *)(&pInde
153f0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c  x->aiColumn[nCol
15400 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e  ]);.  pIndex->zN
15410 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 28 26  ame = (char *)(&
15420 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
15430 65 72 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 7a 45 78  er[nCol]);.  zEx
15440 74 72 61 20 3d 20 28 63 68 61 72 20 2a 29 28 26  tra = (char *)(&
15450 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e  pIndex->zName[nN
15460 61 6d 65 2b 31 5d 29 3b 0a 20 20 6d 65 6d 63 70  ame+1]);.  memcp
15470 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  y(pIndex->zName,
15480 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29   zName, nName+1)
15490 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  ;.  pIndex->pTab
154a0 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e  le = pTab;.  pIn
154b0 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70  dex->nColumn = p
154c0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  List->nExpr;.  p
154d0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d  Index->onError =
154e0 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20   (u8)onError;.  
154f0 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65  pIndex->autoInde
15500 78 20 3d 20 28 75 38 29 28 70 4e 61 6d 65 3d 3d  x = (u8)(pName==
15510 30 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53  0);.  pIndex->pS
15520 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
15530 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  iDb].pSchema;.  
15540 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
15550 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
15560 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 0a 20  b, iDb, 0) );.. 
15570 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
15580 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20 68 6f   if we should ho
15590 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65 73 74  nor DESC request
155a0 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d  s on index colum
155b0 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  ns.  */.  if( pD
155c0 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65  b->pSchema->file
155d0 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20  _format>=4 ){.  
155e0 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20    sortOrderMask 
155f0 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72  = -1;   /* Honor
15600 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65   DESC */.  }else
15610 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d  {.    sortOrderM
15620 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49  ask = 0;    /* I
15630 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20 20  gnore DESC */.  
15640 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65  }..  /* Scan the
15650 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f   names of the co
15660 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62  lumns of the tab
15670 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
15680 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74   and.  ** load t
15690 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65  he column indice
156a0 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78  s into the Index
156b0 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 70   structure.  Rep
156c0 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a  ort an error.  *
156d0 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  * if any column 
156e0 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  is not found..  
156f0 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 20 41  **.  ** TODO:  A
15700 64 64 20 61 20 74 65 73 74 20 74 6f 20 6d 61 6b  dd a test to mak
15710 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
15720 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20 6e  same column is n
15730 6f 74 20 6e 61 6d 65 64 0a 20 20 2a 2a 20 6d 6f  ot named.  ** mo
15740 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 77 69 74  re than once wit
15750 68 69 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 64  hin the same ind
15760 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 69  ex.  Only the fi
15770 72 73 74 20 69 6e 73 74 61 6e 63 65 20 6f 66 0a  rst instance of.
15780 20 20 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20    ** the column 
15790 77 69 6c 6c 20 65 76 65 72 20 62 65 20 75 73 65  will ever be use
157a0 64 20 62 79 20 74 68 65 20 6f 70 74 69 6d 69 7a  d by the optimiz
157b0 65 72 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 75  er.  Note that u
157c0 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73 61  sing the.  ** sa
157d0 6d 65 20 63 6f 6c 75 6d 6e 20 6d 6f 72 65 20 74  me column more t
157e0 68 61 6e 20 6f 6e 63 65 20 63 61 6e 6e 6f 74 20  han once cannot 
157f0 62 65 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61  be an error beca
15800 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 0a  use that would .
15810 20 20 2a 2a 20 62 72 65 61 6b 20 62 61 63 6b 77    ** break backw
15820 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
15830 74 79 20 2d 20 69 74 20 6e 65 65 64 73 20 74 6f  ty - it needs to
15840 20 62 65 20 61 20 77 61 72 6e 69 6e 67 2e 0a 20   be a warning.. 
15850 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
15860 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  ListItem=pList->
15870 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  a; i<pList->nExp
15880 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65  r; i++, pListIte
15890 6d 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  m++){.    const 
158a0 63 68 61 72 20 2a 7a 43 6f 6c 4e 61 6d 65 20 3d  char *zColName =
158b0 20 70 4c 69 73 74 49 74 65 6d 2d 3e 7a 4e 61 6d   pListItem->zNam
158c0 65 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70  e;.    Column *p
158d0 54 61 62 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20  TabCol;.    int 
158e0 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
158f0 65 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43  er;.    char *zC
15900 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
15910 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
15920 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
15930 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 6a 3d  e */..    for(j=
15940 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d  0, pTabCol=pTab-
15950 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e  >aCol; j<pTab->n
15960 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62 43 6f  Col; j++, pTabCo
15970 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l++){.      if( 
15980 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
15990 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62 43 6f 6c  ColName, pTabCol
159a0 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ->zName)==0 ) br
159b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
159c0 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c  f( j>=pTab->nCol
159d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
159e0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
159f0 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20  , "table %s has 
15a00 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20  no column named 
15a10 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61  %s",.        pTa
15a20 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61  b->zName, zColNa
15a30 6d 65 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  me);.      pPars
15a40 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
15a50 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   1;.      goto e
15a60 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
15a70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
15a80 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
15a90 3d 20 6a 3b 0a 20 20 20 20 2f 2a 20 4a 75 73 74  = j;.    /* Just
15aa0 69 66 69 63 61 74 69 6f 6e 20 6f 66 20 74 68 65  ification of the
15ab0 20 41 4c 57 41 59 53 28 70 4c 69 73 74 49 74 65   ALWAYS(pListIte
15ac0 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 29  m->pExpr->pColl)
15ad0 3a 20 20 42 65 63 61 75 73 65 20 6f 66 0a 20 20  :  Because of.  
15ae0 20 20 2a 2a 20 74 68 65 20 77 61 79 20 74 68 65    ** the way the
15af0 20 22 69 64 78 6c 69 73 74 22 20 6e 6f 6e 2d 74   "idxlist" non-t
15b00 65 72 6d 69 6e 61 6c 20 69 73 20 63 6f 6e 73 74  erminal is const
15b10 72 75 63 74 65 64 20 62 79 20 74 68 65 20 70 61  ructed by the pa
15b20 72 73 65 72 2c 0a 20 20 20 20 2a 2a 20 69 66 20  rser,.    ** if 
15b30 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
15b40 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 74 68 65   is not null the
15b50 6e 20 65 69 74 68 65 72 20 70 4c 69 73 74 49 74  n either pListIt
15b60 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  em->pExpr->pColl
15b70 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 65 78 69  .    ** must exi
15b80 73 74 20 6f 72 20 65 6c 73 65 20 74 68 65 72 65  st or else there
15b90 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
15ba0 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42  an OOM error.  B
15bb0 75 74 20 69 66 20 74 68 65 72 65 0a 20 20 20 20  ut if there.    
15bc0 2a 2a 20 77 61 73 20 61 6e 20 4f 4f 4d 20 65 72  ** was an OOM er
15bd0 72 6f 72 2c 20 77 65 20 77 6f 75 6c 64 20 6e 65  ror, we would ne
15be0 76 65 72 20 72 65 61 63 68 20 74 68 69 73 20 70  ver reach this p
15bf0 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  oint. */.    if(
15c00 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
15c10 72 20 26 26 20 41 4c 57 41 59 53 28 70 4c 69 73  r && ALWAYS(pLis
15c20 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43  tItem->pExpr->pC
15c30 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  oll) ){.      in
15c40 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7a  t nColl;.      z
15c50 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74 65 6d  Coll = pListItem
15c60 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 2d 3e  ->pExpr->pColl->
15c70 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 6e 43 6f  zName;.      nCo
15c80 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  ll = sqlite3Strl
15c90 65 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b  en30(zColl) + 1;
15ca0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
15cb0 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a  Extra>=nColl );.
15cc0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 78        memcpy(zEx
15cd0 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c  tra, zColl, nCol
15ce0 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20  l);.      zColl 
15cf0 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20 20 20 20  = zExtra;.      
15d00 7a 45 78 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b  zExtra += nColl;
15d10 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2d 3d  .      nExtra -=
15d20 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73   nColl;.    }els
15d30 65 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  e{.      zColl =
15d40 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
15d50 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69 66 28 20  Coll;.      if( 
15d60 21 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !zColl ){.      
15d70 20 20 7a 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44    zColl = db->pD
15d80 66 6c 74 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a  fltColl->zName;.
15d90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15da0 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
15db0 62 75 73 79 20 26 26 20 21 73 71 6c 69 74 65 33  busy && !sqlite3
15dc0 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
15dd0 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a  arse, zColl) ){.
15de0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
15df0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
15e00 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e    }.    pIndex->
15e10 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c  azColl[i] = zCol
15e20 6c 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65 64  l;.    requested
15e30 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73  SortOrder = pLis
15e40 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  tItem->sortOrder
15e50 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b   & sortOrderMask
15e60 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53  ;.    pIndex->aS
15e70 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75  ortOrder[i] = (u
15e80 38 29 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f  8)requestedSortO
15e90 72 64 65 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rder;.  }.  sqli
15ea0 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74  te3DefaultRowEst
15eb0 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20 69 66 28  (pIndex);..  if(
15ec0 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70   pTab==pParse->p
15ed0 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  NewTable ){.    
15ee0 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
15ef0 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  has been called 
15f00 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75 74  to create an aut
15f10 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73 20  omatic index as 
15f20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20  a.    ** result 
15f30 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  of a PRIMARY KEY
15f40 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73   or UNIQUE claus
15f50 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65  e on a column de
15f60 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20  finition, or.   
15f70 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45   ** a PRIMARY KE
15f80 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75  Y or UNIQUE clau
15f90 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  se following the
15fa0 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69   column definiti
15fb0 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e  ons..    ** i.e.
15fc0 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a   one of:.    **.
15fd0 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41      ** CREATE TA
15fe0 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59 20  BLE t(x PRIMARY 
15ff0 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20  KEY, y);.    ** 
16000 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78  CREATE TABLE t(x
16010 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79  , y, UNIQUE(x, y
16020 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ));.    **.    *
16030 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 68  * Either way, ch
16040 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
16050 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  e table already 
16060 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65  has such an inde
16070 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c  x. If.    ** so,
16080 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72   don't bother cr
16090 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e  eating this one.
160a0 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69   This only appli
160b0 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74  es to.    ** aut
160c0 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74  omatically creat
160d0 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72  ed indices. User
160e0 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79  s can do as they
160f0 20 77 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a   wish with.    *
16100 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63  * explicit indic
16110 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  es..    **.    *
16120 2a 20 54 77 6f 20 55 4e 49 51 55 45 20 6f 72 20  * Two UNIQUE or 
16130 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
16140 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 6e 73  traints are cons
16150 69 64 65 72 65 64 20 65 71 75 69 76 61 6c 65 6e  idered equivalen
16160 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64 20 74 68  t.    ** (and th
16170 75 73 20 73 75 70 70 72 65 73 73 69 6e 67 20 74  us suppressing t
16180 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20 65  he second one) e
16190 76 65 6e 20 69 66 20 74 68 65 79 20 68 61 76 65  ven if they have
161a0 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20 2a   different.    *
161b0 2a 20 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a 20  * sort orders.. 
161c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
161d0 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72  there are differ
161e0 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ent collating se
161f0 71 75 65 6e 63 65 73 20 6f 72 20 69 66 20 74 68  quences or if th
16200 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20  e columns of.   
16210 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72 61 69   ** the constrai
16220 6e 74 20 6f 63 63 75 72 20 69 6e 20 64 69 66 66  nt occur in diff
16230 65 72 65 6e 74 20 6f 72 64 65 72 73 2c 20 74 68  erent orders, th
16240 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  en the constrain
16250 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 63 6f  ts are.    ** co
16260 6e 73 69 64 65 72 65 64 20 64 69 73 74 69 6e 63  nsidered distinc
16270 74 20 61 6e 64 20 62 6f 74 68 20 72 65 73 75 6c  t and both resul
16280 74 20 69 6e 20 73 65 70 61 72 61 74 65 20 69 6e  t in separate in
16290 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  dices..    */.  
162a0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
162b0 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
162c0 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
162d0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
162e0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a  ){.      int k;.
162f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
16300 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  dx->onError!=OE_
16310 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20 61 73  None );.      as
16320 73 65 72 74 28 20 70 49 64 78 2d 3e 61 75 74 6f  sert( pIdx->auto
16330 49 6e 64 65 78 20 29 3b 0a 20 20 20 20 20 20 61  Index );.      a
16340 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6f  ssert( pIndex->o
16350 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
16360 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49  );..      if( pI
16370 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e  dx->nColumn!=pIn
16380 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63  dex->nColumn ) c
16390 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66  ontinue;.      f
163a0 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e  or(k=0; k<pIdx->
163b0 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20  nColumn; k++){. 
163c0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
163d0 72 20 2a 7a 31 3b 0a 20 20 20 20 20 20 20 20 63  r *z1;.        c
163e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20  onst char *z2;. 
163f0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
16400 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49  >aiColumn[k]!=pI
16410 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  ndex->aiColumn[k
16420 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
16430 20 20 20 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a     z1 = pIdx->az
16440 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20  Coll[k];.       
16450 20 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a   z2 = pIndex->az
16460 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20  Coll[k];.       
16470 20 69 66 28 20 7a 31 21 3d 7a 32 20 26 26 20 73   if( z1!=z2 && s
16480 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31  qlite3StrICmp(z1
16490 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20  , z2) ) break;. 
164a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
164b0 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   k==pIdx->nColum
164c0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  n ){.        if(
164d0 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
164e0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
164f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
16500 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  This constraint 
16510 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65  creates the same
16520 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76   index as a prev
16530 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ious.          *
16540 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65  * constraint spe
16550 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65  cified somewhere
16560 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54   in the CREATE T
16570 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
16580 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77            ** How
16590 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46  ever the ON CONF
165a0 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65  LICT clauses are
165b0 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62   different. If b
165c0 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20  oth this .      
165d0 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
165e0 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f  t and the previo
165f0 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  us equivalent co
16600 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78  nstraint have ex
16610 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20  plicit.         
16620 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20   ** ON CONFLICT 
16630 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20  clauses this is 
16640 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77  an error. Otherw
16650 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20  ise, use the.   
16660 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63         ** explic
16670 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62  itly specified b
16680 65 68 61 76 69 6f 75 72 20 66 6f 72 20 74 68 65  ehaviour for the
16690 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
166a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
166b0 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72  f( !(pIdx->onErr
166c0 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c  or==OE_Default |
166d0 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  | pIndex->onErro
166e0 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29  r==OE_Default) )
166f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
16700 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
16710 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
16720 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74         "conflict
16730 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  ing ON CONFLICT 
16740 63 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65  clauses specifie
16750 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  d", 0);.        
16760 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
16770 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  ( pIdx->onError=
16780 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20  =OE_Default ){. 
16790 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
167a0 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65  >onError = pInde
167b0 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  x->onError;.    
167c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
167d0 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  }.        goto e
167e0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
167f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16800 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74    }..  /* Link t
16810 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72  he new Index str
16820 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61  ucture to its ta
16830 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f  ble and to the o
16840 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d  ther.  ** in-mem
16850 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72  ory database str
16860 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20  uctures. .  */. 
16870 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
16880 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  sy ){.    Index 
16890 2a 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  *p;.    assert( 
168a0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
168b0 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49  exHeld(db, 0, pI
168c0 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29  ndex->pSchema) )
168d0 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
168e0 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 49 6e  3HashInsert(&pIn
168f0 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  dex->pSchema->id
16900 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20  xHash, .        
16910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16920 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c    pIndex->zName,
16930 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
16940 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c  (pIndex->zName),
16950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16960 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65             pInde
16970 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  x);.    if( p ){
16980 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16990 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20  ==pIndex );  /* 
169a0 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
169b0 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
169c0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
169d0 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  d = 1;.      got
169e0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
169f0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  dex;.    }.    d
16a00 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
16a10 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
16a20 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61  ;.    if( pTblNa
16a30 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  me!=0 ){.      p
16a40 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62  Index->tnum = db
16a50 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a  ->init.newTnum;.
16a60 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
16a70 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  If the db->init.
16a80 62 75 73 79 20 69 73 20 30 20 74 68 65 6e 20 63  busy is 0 then c
16a90 72 65 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  reate the index 
16aa0 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20  on disk.  This. 
16ab0 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72 69   ** involves wri
16ac0 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 69  ting the index i
16ad0 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 74  nto the master t
16ae0 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67  able and filling
16af0 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64   in the.  ** ind
16b00 65 78 20 77 69 74 68 20 74 68 65 20 63 75 72 72  ex with the curr
16b10 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e  ent table conten
16b20 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ts..  **.  ** Th
16b30 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
16b40 69 73 20 30 20 77 68 65 6e 20 74 68 65 20 75 73  is 0 when the us
16b50 65 72 20 66 69 72 73 74 20 65 6e 74 65 72 73 20  er first enters 
16b60 61 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 0a  a CREATE INDEX .
16b70 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 64    ** command.  d
16b80 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
16b90 31 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73  1 when a databas
16ba0 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64 20  e is opened and 
16bb0 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e 44  .  ** CREATE IND
16bc0 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  EX statements ar
16bd0 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74 68  e read out of th
16be0 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e master table. 
16bf0 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74   In.  ** the lat
16c00 74 65 72 20 63 61 73 65 20 74 68 65 20 69 6e 64  ter case the ind
16c10 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
16c20 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63 68  s on disk, which
16c30 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65 20   is why.  ** we 
16c40 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65  don't want to re
16c50 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a  create it..  **.
16c60 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65    ** If pTblName
16c70 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69  ==0 it means thi
16c80 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72  s index is gener
16c90 61 74 65 64 20 61 73 20 61 20 70 72 69 6d 61 72  ated as a primar
16ca0 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e  y key.  ** or UN
16cb0 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
16cc0 6f 66 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  of a CREATE TABL
16cd0 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69  E statement.  Si
16ce0 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20  nce the table.  
16cf0 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ** has just been
16d00 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e   created, it con
16d10 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e  tains no data an
16d20 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74  d the index init
16d30 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  ialization.  ** 
16d40 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70  step can be skip
16d50 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  ped..  */.  else
16d60 7b 20 2f 2a 20 69 66 28 20 64 62 2d 3e 69 6e 69  { /* if( db->ini
16d70 74 2e 62 75 73 79 3d 3d 30 20 29 20 2a 2f 0a 20  t.busy==0 ) */. 
16d80 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
16d90 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20  char *zStmt;.   
16da0 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50   int iMem = ++pP
16db0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20  arse->nMem;..   
16dc0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
16dd0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
16de0 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f   if( v==0 ) goto
16df0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
16e00 65 78 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 72 65  ex;...    /* Cre
16e10 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65  ate the rootpage
16e20 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20   for the index. 
16e30 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
16e40 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
16e50 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
16e60 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
16e70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16e80 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20 69  P_CreateIndex, i
16e90 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20 20 20  Db, iMem);..    
16ea0 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20 63 6f  /* Gather the co
16eb0 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
16ec0 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  he CREATE INDEX 
16ed0 73 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20  statement into. 
16ee0 20 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20     ** the zStmt 
16ef0 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a  variable.    */.
16f00 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29      if( pStart )
16f10 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
16f20 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 20  pEnd!=0 );.     
16f30 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64 65   /* A named inde
16f40 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63  x with an explic
16f50 69 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  it CREATE INDEX 
16f60 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
16f70 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74     zStmt = sqlit
16f80 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43  e3MPrintf(db, "C
16f90 52 45 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e  REATE%s INDEX %.
16fa0 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45  *s",.        onE
16fb0 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20  rror==OE_None ? 
16fc0 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 0a  "" : " UNIQUE",.
16fd0 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70 45          (int)(pE
16fe0 6e 64 2d 3e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a  nd->z - pName->z
16ff0 29 20 2b 20 31 2c 0a 20 20 20 20 20 20 20 20 70  ) + 1,.        p
17000 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65  Name->z);.    }e
17010 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  lse{.      /* An
17020 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
17030 20 63 72 65 61 74 65 64 20 62 79 20 61 20 50 52   created by a PR
17040 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
17050 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  QUE constraint *
17060 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74  /.      /* zStmt
17070 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
17080 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20  f(""); */.      
17090 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d  zStmt = 0;.    }
170a0 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20  ..    /* Add an 
170b0 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f  entry in sqlite_
170c0 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20  master for this 
170d0 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20  index.    */.   
170e0 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
170f0 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
17100 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
17110 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27  O %Q.%s VALUES('
17120 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 25 64  index',%Q,%Q,#%d
17130 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20  ,%Q);",.        
17140 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
17150 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
17160 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70  (iDb),.        p
17170 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20  Index->zName,.  
17180 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
17190 65 2c 0a 20 20 20 20 20 20 20 20 69 4d 65 6d 2c  e,.        iMem,
171a0 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20  .        zStmt. 
171b0 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
171c0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d  3DbFree(db, zStm
171d0 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c  t);..    /* Fill
171e0 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20   the index with 
171f0 64 61 74 61 20 61 6e 64 20 72 65 70 61 72 73 65  data and reparse
17200 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64   the schema. Cod
17210 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20  e an OP_Expire. 
17220 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64     ** to invalid
17230 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70  ate all pre-comp
17240 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e  iled statements.
17250 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
17260 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  pTblName ){.    
17270 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
17280 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
17290 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  dex, iMem);.    
172a0 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
172b0 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
172c0 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
172d0 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68  3VdbeAddParseSch
172e0 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20  emaOp(v, iDb,.  
172f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
17300 72 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d  rintf(db, "name=
17310 27 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69  '%q' AND type='i
17320 6e 64 65 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e  ndex'", pIndex->
17330 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73  zName));.      s
17340 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
17350 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30  (v, OP_Expire, 0
17360 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
17370 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61  /* When adding a
17380 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c  n index to the l
17390 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66  ist of indices f
173a0 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65  or a table, make
173b0 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69  .  ** sure all i
173c0 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f  ndices labeled O
173d0 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61  E_Replace come a
173e0 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c  fter all those l
173f0 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49  abeled.  ** OE_I
17400 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20  gnore.  This is 
17410 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 74 68  necessary for th
17420 65 20 63 6f 72 72 65 63 74 20 63 6f 6e 73 74 72  e correct constr
17430 61 69 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a 20  aint check.  ** 
17440 70 72 6f 63 65 73 73 69 6e 67 20 28 69 6e 20 73  processing (in s
17450 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f  qlite3GenerateCo
17460 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28 29  nstraintChecks()
17470 29 20 61 73 20 70 61 72 74 20 6f 66 0a 20 20 2a  ) as part of.  *
17480 2a 20 55 50 44 41 54 45 20 61 6e 64 20 49 4e 53  * UPDATE and INS
17490 45 52 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ERT statements. 
174a0 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d   .  */.  if( db-
174b0 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54  >init.busy || pT
174c0 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  blName==0 ){.   
174d0 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45   if( onError!=OE
174e0 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62  _Replace || pTab
174f0 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20  ->pIndex==0.    
17500 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49       || pTab->pI
17510 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
17520 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20  E_Replace){.    
17530 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
17540 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
17550 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64        pTab->pInd
17560 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  ex = pIndex;.   
17570 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e   }else{.      In
17580 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54  dex *pOther = pT
17590 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
175a0 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d    while( pOther-
175b0 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72  >pNext && pOther
175c0 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72  ->pNext->onError
175d0 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a  !=OE_Replace ){.
175e0 20 20 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d          pOther =
175f0 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
17600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
17610 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f  ndex->pNext = pO
17620 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
17630 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74     pOther->pNext
17640 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d   = pIndex;.    }
17650 0a 20 20 20 20 70 52 65 74 20 3d 20 70 49 6e 64  .    pRet = pInd
17660 65 78 3b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d  ex;.    pIndex =
17670 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c   0;.  }..  /* Cl
17680 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78  ean up before ex
17690 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72  iting */.exit_cr
176a0 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66  eate_index:.  if
176b0 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ( pIndex ){.    
176c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
176d0 2c 20 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66  , pIndex->zColAf
176e0 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  f);.    sqlite3D
176f0 62 46 72 65 65 28 64 62 2c 20 70 49 6e 64 65 78  bFree(db, pIndex
17700 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
17710 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
17720 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c  b, pList);.  sql
17730 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
17740 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b  e(db, pTblName);
17750 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
17760 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72  (db, zName);.  r
17770 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
17780 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e  *.** Fill the In
17790 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61  dex.aiRowEst[] a
177a0 72 72 61 79 20 77 69 74 68 20 64 65 66 61 75 6c  rray with defaul
177b0 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  t information - 
177c0 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74  information.** t
177d0 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 77  o be used when w
177e0 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74  e have not run t
177f0 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61  he ANALYZE comma
17800 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45  nd..**.** aiRowE
17810 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65  st[0] is suppose
17820 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
17830 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
17840 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  ts in the index.
17850 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20  .** Since we do 
17860 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20  not know, guess 
17870 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f  1 million.  aiRo
17880 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73  wEst[1] is an es
17890 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a  timate of the.**
178a0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
178b0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  in the table tha
178c0 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74  t match any part
178d0 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20  icular value of 
178e0 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c  the.** first col
178f0 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
17900 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69  .  aiRowEst[2] i
17910 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
17920 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
17930 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63  f rows that matc
17940 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  h any particular
17950 20 63 6f 6d 62 69 6e 69 61 74 69 6f 6e 20 6f 66   combiniation of
17960 20 74 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c   the first 2 col
17970 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69  umns.** of the i
17980 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f  ndex.  And so fo
17990 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c  rth.  It must al
179a0 77 61 79 73 20 62 65 20 74 68 65 20 63 61 73 65  ways be the case
179b0 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20   that.*.**      
179c0 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d       aiRowEst[N]
179d0 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a  <=aiRowEst[N-1].
179e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52  **           aiR
179f0 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a  owEst[N]>=1.**.*
17a00 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61  * Apart from tha
17a10 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c  t, we have littl
17a20 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64  e to go on besid
17a30 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20  es intuition as 
17a40 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45  to.** how aiRowE
17a50 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69  st[] should be i
17a60 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65  nitialized.  The
17a70 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74   numbers generat
17a80 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62  ed here.** are b
17a90 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20  ased on typical 
17aa0 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20  values found in 
17ab0 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a  actual indices..
17ac0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
17ad0 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64  efaultRowEst(Ind
17ae0 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 74 52 6f  ex *pIdx){.  tRo
17af0 77 63 6e 74 20 2a 61 20 3d 20 70 49 64 78 2d 3e  wcnt *a = pIdx->
17b00 61 69 52 6f 77 45 73 74 3b 0a 20 20 69 6e 74 20  aiRowEst;.  int 
17b10 69 3b 0a 20 20 74 52 6f 77 63 6e 74 20 6e 3b 0a  i;.  tRowcnt n;.
17b20 20 20 61 73 73 65 72 74 28 20 61 21 3d 30 20 29    assert( a!=0 )
17b30 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 49 64 78 2d  ;.  a[0] = pIdx-
17b40 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 45 73 74  >pTable->nRowEst
17b50 3b 0a 20 20 69 66 28 20 61 5b 30 5d 3c 31 30 20  ;.  if( a[0]<10 
17b60 29 20 61 5b 30 5d 20 3d 20 31 30 3b 0a 20 20 6e  ) a[0] = 10;.  n
17b70 20 3d 20 31 30 3b 0a 20 20 66 6f 72 28 69 3d 31   = 10;.  for(i=1
17b80 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  ; i<=pIdx->nColu
17b90 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 5b  mn; i++){.    a[
17ba0 69 5d 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20  i] = n;.    if( 
17bb0 6e 3e 35 20 29 20 6e 2d 2d 3b 0a 20 20 7d 0a 20  n>5 ) n--;.  }. 
17bc0 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
17bd0 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20  or!=OE_None ){. 
17be0 20 20 20 61 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75     a[pIdx->nColu
17bf0 6d 6e 5d 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  mn] = 1;.  }.}..
17c00 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
17c10 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20  ne will drop an 
17c20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69  existing named i
17c30 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74  ndex.  This rout
17c40 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  ine.** implement
17c50 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58  s the DROP INDEX
17c60 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
17c70 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49  oid sqlite3DropI
17c80 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
17c90 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61  se, SrcList *pNa
17ca0 6d 65 2c 20 69 6e 74 20 69 66 45 78 69 73 74 73  me, int ifExists
17cb0 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
17cc0 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  ex;.  Vdbe *v;. 
17cd0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
17ce0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
17cf0 20 69 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28   iDb;..  assert(
17d00 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
17d10 20 29 3b 20 20 20 2f 2a 20 4e 65 76 65 72 20 63   );   /* Never c
17d20 61 6c 6c 65 64 20 77 69 74 68 20 70 72 69 6f 72  alled with prior
17d30 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28   errors */.  if(
17d40 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
17d50 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d ){.    goto ex
17d60 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
17d70 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61   }.  assert( pNa
17d80 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
17d90 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
17da0 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
17db0 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
17dc0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
17dd0 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e  index;.  }.  pIn
17de0 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  dex = sqlite3Fin
17df0 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65  dIndex(db, pName
17e00 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e  ->a[0].zName, pN
17e10 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
17e20 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  ase);.  if( pInd
17e30 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ex==0 ){.    if(
17e40 20 21 69 66 45 78 69 73 74 73 20 29 7b 0a 20 20   !ifExists ){.  
17e50 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
17e60 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
17e70 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c  such index: %S",
17e80 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   pName, 0);.    
17e90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
17ea0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61  ite3CodeVerifyNa
17eb0 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  medSchema(pParse
17ec0 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  , pName->a[0].zD
17ed0 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a  atabase);.    }.
17ee0 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
17ef0 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  kSchema = 1;.   
17f00 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
17f10 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
17f20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64   pIndex->autoInd
17f30 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ex ){.    sqlite
17f40 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
17f50 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61  , "index associa
17f60 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20  ted with UNIQUE 
17f70 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d  ".      "or PRIM
17f80 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
17f90 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f  nt cannot be dro
17fa0 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67  pped", 0);.    g
17fb0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
17fc0 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d  dex;.  }.  iDb =
17fd0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
17fe0 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
17ff0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e  ->pSchema);.#ifn
18000 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18010 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
18020 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d  {.    int code =
18030 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44   SQLITE_DROP_IND
18040 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  EX;.    Table *p
18050 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54  Tab = pIndex->pT
18060 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  able;.    const 
18070 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
18080 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
18090 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
180a0 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41  zTab = SCHEMA_TA
180b0 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69 66  BLE(iDb);.    if
180c0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
180d0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
180e0 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20  E_DELETE, zTab, 
180f0 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
18100 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
18110 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
18120 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
18130 42 20 26 26 20 69 44 62 20 29 20 63 6f 64 65 20  B && iDb ) code 
18140 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
18150 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  MP_INDEX;.    if
18160 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
18170 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
18180 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
18190 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  pTab->zName, zDb
181a0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
181b0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
181c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
181d0 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
181e0 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20   code to remove 
181f0 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72  the index and fr
18200 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  om the master ta
18210 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ble */.  v = sql
18220 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
18230 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
18240 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
18250 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
18260 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a  Parse, 1, iDb);.
18270 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
18280 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
18290 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
182a0 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 6e  OM %Q.%s WHERE n
182b0 61 6d 65 3d 25 51 20 41 4e 44 20 74 79 70 65 3d  ame=%Q AND type=
182c0 27 69 6e 64 65 78 27 22 2c 0a 20 20 20 20 20 20  'index'",.      
182d0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
182e0 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
182f0 45 28 69 44 62 29 2c 20 70 49 6e 64 65 78 2d 3e  E(iDb), pIndex->
18300 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20  zName.    );.   
18310 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61   sqlite3ClearSta
18320 74 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20  tTables(pParse, 
18330 69 44 62 2c 20 22 69 64 78 22 2c 20 70 49 6e 64  iDb, "idx", pInd
18340 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ex->zName);.    
18350 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
18360 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
18370 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  ;.    destroyRoo
18380 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49  tPage(pParse, pI
18390 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  ndex->tnum, iDb)
183a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
183b0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72  eAddOp4(v, OP_Dr
183c0 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c  opIndex, iDb, 0,
183d0 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d   0, pIndex->zNam
183e0 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74  e, 0);.  }..exit
183f0 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73  _drop_index:.  s
18400 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
18410 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ete(db, pName);.
18420 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20  }../*.** pArray 
18430 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
18440 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65  an array of obje
18450 63 74 73 2e 20 20 45 61 63 68 20 6f 62 6a 65 63  cts.  Each objec
18460 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61  t in the.** arra
18470 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74  y is szEntry byt
18480 65 73 20 69 6e 20 73 69 7a 65 2e 20 20 54 68 69  es in size.  Thi
18490 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61  s routine alloca
184a0 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6f 62 6a  tes a new.** obj
184b0 65 63 74 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f  ect on the end o
184c0 66 20 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a 0a  f the array..**.
184d0 2a 2a 20 2a 70 6e 45 6e 74 72 79 20 69 73 20 74  ** *pnEntry is t
184e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
184f0 72 69 65 73 20 61 6c 72 65 61 64 79 20 69 6e 20  ries already in 
18500 75 73 65 2e 20 20 2a 70 6e 41 6c 6c 6f 63 20 69  use.  *pnAlloc i
18510 73 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75  s.** the previou
18520 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 69  sly allocated si
18530 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e  ze of the array.
18540 20 20 69 6e 69 74 53 69 7a 65 20 69 73 20 74 68    initSize is th
18550 65 0a 2a 2a 20 73 75 67 67 65 73 74 65 64 20 69  e.** suggested i
18560 6e 69 74 69 61 6c 20 61 72 72 61 79 20 73 69 7a  nitial array siz
18570 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  e allocation..**
18580 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 6f 66  .** The index of
18590 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69   the new entry i
185a0 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20 2a 70  s returned in *p
185b0 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Idx..**.** This 
185c0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
185d0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
185e0 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74   array of object
185f0 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 69 67 68  s.  This.** migh
18600 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
18610 20 74 68 65 20 70 41 72 72 61 79 20 70 61 72 61   the pArray para
18620 6d 65 74 65 72 20 6f 72 20 69 74 20 6d 69 67 68  meter or it migh
18630 74 20 62 65 20 61 20 64 69 66 66 65 72 65 6e 74  t be a different
18640 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 66 20 74  .** pointer if t
18650 68 65 20 61 72 72 61 79 20 77 61 73 20 72 65 73  he array was res
18660 69 7a 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ized..*/.void *s
18670 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
18680 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ate(.  sqlite3 *
18690 64 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  db,      /* Conn
186a0 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79  ection to notify
186b0 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   of malloc failu
186c0 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  res */.  void *p
186d0 41 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72  Array,     /* Ar
186e0 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20  ray of objects. 
186f0 20 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f   Might be reallo
18700 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73  cated */.  int s
18710 7a 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20  zEntry,      /* 
18720 53 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a  Size of each obj
18730 65 63 74 20 69 6e 20 74 68 65 20 61 72 72 61 79  ect in the array
18740 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 69 74 53 69   */.  int initSi
18750 7a 65 2c 20 20 20 20 20 2f 2a 20 53 75 67 67 65  ze,     /* Sugge
18760 73 74 65 64 20 69 6e 69 74 69 61 6c 20 61 6c 6c  sted initial all
18770 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d  ocation, in elem
18780 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ents */.  int *p
18790 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e  nEntry,     /* N
187a0 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73  umber of objects
187b0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
187c0 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 41 6c  e */.  int *pnAl
187d0 6c 6f 63 2c 20 20 20 20 20 2f 2a 20 43 75 72 72  loc,     /* Curr
187e0 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
187f0 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65  allocation, in e
18800 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  lements */.  int
18810 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f   *pIdx         /
18820 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e 64 65  * Write the inde
18830 78 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20  x of a new slot 
18840 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  here */.){.  cha
18850 72 20 2a 7a 3b 0a 20 20 69 66 28 20 2a 70 6e 45  r *z;.  if( *pnE
18860 6e 74 72 79 20 3e 3d 20 2a 70 6e 41 6c 6c 6f 63  ntry >= *pnAlloc
18870 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e   ){.    void *pN
18880 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 65 77 53  ew;.    int newS
18890 69 7a 65 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65  ize;.    newSize
188a0 20 3d 20 28 2a 70 6e 41 6c 6c 6f 63 29 2a 32 20   = (*pnAlloc)*2 
188b0 2b 20 69 6e 69 74 53 69 7a 65 3b 0a 20 20 20 20  + initSize;.    
188c0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
188d0 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72  Realloc(db, pArr
188e0 61 79 2c 20 6e 65 77 53 69 7a 65 2a 73 7a 45 6e  ay, newSize*szEn
188f0 74 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  try);.    if( pN
18900 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  ew==0 ){.      *
18910 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pIdx = -1;.     
18920 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a   return pArray;.
18930 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e 41 6c 6c      }.    *pnAll
18940 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  oc = sqlite3DbMa
18950 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e 65  llocSize(db, pNe
18960 77 29 2f 73 7a 45 6e 74 72 79 3b 0a 20 20 20 20  w)/szEntry;.    
18970 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20  pArray = pNew;. 
18980 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29   }.  z = (char*)
18990 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74  pArray;.  memset
189a0 28 26 7a 5b 2a 70 6e 45 6e 74 72 79 20 2a 20 73  (&z[*pnEntry * s
189b0 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e  zEntry], 0, szEn
189c0 74 72 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  try);.  *pIdx = 
189d0 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 2b 2b 2a 70  *pnEntry;.  ++*p
189e0 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e  nEntry;.  return
189f0 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a   pArray;.}../*.*
18a00 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65  * Append a new e
18a10 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69  lement to the gi
18a20 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65  ven IdList.  Cre
18a30 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74  ate a new IdList
18a40 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a   if.** need be..
18a50 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69  **.** A new IdLi
18a60 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  st is returned, 
18a70 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f  or NULL if mallo
18a80 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64  c() fails..*/.Id
18a90 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c  List *sqlite3IdL
18aa0 69 73 74 41 70 70 65 6e 64 28 73 71 6c 69 74 65  istAppend(sqlite
18ab0 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
18ac0 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
18ad0 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ken){.  int i;. 
18ae0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
18af0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
18b00 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
18b10 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69  (db, sizeof(IdLi
18b20 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
18b30 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
18b40 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   0;.    pList->n
18b50 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  Alloc = 0;.  }. 
18b60 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69   pList->a = sqli
18b70 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
18b80 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20  (.      db,.    
18b90 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20    pList->a,.    
18ba0 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e    sizeof(pList->
18bb0 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 35 2c 0a  a[0]),.      5,.
18bc0 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49        &pList->nI
18bd0 64 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d  d,.      &pList-
18be0 3e 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 26  >nAlloc,.      &
18bf0 69 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30  i.  );.  if( i<0
18c00 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   ){.    sqlite3I
18c10 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
18c20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75  pList);.    retu
18c30 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
18c40 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
18c50 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
18c60 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29  oken(db, pToken)
18c70 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
18c80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
18c90 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a  e an IdList..*/.
18ca0 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69  void sqlite3IdLi
18cb0 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  stDelete(sqlite3
18cc0 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c   *db, IdList *pL
18cd0 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
18ce0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
18cf0 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
18d00 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; i<pList->nId;
18d10 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
18d20 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69  e3DbFree(db, pLi
18d30 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
18d40 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
18d50 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Free(db, pList->
18d60 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  a);.  sqlite3DbF
18d70 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ree(db, pList);.
18d80 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
18d90 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69  the index in pLi
18da0 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69  st of the identi
18db0 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20  fier named zId. 
18dc0 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66   Return -1.** if
18dd0 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69   not found..*/.i
18de0 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  nt sqlite3IdList
18df0 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c  Index(IdList *pL
18e00 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ist, const char 
18e10 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
18e20 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
18e30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
18e40 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
18e50 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
18e60 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
18e70 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  Cmp(pList->a[i].
18e80 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30  zName, zName)==0
18e90 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d   ) return i;.  }
18ea0 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
18eb0 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68  ./*.** Expand th
18ec0 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  e space allocate
18ed0 64 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  d for the given 
18ee0 53 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62  SrcList object b
18ef0 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45  y.** creating nE
18f00 78 74 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62  xtra new slots b
18f10 65 67 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61  eginning at iSta
18f20 72 74 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a  rt.  iStart is z
18f30 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65  ero based..** Ne
18f40 77 20 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f  w slots are zero
18f50 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ed..**.** For ex
18f60 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61  ample, suppose a
18f70 20 53 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c   SrcList initial
18f80 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20  ly contains two 
18f90 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a  entries: A,B..**
18fa0 20 54 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77   To append 3 new
18fb0 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68   entries onto th
18fc0 65 20 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a  e end, do this:.
18fd0 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33  **.**    sqlite3
18fe0 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64  SrcListEnlarge(d
18ff0 62 2c 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20  b, pSrclist, 3, 
19000 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  2);.**.** After 
19010 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69  the call above i
19020 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a  t would contain:
19030 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c    A, B, nil, nil
19040 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65  , nil..** If the
19050 20 69 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74   iStart argument
19060 20 68 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74   had been 1 inst
19070 65 61 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74  ead of 2, then t
19080 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75  he result.** wou
19090 6c 64 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41  ld have been:  A
190a0 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c  , nil, nil, nil,
190b0 20 42 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20   B.  To prepend 
190c0 74 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a  the new slots,.*
190d0 2a 20 74 68 65 20 69 53 74 61 72 74 20 76 61 6c  * the iStart val
190e0 75 65 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20  ue would be 0.  
190f0 54 68 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20  The result then 
19100 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c  would.** be: nil
19110 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42  , nil, nil, A, B
19120 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
19130 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
19140 61 69 6c 73 20 74 68 65 20 53 72 63 4c 69 73 74  ails the SrcList
19150 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 20   is unchanged.  
19160 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f  The.** db->mallo
19170 63 46 61 69 6c 65 64 20 66 6c 61 67 20 77 69 6c  cFailed flag wil
19180 6c 20 62 65 20 73 65 74 20 74 6f 20 74 72 75 65  l be set to true
19190 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
191a0 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
191b0 72 67 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  rge(.  sqlite3 *
191c0 64 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74  db,       /* Dat
191d0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
191e0 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f   to notify of OO
191f0 4d 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72  M errors */.  Sr
19200 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
19210 20 2f 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20   /* The SrcList 
19220 74 6f 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a  to be enlarged *
19230 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
19240 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
19250 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f   of new slots to
19260 20 61 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b   add to pSrc->a[
19270 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72  ] */.  int iStar
19280 74 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  t         /* Ind
19290 65 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20  ex in pSrc->a[] 
192a0 6f 66 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f  of first new slo
192b0 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
192c0 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ..  /* Sanity ch
192d0 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e  ecking on callin
192e0 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  g parameters */.
192f0 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74    assert( iStart
19300 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
19310 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20   nExtra>=1 );.  
19320 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20  assert( pSrc!=0 
19330 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
19340 61 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20  art<=pSrc->nSrc 
19350 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
19360 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61  e additional spa
19370 63 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  ce if needed */.
19380 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
19390 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41  +nExtra>pSrc->nA
193a0 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c  lloc ){.    SrcL
193b0 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69  ist *pNew;.    i
193c0 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72 63  nt nAlloc = pSrc
193d0 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a 20  ->nSrc+nExtra;. 
193e0 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20 20     int nGot;.   
193f0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
19400 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72  bRealloc(db, pSr
19410 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  c,.             
19420 20 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 20    sizeof(*pSrc) 
19430 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a  + (nAlloc-1)*siz
19440 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20  eof(pSrc->a[0]) 
19450 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
19460 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
19470 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
19480 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65  iled );.      re
19490 74 75 72 6e 20 70 53 72 63 3b 0a 20 20 20 20 7d  turn pSrc;.    }
194a0 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77  .    pSrc = pNew
194b0 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20 28 73 71  ;.    nGot = (sq
194c0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
194d0 65 28 64 62 2c 20 70 4e 65 77 29 20 2d 20 73 69  e(db, pNew) - si
194e0 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f 73 69 7a  zeof(*pSrc))/siz
194f0 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2b  eof(pSrc->a[0])+
19500 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c  1;.    pSrc->nAl
19510 6c 6f 63 20 3d 20 28 75 31 36 29 6e 47 6f 74 3b  loc = (u16)nGot;
19520 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  .  }..  /* Move 
19530 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74  existing slots t
19540 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74  hat come after t
19550 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65  he newly inserte
19560 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74  d slots.  ** out
19570 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20   of the way */. 
19580 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
19590 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20  c-1; i>=iStart; 
195a0 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e  i--){.    pSrc->
195b0 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53  a[i+nExtra] = pS
195c0 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20  rc->a[i];.  }.  
195d0 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 28 69  pSrc->nSrc += (i
195e0 31 36 29 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a  16)nExtra;..  /*
195f0 20 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c 79 20   Zero the newly 
19600 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20  allocated slots 
19610 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 72  */.  memset(&pSr
19620 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c  c->a[iStart], 0,
19630 20 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b   sizeof(pSrc->a[
19640 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66  0])*nExtra);.  f
19650 6f 72 28 69 3d 69 53 74 61 72 74 3b 20 69 3c 69  or(i=iStart; i<i
19660 53 74 61 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b  Start+nExtra; i+
19670 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b  +){.    pSrc->a[
19680 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b  i].iCursor = -1;
19690 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72  .  }..  /* Retur
196a0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
196b0 68 65 20 65 6e 6c 61 72 67 65 64 20 53 72 63 4c  he enlarged SrcL
196c0 69 73 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ist */.  return 
196d0 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  pSrc;.}.../*.** 
196e0 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62  Append a new tab
196f0 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67  le name to the g
19700 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43  iven SrcList.  C
19710 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c  reate a new SrcL
19720 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
19730 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20  e.  A new entry 
19740 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  is created in th
19750 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69  e SrcList even i
19760 66 20 70 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c  f pTable is NULL
19770 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73  ..**.** A SrcLis
19780 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
19790 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20  r NULL if there 
197a0 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  is an OOM error.
197b0 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 0a 2a    The returned.*
197c0 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20  * SrcList might 
197d0 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
197e0 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
197f0 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69 74 20  was input or it 
19800 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e 65  might be.** a ne
19810 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f 4f  w one.  If an OO
19820 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  M error does occ
19830 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 70 72  urs, then the pr
19840 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70 4c 69  ior value of pLi
19850 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 69 6e  st.** that is in
19860 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74  put to this rout
19870 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74 69 63  ine is automatic
19880 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a  ally freed..**.*
19890 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20 69  * If pDatabase i
198a0 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d  s not null, it m
198b0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74 61  eans that the ta
198c0 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f  ble has an optio
198d0 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  nal.** database 
198e0 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69  name prefix.  Li
198f0 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61 62  ke this:  "datab
19900 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65  ase.table".  The
19910 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f   pDatabase.** po
19920 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c  ints to the tabl
19930 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70  e name and the p
19940 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20  Table points to 
19950 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
19960 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73  e..** The SrcLis
19970 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c  t.a[].zName fiel
19980 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  d is filled with
19990 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
199a0 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63  which might.** c
199b0 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20  ome from pTable 
199c0 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69 73  (if pDatabase is
199d0 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70   NULL) or from p
199e0 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53  Database.  .** S
199f0 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61  rcList.a[].zData
19a00 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77  base is filled w
19a10 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
19a20 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   name from pTabl
19a30 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55  e,.** or with NU
19a40 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73  LL if no databas
19a50 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a  e is specified..
19a60 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  **.** In other w
19a70 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69  ords, if call li
19a80 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
19a90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
19aa0 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c  cListAppend(D,A,
19ab0 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  B,0);.**.** Then
19ac0 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61   B is a table na
19ad0 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  me and the datab
19ae0 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70  ase name is unsp
19af0 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c  ecified.  If cal
19b00 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73  led.** like this
19b10 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
19b20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
19b30 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a  pend(D,A,B,C);.*
19b40 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74  *.** Then C is t
19b50 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  he table name an
19b60 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62  d B is the datab
19b70 61 73 65 20 6e 61 6d 65 2e 20 20 49 66 20 43 20  ase name.  If C 
19b80 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74 68  is defined.** th
19b90 65 6e 20 73 6f 20 69 73 20 42 2e 20 20 49 6e 20  en so is B.  In 
19ba0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 65 20  other words, we 
19bb0 6e 65 76 65 72 20 68 61 76 65 20 61 20 63 61 73  never have a cas
19bc0 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20  e where:.**.**  
19bd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
19be0 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c  cListAppend(D,A,
19bf0 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68  0,C);.**.** Both
19c00 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74   pTable and pDat
19c10 61 62 61 73 65 20 61 72 65 20 61 73 73 75 6d 65  abase are assume
19c20 64 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20  d to be quoted. 
19c30 20 54 68 65 79 20 61 72 65 20 64 65 71 75 6f 74   They are dequot
19c40 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65 69  ed.** before bei
19c50 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ng added to the 
19c60 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c  SrcList..*/.SrcL
19c70 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
19c80 69 73 74 41 70 70 65 6e 64 28 0a 20 20 73 71 6c  istAppend(.  sql
19c90 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
19ca0 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74   /* Connection t
19cb0 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c  o notify of mall
19cc0 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20  oc failures */. 
19cd0 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c   SrcList *pList,
19ce0 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74       /* Append t
19cf0 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74 2e 20  o this SrcList. 
19d00 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61 20 6e  NULL creates a n
19d10 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  ew SrcList */.  
19d20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20  Token *pTable,  
19d30 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
19d40 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65  append */.  Toke
19d50 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20 20 20  n *pDatabase    
19d60 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66 20 74  /* Database of t
19d70 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  he table */.){. 
19d80 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
19d90 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61  item *pItem;.  a
19da0 73 73 65 72 74 28 20 70 44 61 74 61 62 61 73 65  ssert( pDatabase
19db0 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d 30  ==0 || pTable!=0
19dc0 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68   );  /* Cannot h
19dd0 61 76 65 20 43 20 77 69 74 68 6f 75 74 20 42 20  ave C without B 
19de0 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  */.  if( pList==
19df0 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
19e00 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
19e10 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
19e20 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  SrcList) );.    
19e30 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
19e40 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69  eturn 0;.    pLi
19e50 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a  st->nAlloc = 1;.
19e60 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 73 71    }.  pList = sq
19e70 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
19e80 72 67 65 28 64 62 2c 20 70 4c 69 73 74 2c 20 31  rge(db, pList, 1
19e90 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a  , pList->nSrc);.
19ea0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
19eb0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
19ec0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
19ed0 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
19ee0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
19ef0 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  .  pItem = &pLis
19f00 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63  t->a[pList->nSrc
19f10 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61  -1];.  if( pData
19f20 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73  base && pDatabas
19f30 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70  e->z==0 ){.    p
19f40 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
19f50 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  }.  if( pDatabas
19f60 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a  e ){.    Token *
19f70 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73  pTemp = pDatabas
19f80 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65  e;.    pDatabase
19f90 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70   = pTable;.    p
19fa0 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20  Table = pTemp;. 
19fb0 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d   }.  pItem->zNam
19fc0 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
19fd0 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61  romToken(db, pTa
19fe0 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a  ble);.  pItem->z
19ff0 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74  Database = sqlit
1a000 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1a010 64 62 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a  db, pDatabase);.
1a020 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
1a030 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
1a040 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78  VdbeCursor index
1a050 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20   numbers to all 
1a060 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c  tables in a SrcL
1a070 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ist.*/.void sqli
1a080 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
1a090 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70  Cursors(Parse *p
1a0a0 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
1a0b0 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
1a0c0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1a0d0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1a0e0 20 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c   assert(pList ||
1a0f0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1a100 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
1a110 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
1a120 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
1a130 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74  List->a; i<pList
1a140 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
1a150 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  em++){.      if(
1a160 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e   pItem->iCursor>
1a170 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1a180 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72    pItem->iCursor
1a190 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
1a1a0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  +;.      if( pIt
1a1b0 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
1a1c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
1a1d0 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
1a1e0 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  rs(pParse, pItem
1a1f0 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29  ->pSelect->pSrc)
1a200 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a210 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
1a220 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72  ete an entire Sr
1a230 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20  cList including 
1a240 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63  all its substruc
1a250 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
1a260 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1a270 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
1a280 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
1a290 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1a2a0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1a2b0 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
1a2c0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
1a2d0 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
1a2e0 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
1a2f0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
1a300 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
1a310 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1a320 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
1a330 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
1a340 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
1a350 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
1a360 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1a370 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
1a380 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1a390 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65  db, pItem->zInde
1a3a0 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  x);.    sqlite3D
1a3b0 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
1a3c0 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  Item->pTab);.   
1a3d0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1a3e0 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
1a3f0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71  pSelect);.    sq
1a400 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1a410 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b  db, pItem->pOn);
1a420 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69  .    sqlite3IdLi
1a430 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  stDelete(db, pIt
1a440 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d  em->pUsing);.  }
1a450 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1a460 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a  (db, pList);.}..
1a470 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1a480 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
1a490 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 61 64  the parser to ad
1a4a0 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20  d a new term to 
1a4b0 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20  the.** end of a 
1a4c0 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61  growing FROM cla
1a4d0 75 73 65 2e 20 20 54 68 65 20 22 70 22 20 70 61  use.  The "p" pa
1a4e0 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 70  rameter is the p
1a4f0 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52  art of.** the FR
1a500 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20 68  OM clause that h
1a510 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1a520 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22 70  constructed.  "p
1a530 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20  " is NULL.** if 
1a540 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1a550 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52  t term of the FR
1a560 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61 62  OM clause.  pTab
1a570 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65  le and pDatabase
1a580 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65  .** are the name
1a590 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e   of the table an
1a5a0 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64  d database named
1a5b0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1a5c0 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61  use term..** pDa
1a5d0 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20 69  tabase is NULL i
1a5e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  f the database n
1a5f0 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69 73  ame qualifier is
1a600 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a   missing - the.*
1a610 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20 49  * usual case.  I
1a620 66 20 74 68 65 20 74 65 72 6d 20 68 61 73 20 61  f the term has a
1a630 20 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41 6c   alias, then pAl
1a640 69 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ias points to th
1a650 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65 6e  e.** alias token
1a660 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 69  .  If the term i
1a670 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 74 68  s a subquery, th
1a680 65 6e 20 70 53 75 62 71 75 65 72 79 20 69 73 20  en pSubquery is 
1a690 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  the.** SELECT st
1a6a0 61 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65  atement that the
1a6b0 20 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64 65   subquery encode
1a6c0 73 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20 61  s.  The pTable a
1a6d0 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20  nd.** pDatabase 
1a6e0 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 4e  parameters are N
1a6f0 55 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72 69  ULL for subqueri
1a700 65 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e 64  es.  The pOn and
1a710 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d   pUsing.** param
1a720 65 74 65 72 73 20 61 72 65 20 74 68 65 20 63 6f  eters are the co
1a730 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e 20  ntent of the ON 
1a740 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
1a750 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
1a760 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77 68  a new SrcList wh
1a770 69 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20 74  ich encodes is t
1a780 68 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68 65  he FROM with the
1a790 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64 64   new.** term add
1a7a0 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a  ed..*/.SrcList *
1a7b0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1a7c0 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20 20  pendFromTerm(.  
1a7d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1a7e0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
1a7f0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1a800 53 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20 20  SrcList *p,     
1a810 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
1a820 65 66 74 20 70 61 72 74 20 6f 66 20 74 68 65 20  eft part of the 
1a830 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72 65  FROM clause alre
1a840 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f  ady seen */.  To
1a850 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20  ken *pTable,    
1a860 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1a870 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61 64   the table to ad
1a880 64 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63 6c  d to the FROM cl
1a890 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ause */.  Token 
1a8a0 2a 70 44 61 74 61 62 61 73 65 2c 20 20 20 20 20  *pDatabase,     
1a8b0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1a8c0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
1a8d0 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a 20  ning pTable */. 
1a8e0 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c 20   Token *pAlias, 
1a8f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1a900 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
1a910 6f 66 20 74 68 65 20 41 53 20 73 75 62 65 78 70  of the AS subexp
1a920 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ression */.  Sel
1a930 65 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c 20  ect *pSubquery, 
1a940 20 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75 65       /* A subque
1a950 72 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65  ry used in place
1a960 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65   of a table name
1a970 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e 2c   */.  Expr *pOn,
1a980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a990 20 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f   The ON clause o
1a9a0 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64  f a join */.  Id
1a9b0 4c 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20 20  List *pUsing    
1a9c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53 49        /* The USI
1a9d0 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a  NG clause of a j
1a9e0 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  oin */.){.  stru
1a9f0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1aa00 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
1aa10 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1aa20 64 62 3b 0a 20 20 69 66 28 20 21 70 20 26 26 20  db;.  if( !p && 
1aa30 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29 20  (pOn || pUsing) 
1aa40 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1aa50 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1aa60 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69 73  a JOIN clause is
1aa70 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
1aa80 20 25 73 22 2c 20 0a 20 20 20 20 20 20 28 70 4f   %s", .      (pO
1aa90 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49 4e  n ? "ON" : "USIN
1aaa0 47 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 67  G").    );.    g
1aab0 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f  oto append_from_
1aac0 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20 3d  error;.  }.  p =
1aad0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1aae0 70 70 65 6e 64 28 64 62 2c 20 70 2c 20 70 54 61  ppend(db, p, pTa
1aaf0 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b  ble, pDatabase);
1ab00 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e  .  if( p==0 || N
1ab10 45 56 45 52 28 70 2d 3e 6e 53 72 63 3d 3d 30 29  EVER(p->nSrc==0)
1ab20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70   ){.    goto app
1ab30 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a  end_from_error;.
1ab40 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70    }.  pItem = &p
1ab50 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a  ->a[p->nSrc-1];.
1ab60 20 20 61 73 73 65 72 74 28 20 70 41 6c 69 61 73    assert( pAlias
1ab70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 41 6c  !=0 );.  if( pAl
1ab80 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49  ias->n ){.    pI
1ab90 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71  tem->zAlias = sq
1aba0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1abb0 65 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a  en(db, pAlias);.
1abc0 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65    }.  pItem->pSe
1abd0 6c 65 63 74 20 3d 20 70 53 75 62 71 75 65 72 79  lect = pSubquery
1abe0 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d  ;.  pItem->pOn =
1abf0 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70   pOn;.  pItem->p
1ac00 55 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a  Using = pUsing;.
1ac10 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70    return p;.. ap
1ac20 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a  pend_from_error:
1ac30 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
1ac40 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1ac50 44 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b  Delete(db, pOn);
1ac60 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  .  sqlite3IdList
1ac70 44 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69 6e  Delete(db, pUsin
1ac80 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  g);.  sqlite3Sel
1ac90 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
1aca0 75 62 71 75 65 72 79 29 3b 0a 20 20 72 65 74 75  ubquery);.  retu
1acb0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
1acc0 64 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59  dd an INDEXED BY
1acd0 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44 20   or NOT INDEXED 
1ace0 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d 6f  clause to the mo
1acf0 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
1ad00 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66  d .** element of
1ad10 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74   the source-list
1ad20 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
1ad30 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
1ad40 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1ad50 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28  rcListIndexedBy(
1ad60 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
1ad70 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e  rcList *p, Token
1ad80 20 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a 20   *pIndexedBy){. 
1ad90 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 65   assert( pIndexe
1ada0 64 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  dBy!=0 );.  if( 
1adb0 70 20 26 26 20 41 4c 57 41 59 53 28 70 2d 3e 6e  p && ALWAYS(p->n
1adc0 53 72 63 3e 30 29 20 29 7b 0a 20 20 20 20 73 74  Src>0) ){.    st
1add0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1ade0 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61  m *pItem = &p->a
1adf0 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20  [p->nSrc-1];.   
1ae00 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
1ae10 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 26 26  notIndexed==0 &&
1ae20 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 3d 3d   pItem->zIndex==
1ae30 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  0 );.    if( pIn
1ae40 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26  dexedBy->n==1 &&
1ae50 20 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20   !pIndexedBy->z 
1ae60 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e  ){.      /* A "N
1ae70 4f 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75  OT INDEXED" clau
1ae80 73 65 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e  se was supplied.
1ae90 20 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20   See parse.y .  
1aea0 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74      ** construct
1aeb0 20 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66   "indexed_opt" f
1aec0 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20  or details. */. 
1aed0 20 20 20 20 20 70 49 74 65 6d 2d 3e 6e 6f 74 49       pItem->notI
1aee0 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20  ndexed = 1;.    
1aef0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74  }else{.      pIt
1af00 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c  em->zIndex = sql
1af10 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1af20 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49  n(pParse->db, pI
1af30 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d  ndexedBy);.    }
1af40 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  .  }.}../*.** Wh
1af50 65 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61  en building up a
1af60 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20   FROM clause in 
1af70 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 20  the parser, the 
1af80 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  join operator.**
1af90 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74   is initially at
1afa0 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65  tached to the le
1afb0 66 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74  ft operand.  But
1afc0 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
1afd0 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74  tor.** expects t
1afe0 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
1aff0 20 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69   to be on the ri
1b000 67 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68  ght operand.  Th
1b010 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68  is routine.** Sh
1b020 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70  ifts all join op
1b030 65 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66  erators from lef
1b040 74 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61  t to right for a
1b050 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a  n entire FROM.**
1b060 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45   clause..**.** E
1b070 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20  xample: Suppose 
1b080 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65  the join is like
1b090 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1b0a0 20 20 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c         A natural
1b0b0 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a   cross join B.**
1b0c0 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72  .** The operator
1b0d0 20 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f   is "natural cro
1b0e0 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41  ss join".  The A
1b0f0 20 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20   and B operands 
1b100 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  are stored.** in
1b110 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e   p->a[0] and p->
1b120 61 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65  a[1], respective
1b130 6c 79 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  ly.  The parser 
1b140 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73  initially stores
1b150 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72   the.** operator
1b160 20 77 69 74 68 20 41 2e 20 20 54 68 69 73 20 72   with A.  This r
1b170 6f 75 74 69 6e 65 20 73 68 69 66 74 73 20 74 68  outine shifts th
1b180 61 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72  at operator over
1b190 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73   to B..*/.void s
1b1a0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68 69  qlite3SrcListShi
1b1b0 66 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69  ftJoinType(SrcLi
1b1c0 73 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  st *p){.  if( p 
1b1d0 26 26 20 70 2d 3e 61 20 29 7b 0a 20 20 20 20 69  && p->a ){.    i
1b1e0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
1b1f0 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20  p->nSrc-1; i>0; 
1b200 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  i--){.      p->a
1b210 5b 69 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70  [i].jointype = p
1b220 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70  ->a[i-1].jointyp
1b230 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  e;.    }.    p->
1b240 61 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  a[0].jointype = 
1b250 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
1b260 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74  Begin a transact
1b270 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
1b280 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74  te3BeginTransact
1b290 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
1b2a0 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20  e, int type){.  
1b2b0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
1b2c0 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b  dbe *v;.  int i;
1b2d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
1b2e0 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20  se!=0 );.  db = 
1b2f0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
1b300 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 2f  sert( db!=0 );./
1b310 2a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 30  *  if( db->aDb[0
1b320 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
1b330 6e 3b 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  n; */.  if( sqli
1b340 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1b350 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
1b360 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22  SACTION, "BEGIN"
1b370 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72  , 0, 0) ){.    r
1b380 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d  eturn;.  }.  v =
1b390 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1b3a0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21  pParse);.  if( !
1b3b0 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  v ) return;.  if
1b3c0 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52  ( type!=TK_DEFER
1b3d0 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  RED ){.    for(i
1b3e0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
1b3f0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
1b400 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b410 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
1b420 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43  i, (type==TK_EXC
1b430 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20  LUSIVE)+1);.    
1b440 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
1b450 73 42 74 72 65 65 28 76 2c 20 69 29 3b 0a 20 20  sBtree(v, i);.  
1b460 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1b470 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b480 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c  P_AutoCommit, 0,
1b490 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   0);.}../*.** Co
1b4a0 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69  mmit a transacti
1b4b0 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
1b4c0 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74  e3CommitTransact
1b4d0 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
1b4e0 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
1b4f0 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  b;.  Vdbe *v;.. 
1b500 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
1b510 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61  =0 );.  db = pPa
1b520 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
1b530 74 28 20 64 62 21 3d 30 20 29 3b 0a 2f 2a 20 20  t( db!=0 );./*  
1b540 69 66 28 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  if( db->aDb[0].p
1b550 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20  Bt==0 ) return; 
1b560 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
1b570 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1b580 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
1b590 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  TION, "COMMIT", 
1b5a0 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74  0, 0) ){.    ret
1b5b0 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73  urn;.  }.  v = s
1b5c0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1b5d0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
1b5e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1b5f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75  eAddOp2(v, OP_Au
1b600 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b  toCommit, 1, 0);
1b610 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  .  }.}../*.** Ro
1b620 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
1b630 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
1b640 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e  ite3RollbackTran
1b650 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
1b660 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
1b670 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
1b680 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1b690 72 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d  rse!=0 );.  db =
1b6a0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
1b6b0 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
1b6c0 2f 2a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b  /*  if( db->aDb[
1b6d0 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75  0].pBt==0 ) retu
1b6e0 72 6e 3b 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  rn; */.  if( sql
1b6f0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1b700 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
1b710 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42  NSACTION, "ROLLB
1b720 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20  ACK", 0, 0) ){. 
1b730 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1b740 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1b750 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
1b760 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
1b770 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b780 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
1b790 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  1, 1);.  }.}../*
1b7a0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1b7b0 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  n is called by t
1b7c0 68 65 20 70 61 72 73 65 72 20 77 68 65 6e 20 69  he parser when i
1b7d0 74 20 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61  t parses a comma
1b7e0 6e 64 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a  nd to create,.**
1b7f0 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c   release or roll
1b800 62 61 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65  back an SQL save
1b810 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20  point. .*/.void 
1b820 73 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74  sqlite3Savepoint
1b830 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1b840 69 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70  int op, Token *p
1b850 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
1b860 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
1b870 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
1b880 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  se->db, pName);.
1b890 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
1b8a0 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
1b8b0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1b8c0 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  se);.#ifndef SQL
1b8d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
1b8e0 5a 41 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69  ZATION.    stati
1b8f0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63  c const char * c
1b900 6f 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42  onst az[] = { "B
1b910 45 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22  EGIN", "RELEASE"
1b920 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a  , "ROLLBACK" };.
1b930 20 20 20 20 61 73 73 65 72 74 28 20 21 53 41 56      assert( !SAV
1b940 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20  EPOINT_BEGIN && 
1b950 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
1b960 45 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e  E==1 && SAVEPOIN
1b970 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b  T_ROLLBACK==2 );
1b980 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
1b990 21 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74  !v || sqlite3Aut
1b9a0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1b9b0 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c  QLITE_SAVEPOINT,
1b9c0 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20   az[op], zName, 
1b9d0 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
1b9e0 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
1b9f0 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ->db, zName);.  
1ba00 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
1ba10 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
1ba20 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61  eAddOp4(v, OP_Sa
1ba30 76 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20  vepoint, op, 0, 
1ba40 30 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e  0, zName, P4_DYN
1ba50 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  AMIC);.  }.}../*
1ba60 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
1ba70 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  e TEMP database 
1ba80 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69  is open and avai
1ba90 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20  lable for use.  
1baa0 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75  Return.** the nu
1bab0 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
1bac0 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72   Leave any error
1bad0 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65   messages in the
1bae0 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
1baf0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1bb00 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
1bb10 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
1bb20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
1bb30 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1bb40 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  if( db->aDb[1].p
1bb50 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65  Bt==0 && !pParse
1bb60 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
1bb70 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72   int rc;.    Btr
1bb80 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 73 74 61  ee *pBt;.    sta
1bb90 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c  tic const int fl
1bba0 61 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20  ags = .         
1bbb0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1bbc0 44 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20  DWRITE |.       
1bbd0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43     SQLITE_OPEN_C
1bbe0 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20  REATE |.        
1bbf0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
1bc00 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20  CLUSIVE |.      
1bc10 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1bc20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a  DELETEONCLOSE |.
1bc30 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1bc40 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a  _OPEN_TEMP_DB;..
1bc50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1bc60 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56  BtreeOpen(db->pV
1bc70 66 73 2c 20 30 2c 20 64 62 2c 20 26 70 42 74 2c  fs, 0, db, &pBt,
1bc80 20 30 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20   0, flags);.    
1bc90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1bca0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
1bcb0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1bcc0 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70  e, "unable to op
1bcd0 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64  en a temporary d
1bce0 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20  atabase ".      
1bcf0 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72    "file for stor
1bd00 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ing temporary ta
1bd10 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50  bles");.      pP
1bd20 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
1bd30 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1bd40 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62     }.    db->aDb
1bd50 5b 31 5d 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20  [1].pBt = pBt;. 
1bd60 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
1bd70 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b  Db[1].pSchema );
1bd80 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
1bd90 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74  NOMEM==sqlite3Bt
1bda0 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  reeSetPageSize(p
1bdb0 42 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67 65  Bt, db->nextPage
1bdc0 73 69 7a 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a  size, -1, 0) ){.
1bdd0 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
1bde0 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
1bdf0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1be00 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1be10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
1be20 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68  ate VDBE code th
1be30 61 74 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74  at will verify t
1be40 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
1be50 20 61 6e 64 20 73 74 61 72 74 0a 2a 2a 20 61 20   and start.** a 
1be60 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
1be70 20 66 6f 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64   for all named d
1be80 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a  atabase files..*
1be90 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72  *.** It is impor
1bea0 74 61 6e 74 20 74 68 61 74 20 61 6c 6c 20 73 63  tant that all sc
1beb0 68 65 6d 61 20 63 6f 6f 6b 69 65 73 20 62 65 20  hema cookies be 
1bec0 76 65 72 69 66 69 65 64 20 61 6e 64 20 61 6c 6c  verified and all
1bed0 0a 2a 2a 20 72 65 61 64 20 74 72 61 6e 73 61 63  .** read transac
1bee0 74 69 6f 6e 73 20 62 65 20 73 74 61 72 74 65 64  tions be started
1bef0 20 62 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67   before anything
1bf00 20 65 6c 73 65 20 68 61 70 70 65 6e 73 20 69 6e   else happens in
1bf10 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 70 72 6f  .** the VDBE pro
1bf20 67 72 61 6d 2e 20 20 42 75 74 20 74 68 69 73 20  gram.  But this 
1bf30 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63  routine can be c
1bf40 61 6c 6c 65 64 20 61 66 74 65 72 20 6d 75 63 68  alled after much
1bf50 20 6f 74 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68   other.** code h
1bf60 61 73 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65  as been generate
1bf70 64 2e 20 20 53 6f 20 68 65 72 65 20 69 73 20 77  d.  So here is w
1bf80 68 61 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a  hat we do:.**.**
1bf90 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
1bfa0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1bfb0 63 61 6c 6c 65 64 2c 20 77 65 20 63 6f 64 65 20  called, we code 
1bfc0 61 6e 20 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a  an OP_Goto that.
1bfd0 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20  ** will jump to 
1bfe0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 61 74 20  a subroutine at 
1bff0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
1c000 72 6f 67 72 61 6d 2e 20 20 54 68 65 6e 20 77 65  rogram.  Then we
1c010 0a 2a 2a 20 72 65 63 6f 72 64 20 65 76 65 72 79  .** record every
1c020 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 6e   database that n
1c030 65 65 64 73 20 69 74 73 20 73 63 68 65 6d 61 20  eeds its schema 
1c040 76 65 72 69 66 69 65 64 20 69 6e 20 74 68 65 0a  verified in the.
1c050 2a 2a 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  ** pParse->cooki
1c060 65 4d 61 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61  eMask field.  La
1c070 74 65 72 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f  ter, after all o
1c080 74 68 65 72 20 63 6f 64 65 20 68 61 73 20 62 65  ther code has be
1c090 65 6e 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c  en.** generated,
1c0a0 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
1c0b0 74 68 61 74 20 64 6f 65 73 20 74 68 65 20 63 6f  that does the co
1c0c0 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f  okie verificatio
1c0d0 6e 73 20 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73  ns and.** starts
1c0e0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1c0f0 73 20 77 69 6c 6c 20 62 65 20 63 6f 64 65 64 20  s will be coded 
1c100 61 6e 64 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20  and the OP_Goto 
1c110 50 32 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c  P2 value.** will
1c120 20 62 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e   be made to poin
1c130 74 20 74 6f 20 74 68 61 74 20 73 75 62 72 6f 75  t to that subrou
1c140 74 69 6e 65 2e 20 20 54 68 65 20 67 65 6e 65 72  tine.  The gener
1c150 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ation of the.** 
1c160 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74  cookie verificat
1c170 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65 20 63  ion subroutine c
1c180 6f 64 65 20 68 61 70 70 65 6e 73 20 69 6e 20 73  ode happens in s
1c190 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69  qlite3FinishCodi
1c1a0 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  ng()..**.** If i
1c1b0 44 62 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 74  Db<0 then code t
1c1c0 68 65 20 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20  he OP_Goto only 
1c1d0 2d 20 64 6f 6e 27 74 20 73 65 74 20 66 6c 61 67  - don't set flag
1c1e0 20 74 6f 20 76 65 72 69 66 79 20 74 68 65 0a 2a   to verify the.*
1c1f0 2a 20 73 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20  * schema on any 
1c200 64 61 74 61 62 61 73 65 73 2e 20 20 54 68 69 73  databases.  This
1c210 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
1c220 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f  position the OP_
1c230 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e  Goto.** early in
1c240 20 74 68 65 20 63 6f 64 65 2c 20 62 65 66 6f 72   the code, befor
1c250 65 20 77 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79  e we know if any
1c260 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 73   database tables
1c270 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a   will be used..*
1c280 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
1c290 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50  deVerifySchema(P
1c2a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1c2b0 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20  t iDb){.  Parse 
1c2c0 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
1c2d0 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
1c2e0 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 69 66  l(pParse);..  if
1c2f0 28 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f  ( pToplevel->coo
1c300 6b 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20  kieGoto==0 ){.  
1c310 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
1c320 74 65 33 47 65 74 56 64 62 65 28 70 54 6f 70 6c  te3GetVdbe(pTopl
1c330 65 76 65 6c 29 3b 0a 20 20 20 20 69 66 28 20 76  evel);.    if( v
1c340 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  ==0 ) return;  /
1c350 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70  * This only happ
1c360 65 6e 73 20 69 66 20 74 68 65 72 65 20 77 61 73  ens if there was
1c370 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 2a   a prior error *
1c380 2f 0a 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d  /.    pToplevel-
1c390 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71  >cookieGoto = sq
1c3a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1c3b0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30  v, OP_Goto, 0, 0
1c3c0 29 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  )+1;.  }.  if( i
1c3d0 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  Db>=0 ){.    sql
1c3e0 69 74 65 33 20 2a 64 62 20 3d 20 70 54 6f 70 6c  ite3 *db = pTopl
1c3f0 65 76 65 6c 2d 3e 64 62 3b 0a 20 20 20 20 79 44  evel->db;.    yD
1c400 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 0a 20 20 20  bMask mask;..   
1c410 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d   assert( iDb<db-
1c420 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65  >nDb );.    asse
1c430 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  rt( db->aDb[iDb]
1c440 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d  .pBt!=0 || iDb==
1c450 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
1c460 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f   iDb<SQLITE_MAX_
1c470 41 54 54 41 43 48 45 44 2b 32 20 29 3b 0a 20 20  ATTACHED+2 );.  
1c480 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1c490 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
1c4a0 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
1c4b0 20 20 20 20 6d 61 73 6b 20 3d 20 28 28 79 44 62      mask = ((yDb
1c4c0 4d 61 73 6b 29 31 29 3c 3c 69 44 62 3b 0a 20 20  Mask)1)<<iDb;.  
1c4d0 20 20 69 66 28 20 28 70 54 6f 70 6c 65 76 65 6c    if( (pToplevel
1c4e0 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d  ->cookieMask & m
1c4f0 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
1c500 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b   pToplevel->cook
1c510 69 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  ieMask |= mask;.
1c520 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d        pToplevel-
1c530 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62  >cookieValue[iDb
1c540 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  ] = db->aDb[iDb]
1c550 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  .pSchema->schema
1c560 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 69  _cookie;.      i
1c570 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
1c580 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
1c590 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
1c5a0 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 54 6f  TempDatabase(pTo
1c5b0 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 7d  plevel);.      }
1c5c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1c5d0 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
1c5e0 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  zDb is NULL, the
1c5f0 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f  n call sqlite3Co
1c600 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 29  deVerifySchema()
1c610 20 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20 61 74   for each .** at
1c620 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 2e  tached database.
1c630 20 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 76 6f   Otherwise, invo
1c640 6b 65 20 69 74 20 66 6f 72 20 74 68 65 20 64 61  ke it for the da
1c650 74 61 62 61 73 65 20 6e 61 6d 65 64 20 7a 44 62  tabase named zDb
1c660 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73   only..*/.void s
1c670 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1c680 4e 61 6d 65 64 53 63 68 65 6d 61 28 50 61 72 73  NamedSchema(Pars
1c690 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
1c6a0 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 73   char *zDb){.  s
1c6b0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1c6c0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
1c6d0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
1c6e0 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
1c6f0 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
1c700 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
1c710 20 70 44 62 2d 3e 70 42 74 20 26 26 20 28 21 7a   pDb->pBt && (!z
1c720 44 62 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33  Db || 0==sqlite3
1c730 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 70 44 62  StrICmp(zDb, pDb
1c740 2d 3e 7a 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20  ->zName)) ){.   
1c750 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
1c760 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
1c770 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, i);.    }.  }
1c780 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1c790 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
1c7a0 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64  t prepares for d
1c7b0 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f  oing an operatio
1c7c0 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20  n that.** might 
1c7d0 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62  change the datab
1c7e0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
1c7f0 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61  routine starts a
1c800 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
1c810 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61   if we are not a
1c820 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a  lready within.**
1c830 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
1c840 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   If we are alrea
1c850 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  dy within a tran
1c860 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20  saction, then a 
1c870 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73  checkpoint.** is
1c880 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53   set if the setS
1c890 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74  tatement paramet
1c8a0 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63  er is true.  A c
1c8b0 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
1c8c0 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f  .** be set for o
1c8d0 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d  perations that m
1c8e0 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74  ight fail (due t
1c8f0 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  o a constraint) 
1c900 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77  part of.** the w
1c910 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77  ay through and w
1c920 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74  hich will need t
1c930 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74  o undo some writ
1c940 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  es without havin
1c950 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  g to.** rollback
1c960 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73   the whole trans
1c970 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65  action.  For ope
1c980 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c  rations where al
1c990 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  l constraints.**
1c9a0 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20   can be checked 
1c9b0 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67  before any chang
1c9c0 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74  es are made to t
1c9d0 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20  he database, it 
1c9e0 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65  is never.** nece
1c9f0 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20  ssary to undo a 
1ca00 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68  write and the ch
1ca10 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20  eckpoint should 
1ca20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76  not be set..*/.v
1ca30 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
1ca40 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50  WriteOperation(P
1ca50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1ca60 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20  t setStatement, 
1ca70 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73  int iDb){.  Pars
1ca80 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
1ca90 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
1caa0 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73  vel(pParse);.  s
1cab0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1cac0 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
1cad0 44 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c  Db);.  pToplevel
1cae0 2d 3e 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20 28  ->writeMask |= (
1caf0 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 44 62  (yDbMask)1)<<iDb
1cb00 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69  ;.  pToplevel->i
1cb10 73 4d 75 6c 74 69 57 72 69 74 65 20 7c 3d 20 73  sMultiWrite |= s
1cb20 65 74 53 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a  etStatement;.}..
1cb30 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74  /*.** Indicate t
1cb40 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hat the statemen
1cb50 74 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  t currently unde
1cb60 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6d  r construction m
1cb70 69 67 68 74 20 77 72 69 74 65 0a 2a 2a 20 6d 6f  ight write.** mo
1cb80 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72  re than one entr
1cb90 79 20 28 65 78 61 6d 70 6c 65 3a 20 64 65 6c 65  y (example: dele
1cba0 74 69 6e 67 20 6f 6e 65 20 72 6f 77 20 74 68 65  ting one row the
1cbb0 6e 20 69 6e 73 65 72 74 69 6e 67 20 61 6e 6f 74  n inserting anot
1cbc0 68 65 72 2c 0a 2a 2a 20 69 6e 73 65 72 74 69 6e  her,.** insertin
1cbd0 67 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  g multiple rows 
1cbe0 69 6e 20 61 20 74 61 62 6c 65 2c 20 6f 72 20 69  in a table, or i
1cbf0 6e 73 65 72 74 69 6e 67 20 61 20 72 6f 77 20 61  nserting a row a
1cc00 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73  nd index entries
1cc10 2e 29 0a 2a 2a 20 49 66 20 61 6e 20 61 62 6f 72  .).** If an abor
1cc20 74 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 73  t occurs after s
1cc30 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 77 72 69  ome of these wri
1cc40 74 65 73 20 68 61 76 65 20 63 6f 6d 70 6c 65 74  tes have complet
1cc50 65 64 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  ed, then it will
1cc60 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79  .** be necessary
1cc70 20 74 6f 20 75 6e 64 6f 20 74 68 65 20 63 6f 6d   to undo the com
1cc80 70 6c 65 74 65 64 20 77 72 69 74 65 73 2e 0a 2a  pleted writes..*
1cc90 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 75  /.void sqlite3Mu
1cca0 6c 74 69 57 72 69 74 65 28 50 61 72 73 65 20 2a  ltiWrite(Parse *
1ccb0 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65  pParse){.  Parse
1ccc0 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
1ccd0 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
1cce0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54  el(pParse);.  pT
1ccf0 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69  oplevel->isMulti
1cd00 57 72 69 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  Write = 1;.}../*
1cd10 20 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65   .** The code ge
1cd20 6e 65 72 61 74 6f 72 20 63 61 6c 6c 73 20 74 68  nerator calls th
1cd30 69 73 20 72 6f 75 74 69 6e 65 20 69 66 20 69 73  is routine if is
1cd40 20 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20   discovers that 
1cd50 69 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c  it is.** possibl
1cd60 65 20 74 6f 20 61 62 6f 72 74 20 61 20 73 74 61  e to abort a sta
1cd70 74 65 6d 65 6e 74 20 70 72 69 6f 72 20 74 6f 20  tement prior to 
1cd80 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 6e 20  completion.  In 
1cd90 6f 72 64 65 72 20 74 6f 20 0a 2a 2a 20 70 65 72  order to .** per
1cda0 66 6f 72 6d 20 74 68 69 73 20 61 62 6f 72 74 20  form this abort 
1cdb0 77 69 74 68 6f 75 74 20 63 6f 72 72 75 70 74 69  without corrupti
1cdc0 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ng the database,
1cdd0 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65   we need to make
1cde0 0a 2a 2a 20 73 75 72 65 20 74 68 61 74 20 74 68  .** sure that th
1cdf0 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  e statement is p
1ce00 72 6f 74 65 63 74 65 64 20 62 79 20 61 20 73 74  rotected by a st
1ce10 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
1ce20 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e  ion..**.** Techn
1ce30 69 63 61 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79 20  ically, we only 
1ce40 6e 65 65 64 20 74 6f 20 73 65 74 20 74 68 65 20  need to set the 
1ce50 6d 61 79 41 62 6f 72 74 20 66 6c 61 67 20 69 66  mayAbort flag if
1ce60 20 74 68 65 0a 2a 2a 20 69 73 4d 75 6c 74 69 57   the.** isMultiW
1ce70 72 69 74 65 20 66 6c 61 67 20 77 61 73 20 70 72  rite flag was pr
1ce80 65 76 69 6f 75 73 6c 79 20 73 65 74 2e 20 20 54  eviously set.  T
1ce90 68 65 72 65 20 69 73 20 61 20 74 69 6d 65 20 64  here is a time d
1cea0 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 73 75 63  ependency.** suc
1ceb0 68 20 74 68 61 74 20 74 68 65 20 61 62 6f 72 74  h that the abort
1cec0 20 6d 75 73 74 20 6f 63 63 75 72 20 61 66 74 65   must occur afte
1ced0 72 20 74 68 65 20 6d 75 6c 74 69 77 72 69 74 65  r the multiwrite
1cee0 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 0a 2a 2a  .  This makes.**
1cef0 20 73 6f 6d 65 20 73 74 61 74 65 6d 65 6e 74 73   some statements
1cf00 20 69 6e 76 6f 6c 76 69 6e 67 20 74 68 65 20 52   involving the R
1cf10 45 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74 20  EPLACE conflict 
1cf20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72  resolution algor
1cf30 69 74 68 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69 74  ithm.** go a lit
1cf40 74 6c 65 20 66 61 73 74 65 72 2e 20 20 42 75 74  tle faster.  But
1cf50 20 74 61 6b 69 6e 67 20 61 64 76 61 6e 74 61 67   taking advantag
1cf60 65 20 6f 66 20 74 68 69 73 20 74 69 6d 65 20 64  e of this time d
1cf70 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b  ependency.** mak
1cf80 65 73 20 69 74 20 6d 6f 72 65 20 64 69 66 66 69  es it more diffi
1cf90 63 75 6c 74 20 74 6f 20 70 72 6f 76 65 20 74 68  cult to prove th
1cfa0 61 74 20 74 68 65 20 63 6f 64 65 20 69 73 20 63  at the code is c
1cfb0 6f 72 72 65 63 74 20 28 69 6e 20 0a 2a 2a 20 70  orrect (in .** p
1cfc0 61 72 74 69 63 75 6c 61 72 2c 20 69 74 20 70 72  articular, it pr
1cfd0 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 77  events us from w
1cfe0 72 69 74 69 6e 67 20 61 6e 20 65 66 66 65 63 74  riting an effect
1cff0 69 76 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  ive.** implement
1d000 61 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  ation of sqlite3
1d010 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29  AssertMayAbort()
1d020 29 20 61 6e 64 20 73 6f 20 77 65 20 68 61 76 65  ) and so we have
1d030 20 63 68 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74 61   chosen.** to ta
1d040 6b 65 20 74 68 65 20 73 61 66 65 20 72 6f 75 74  ke the safe rout
1d050 65 20 61 6e 64 20 73 6b 69 70 20 74 68 65 20 6f  e and skip the o
1d060 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a  ptimization..*/.
1d070 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 79 41  void sqlite3MayA
1d080 62 6f 72 74 28 50 61 72 73 65 20 2a 70 50 61 72  bort(Parse *pPar
1d090 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54  se){.  Parse *pT
1d0a0 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
1d0b0 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
1d0c0 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65  Parse);.  pTople
1d0d0 76 65 6c 2d 3e 6d 61 79 41 62 6f 72 74 20 3d 20  vel->mayAbort = 
1d0e0 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  1;.}../*.** Code
1d0f0 20 61 6e 20 4f 50 5f 48 61 6c 74 20 74 68 61 74   an OP_Halt that
1d100 20 63 61 75 73 65 73 20 74 68 65 20 76 64 62 65   causes the vdbe
1d110 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 53 51   to return an SQ
1d120 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a  LITE_CONSTRAINT.
1d130 2a 2a 20 65 72 72 6f 72 2e 20 54 68 65 20 6f 6e  ** error. The on
1d140 45 72 72 6f 72 20 70 61 72 61 6d 65 74 65 72 20  Error parameter 
1d150 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
1d160 20 28 69 66 20 61 6e 79 29 20 6f 66 20 74 68 65   (if any) of the
1d170 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e   statement.** an
1d180 64 2f 6f 72 20 63 75 72 72 65 6e 74 20 74 72 61  d/or current tra
1d190 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
1d1a0 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64  ed back..*/.void
1d1b0 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73   sqlite3HaltCons
1d1c0 74 72 61 69 6e 74 28 50 61 72 73 65 20 2a 70 50  traint(Parse *pP
1d1d0 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f  arse, int onErro
1d1e0 72 2c 20 63 68 61 72 20 2a 70 34 2c 20 69 6e 74  r, char *p4, int
1d1f0 20 70 34 74 79 70 65 29 7b 0a 20 20 56 64 62 65   p4type){.  Vdbe
1d200 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
1d210 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
1d220 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  if( onError==OE_
1d230 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 73 71 6c  Abort ){.    sql
1d240 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
1d250 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rse);.  }.  sqli
1d260 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1d270 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
1d280 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 6f 6e 45  _CONSTRAINT, onE
1d290 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34 74  rror, 0, p4, p4t
1d2a0 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ype);.}../*.** C
1d2b0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70  heck to see if p
1d2c0 49 6e 64 65 78 20 75 73 65 73 20 74 68 65 20 63  Index uses the c
1d2d0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1d2e0 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e  e pColl.  Return
1d2f0 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20 64  .** true if it d
1d300 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66  oes and false if
1d310 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f   it does not..*/
1d320 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d330 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61  OMIT_REINDEX.sta
1d340 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f  tic int collatio
1d350 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61  nMatch(const cha
1d360 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20  r *zColl, Index 
1d370 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20  *pIndex){.  int 
1d380 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43 6f  i;.  assert( zCo
1d390 6c 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69  ll!=0 );.  for(i
1d3a0 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43  =0; i<pIndex->nC
1d3b0 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
1d3c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
1d3d0 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
1d3e0 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i];.    assert( 
1d3f0 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  z!=0 );.    if( 
1d400 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
1d410 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20  p(z, zColl) ){. 
1d420 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1d430 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1d440 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 0;.}.#endif../
1d450 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61  *.** Recompute a
1d460 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54  ll indices of pT
1d470 61 62 20 74 68 61 74 20 75 73 65 20 74 68 65 20  ab that use the 
1d480 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
1d490 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20  ce pColl..** If 
1d4a0 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65  pColl==0 then re
1d4b0 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
1d4c0 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a  ces of pTab..*/.
1d4d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d4e0 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
1d4f0 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54  ic void reindexT
1d500 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
1d510 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  se, Table *pTab,
1d520 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f   char const *zCo
1d530 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ll){.  Index *pI
1d540 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
1d550 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61     /* An index a
1d560 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
1d570 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49  Tab */..  for(pI
1d580 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  ndex=pTab->pInde
1d590 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  x; pIndex; pInde
1d5a0 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29  x=pIndex->pNext)
1d5b0 7b 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d  {.    if( zColl=
1d5c0 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d  =0 || collationM
1d5d0 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64  atch(zColl, pInd
1d5e0 65 78 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ex) ){.      int
1d5f0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
1d600 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
1d610 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
1d620 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71  chema);.      sq
1d630 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
1d640 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
1d650 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20   0, iDb);.      
1d660 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
1d670 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
1d680 78 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20  x, -1);.    }.  
1d690 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
1d6a0 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  * Recompute all 
1d6b0 69 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74  indices of all t
1d6c0 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74  ables in all dat
1d6d0 61 62 61 73 65 73 20 77 68 65 72 65 20 74 68 65  abases where the
1d6e0 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20  .** indices use 
1d6f0 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
1d700 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49  quence pColl.  I
1d710 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20  f pColl==0 then 
1d720 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c  recompute.** all
1d730 20 69 6e 64 69 63 65 73 20 65 76 65 72 79 77 68   indices everywh
1d740 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ere..*/.#ifndef 
1d750 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
1d760 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEX.static void 
1d770 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
1d780 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1d790 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
1d7a0 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20  l){.  Db *pDb;  
1d7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7c0 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61    /* A single da
1d7d0 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
1d7e0 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
1d7f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
1d800 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75  atabase index nu
1d810 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  mber */.  sqlite
1d820 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1d830 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74  db;   /* The dat
1d840 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1d850 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a   */.  HashElem *
1d860 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1d870 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
1d880 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20   over tables in 
1d890 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  pDb */.  Table *
1d8a0 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
1d8b0 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
1d8c0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1d8d0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
1d8e0 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
1d8f0 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b  llMutexes(db) );
1d900 20 20 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72 20    /* Needed for 
1d910 73 63 68 65 6d 61 20 61 63 63 65 73 73 20 2a 2f  schema access */
1d920 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44  .  for(iDb=0, pD
1d930 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64  b=db->aDb; iDb<d
1d940 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70  b->nDb; iDb++, p
1d950 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72  Db++){.    asser
1d960 74 28 20 70 44 62 21 3d 30 20 29 3b 0a 20 20 20  t( pDb!=0 );.   
1d970 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73   for(k=sqliteHas
1d980 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63  hFirst(&pDb->pSc
1d990 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
1d9a0 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68   k; k=sqliteHash
1d9b0 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20  Next(k)){.      
1d9c0 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73  pTab = (Table*)s
1d9d0 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29  qliteHashData(k)
1d9e0 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 54  ;.      reindexT
1d9f0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
1da00 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d  b, zColl);.    }
1da10 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
1da20 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1da30 64 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44  de for the REIND
1da40 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  EX command..**.*
1da50 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
1da60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da70 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31              -- 1
1da80 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
1da90 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20  EX  <collation> 
1daa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
1dab0 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   2.**        REI
1dac0 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65  NDEX  ?<database
1dad0 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20  >.?<tablename>  
1dae0 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 3.**        R
1daf0 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61  EINDEX  ?<databa
1db00 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e  se>.?<indexname>
1db10 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72    -- 4.**.** For
1db20 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69  m 1 causes all i
1db30 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74  ndices in all at
1db40 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
1db50 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a   to be rebuilt..
1db60 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c  ** Form 2 rebuil
1db70 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69  ds all indices i
1db80 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  n all databases 
1db90 74 68 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d  that use the nam
1dba0 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20  ed.** collating 
1dbb0 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73  function.  Forms
1dbc0 20 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64   3 and 4 rebuild
1dbd0 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
1dbe0 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63   or all.** indic
1dbf0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
1dc00 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  th the named tab
1dc10 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  le..*/.#ifndef S
1dc20 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
1dc30 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  EX.void sqlite3R
1dc40 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  eindex(Parse *pP
1dc50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
1dc60 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  me1, Token *pNam
1dc70 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  e2){.  CollSeq *
1dc80 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
1dc90 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
1dca0 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72  sequence to be r
1dcb0 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c  eindexed, or NUL
1dcc0 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20  L */.  char *z; 
1dcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dce0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20     /* Name of a 
1dcf0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a  table or index *
1dd00 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1dd10 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  zDb;            
1dd20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
1dd30 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62  atabase */.  Tab
1dd40 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
1dd50 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
1dd60 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
1dd70 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ase */.  Index *
1dd80 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20  pIndex;         
1dd90 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
1dda0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1ddb0 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69   pTab */.  int i
1ddc0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
1ddd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
1dde0 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d  tabase index num
1ddf0 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ber */.  sqlite3
1de00 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1de10 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  b;   /* The data
1de20 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1de30 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a  */.  Token *pObj
1de40 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
1de50 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1de60 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
1de70 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a  o be reindexed *
1de80 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  /..  /* Read the
1de90 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
1dea0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
1deb0 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
1dec0 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
1ded0 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50  * and code in pP
1dee0 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
1def0 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53  NULL. */.  if( S
1df00 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
1df10 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
1df20 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  se) ){.    retur
1df30 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e  n;.  }..  if( pN
1df40 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ame1==0 ){.    r
1df50 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
1df60 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20  pParse, 0);.    
1df70 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20  return;.  }else 
1df80 69 66 28 20 4e 45 56 45 52 28 70 4e 61 6d 65 32  if( NEVER(pName2
1df90 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e  ==0) || pName2->
1dfa0 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  z==0 ){.    char
1dfb0 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73   *zColl;.    ass
1dfc0 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29  ert( pName1->z )
1dfd0 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71  ;.    zColl = sq
1dfe0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1dff0 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
1e000 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20  Name1);.    if( 
1e010 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b  !zColl ) return;
1e020 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
1e030 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
1e040 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f  db, ENC(db), zCo
1e050 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ll, 0);.    if( 
1e060 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72  pColl ){.      r
1e070 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
1e080 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a  pParse, zColl);.
1e090 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
1e0a0 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  ree(db, zColl);.
1e0b0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
1e0c0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
1e0d0 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29  bFree(db, zColl)
1e0e0 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
1e0f0 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
1e100 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
1e110 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61   pName2, &pObjNa
1e120 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30  me);.  if( iDb<0
1e130 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d   ) return;.  z =
1e140 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1e150 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61  Token(db, pObjNa
1e160 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  me);.  if( z==0 
1e170 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20  ) return;.  zDb 
1e180 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
1e190 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73  Name;.  pTab = s
1e1a0 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
1e1b0 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69  db, z, zDb);.  i
1e1c0 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72  f( pTab ){.    r
1e1d0 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72  eindexTable(pPar
1e1e0 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20  se, pTab, 0);.  
1e1f0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1e200 64 62 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74 75  db, z);.    retu
1e210 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78  rn;.  }.  pIndex
1e220 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
1e230 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b  dex(db, z, zDb);
1e240 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1e250 28 64 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70  (db, z);.  if( p
1e260 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c  Index ){.    sql
1e270 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
1e280 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
1e290 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  0, iDb);.    sql
1e2a0 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
1e2b0 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
1e2c0 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  -1);.    return;
1e2d0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72  .  }.  sqlite3Er
1e2e0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1e2f0 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69  unable to identi
1e300 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f  fy the object to
1e310 20 62 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b   be reindexed");
1e320 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1e330 20 52 65 74 75 72 6e 20 61 20 64 79 6e 61 6d 69   Return a dynami
1e340 63 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 4b 65  cly allocated Ke
1e350 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
1e360 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
1e370 0a 2a 2a 20 77 69 74 68 20 4f 50 5f 4f 70 65 6e  .** with OP_Open
1e380 52 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65 6e 57  Read or OP_OpenW
1e390 72 69 74 65 20 74 6f 20 61 63 63 65 73 73 20 64  rite to access d
1e3a0 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 70 49  atabase index pI
1e3b0 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  dx..**.** If suc
1e3c0 63 65 73 73 66 75 6c 2c 20 61 20 70 6f 69 6e 74  cessful, a point
1e3d0 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74  er to the new st
1e3e0 72 75 63 74 75 72 65 20 69 73 20 72 65 74 75 72  ructure is retur
1e3f0 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
1e400 65 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  e.** the caller 
1e410 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
1e420 6f 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  or calling sqlit
1e430 65 33 44 62 46 72 65 65 28 64 62 2c 20 29 20 6f  e3DbFree(db, ) o
1e440 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 0a  n the returned .
1e450 2a 2a 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 61  ** pointer. If a
1e460 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28  n error occurs (
1e470 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 6f 72  out of memory or
1e480 20 6d 69 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69   missing collati
1e490 6f 6e 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65 29  on .** sequence)
1e4a0 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
1e4b0 65 64 20 61 6e 64 20 74 68 65 20 73 74 61 74 65  ed and the state
1e4c0 20 6f 66 20 70 50 61 72 73 65 20 75 70 64 61 74   of pParse updat
1e4d0 65 64 20 74 6f 20 72 65 66 6c 65 63 74 0a 2a 2a  ed to reflect.**
1e4e0 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 4b   the error..*/.K
1e4f0 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 49  eyInfo *sqlite3I
1e500 6e 64 65 78 4b 65 79 69 6e 66 6f 28 50 61 72 73  ndexKeyinfo(Pars
1e510 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
1e520 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20 69   *pIdx){.  int i
1e530 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70  ;.  int nCol = p
1e540 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Idx->nColumn;.  
1e550 69 6e 74 20 6e 42 79 74 65 73 20 3d 20 73 69 7a  int nBytes = siz
1e560 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28  eof(KeyInfo) + (
1e570 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 43  nCol-1)*sizeof(C
1e580 6f 6c 6c 53 65 71 2a 29 20 2b 20 6e 43 6f 6c 3b  ollSeq*) + nCol;
1e590 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1e5a0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b   pParse->db;.  K
1e5b0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 28  eyInfo *pKey = (
1e5c0 4b 65 79 49 6e 66 6f 20 2a 29 73 71 6c 69 74 65  KeyInfo *)sqlite
1e5d0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
1e5e0 2c 20 6e 42 79 74 65 73 29 3b 0a 0a 20 20 69 66  , nBytes);..  if
1e5f0 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 70 4b  ( pKey ){.    pK
1e600 65 79 2d 3e 64 62 20 3d 20 70 50 61 72 73 65 2d  ey->db = pParse-
1e610 3e 64 62 3b 0a 20 20 20 20 70 4b 65 79 2d 3e 61  >db;.    pKey->a
1e620 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 20  SortOrder = (u8 
1e630 2a 29 26 28 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b  *)&(pKey->aColl[
1e640 6e 43 6f 6c 5d 29 3b 0a 20 20 20 20 61 73 73 65  nCol]);.    asse
1e650 72 74 28 20 26 70 4b 65 79 2d 3e 61 53 6f 72 74  rt( &pKey->aSort
1e660 4f 72 64 65 72 5b 6e 43 6f 6c 5d 3d 3d 26 28 28  Order[nCol]==&((
1e670 28 75 38 20 2a 29 70 4b 65 79 29 5b 6e 42 79 74  (u8 *)pKey)[nByt
1e680 65 73 5d 29 20 29 3b 0a 20 20 20 20 66 6f 72 28  es]) );.    for(
1e690 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
1e6a0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
1e6b0 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Coll = pIdx->azC
1e6c0 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73  oll[i];.      as
1e6d0 73 65 72 74 28 20 7a 43 6f 6c 6c 20 29 3b 0a 20  sert( zColl );. 
1e6e0 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c       pKey->aColl
1e6f0 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  [i] = sqlite3Loc
1e700 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
1e710 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  e, zColl);.     
1e720 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65   pKey->aSortOrde
1e730 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f  r[i] = pIdx->aSo
1e740 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20  rtOrder[i];.    
1e750 7d 0a 20 20 20 20 70 4b 65 79 2d 3e 6e 46 69 65  }.    pKey->nFie
1e760 6c 64 20 3d 20 28 75 31 36 29 6e 43 6f 6c 3b 0a  ld = (u16)nCol;.
1e770 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 72 73    }..  if( pPars
1e780 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73  e->nErr ){.    s
1e790 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1e7a0 20 70 4b 65 79 29 3b 0a 20 20 20 20 70 4b 65 79   pKey);.    pKey
1e7b0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1e7c0 72 6e 20 70 4b 65 79 3b 0a 7d 0a                 rn pKey;.}.