/ Hex Artifact Content
Login

Artifact baee971344208e212573c08f6bd5579023cc5d14:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t.h"../*.** This
02f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
0300: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 53 51  ed when a new SQ
0310: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 62  L statement is b
0320: 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62  eginning to.** b
0330: 65 20 70 61 72 73 65 64 2e 20 20 49 6e 69 74 69  e parsed.  Initi
0340: 61 6c 69 7a 65 20 74 68 65 20 70 50 61 72 73 65  alize the pParse
0350: 20 73 74 72 75 63 74 75 72 65 20 61 73 20 6e 65   structure as ne
0360: 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eded..*/.void sq
0370: 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73 65 28  lite3BeginParse(
0380: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
0390: 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67 29 7b  nt explainFlag){
03a0: 0a 20 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  .  pParse->expla
03b0: 69 6e 20 3d 20 28 75 38 29 65 78 70 6c 61 69 6e  in = (u8)explain
03c0: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
03d0: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  nVar = 0;.}..#if
03e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
03f0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0400: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 4c 6f 63  .** The TableLoc
0410: 6b 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  k structure is o
0420: 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65 20  nly used by the 
0430: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0440: 28 29 20 61 6e 64 0a 2a 2a 20 63 6f 64 65 54 61  () and.** codeTa
0450: 62 6c 65 4c 6f 63 6b 73 28 29 20 66 75 6e 63 74  bleLocks() funct
0460: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ions..*/.struct 
0470: 54 61 62 6c 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  TableLock {.  in
0480: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
0490: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
04a0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
04b0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f  e table to be lo
04c0: 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  cked */.  int iT
04d0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ab;            /
04e0: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
04f0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0500: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
0510: 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20  8 isWriteLock;  
0520: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
0530: 77 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c  write lock.  Fal
0540: 73 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f  se for a read lo
0550: 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ck */.  const ch
0560: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
0570: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
0580: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  e */.};../*.** R
0590: 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
05a0: 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6c  hat we want to l
05b0: 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20 72  ock a table at r
05c0: 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a 2a  un-time.  .**.**
05d0: 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   The table to be
05e0: 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f 74   locked has root
05f0: 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20 69   page iTab and i
0600: 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61 62  s found in datab
0610: 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72 65  ase iDb..** A re
0620: 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c 6f  ad or a write lo
0630: 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e 20  ck can be taken 
0640: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73 57  depending on isW
0650: 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ritelock..**.** 
0660: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
0670: 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66 61  t records the fa
0680: 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ct that the lock
0690: 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54 68   is desired.  Th
06a0: 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61 6b  e.** code to mak
06b0: 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75 72  e the lock occur
06c0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
06d0: 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74 6f   a later call to
06e0: 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  .** codeTableLoc
06f0: 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75 72  ks() which occur
0700: 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  s during sqlite3
0710: 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
0720: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  */.void sqlite3T
0730: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72 73  ableLock(.  Pars
0740: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
0750: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0760: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
0770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
0780: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
0790: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
07a0: 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 20  e table to lock 
07b0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
07c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
07d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
07e0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c  he table to be l
07f0: 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69 73  ocked */.  u8 is
0800: 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f 2a  WriteLock,    /*
0810: 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69 74   True for a writ
0820: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73  e lock */.  cons
0830: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 2f  t char *zName  /
0840: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
0850: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
0860: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
0870: 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
0880: 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
0890: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
08a0: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 3b  i;.  int nBytes;
08b0: 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 3b  .  TableLock *p;
08c0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
08d0: 30 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  0 );..  for(i=0;
08e0: 20 69 3c 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54   i<pToplevel->nT
08f0: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0900: 20 20 20 20 70 20 3d 20 26 70 54 6f 70 6c 65 76      p = &pToplev
0910: 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69  el->aTableLock[i
0920: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 44  ];.    if( p->iD
0930: 62 3d 3d 69 44 62 20 26 26 20 70 2d 3e 69 54 61  b==iDb && p->iTa
0940: 62 3d 3d 69 54 61 62 20 29 7b 0a 20 20 20 20 20  b==iTab ){.     
0950: 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20   p->isWriteLock 
0960: 3d 20 28 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63  = (p->isWriteLoc
0970: 6b 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b  k || isWriteLock
0980: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
0990: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42  .    }.  }..  nB
09a0: 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 54 61  ytes = sizeof(Ta
09b0: 62 6c 65 4c 6f 63 6b 29 20 2a 20 28 70 54 6f 70  bleLock) * (pTop
09c0: 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63  level->nTableLoc
09d0: 6b 2b 31 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  k+1);.  pTopleve
09e0: 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 0a  l->aTableLock =.
09f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52        sqlite3DbR
0a00: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 54 6f  eallocOrFree(pTo
0a10: 70 6c 65 76 65 6c 2d 3e 64 62 2c 20 70 54 6f 70  plevel->db, pTop
0a20: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
0a30: 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  k, nBytes);.  if
0a40: 28 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61  ( pToplevel->aTa
0a50: 62 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  bleLock ){.    p
0a60: 20 3d 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61   = &pToplevel->a
0a70: 54 61 62 6c 65 4c 6f 63 6b 5b 70 54 6f 70 6c 65  TableLock[pTople
0a80: 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b  vel->nTableLock+
0a90: 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d  +];.    p->iDb =
0aa0: 20 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61   iDb;.    p->iTa
0ab0: 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d  b = iTab;.    p-
0ac0: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69  >isWriteLock = i
0ad0: 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20  sWriteLock;.    
0ae0: 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  p->zName = zName
0af0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
0b00: 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65  Toplevel->nTable
0b10: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 70 54  Lock = 0;.    pT
0b20: 6f 70 6c 65 76 65 6c 2d 3e 64 62 2d 3e 6d 61 6c  oplevel->db->mal
0b30: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
0b40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
0b50: 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b   an OP_TableLock
0b60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
0b70: 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b   each table lock
0b80: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 61  ed by the.** sta
0b90: 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75 72  tement (configur
0ba0: 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
0bb0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
0bc0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ))..*/.static vo
0bd0: 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  id codeTableLock
0be0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  s(Parse *pParse)
0bf0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0c00: 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70 56  e *pVdbe; ..  pV
0c10: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dbe = sqlite3Get
0c20: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
0c30: 61 73 73 65 72 74 28 20 70 56 64 62 65 21 3d 30  assert( pVdbe!=0
0c40: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47 65   ); /* sqlite3Ge
0c50: 74 56 64 62 65 20 63 61 6e 6e 6f 74 20 66 61 69  tVdbe cannot fai
0c60: 6c 3a 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  l: VDBE already 
0c70: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20  allocated */..  
0c80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
0c90: 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69  e->nTableLock; i
0ca0: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f  ++){.    TableLo
0cb0: 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d  ck *p = &pParse-
0cc0: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
0cd0: 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e      int p1 = p->
0ce0: 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  iDb;.    sqlite3
0cf0: 56 64 62 65 41 64 64 4f 70 34 28 70 56 64 62 65  VdbeAddOp4(pVdbe
0d00: 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20  , OP_TableLock, 
0d10: 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e  p1, p->iTab, p->
0d20: 69 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20  isWriteLock,.   
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f     p->zName, P4_
0d50: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  STATIC);.  }.}.#
0d60: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63  else.  #define c
0d70: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29  odeTableLocks(x)
0d80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
0d90: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
0da0: 65 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20  e given yDbMask 
0db0: 6f 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20  object is empty 
0dc0: 2d 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73  - if it contains
0dd0: 20 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20   no.** 1 bits.  
0de0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0df0: 75 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61  used by the DbMa
0e00: 73 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20  skAllZero() and 
0e10: 44 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a  DbMaskNotZero().
0e20: 2a 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53  ** macros when S
0e30: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
0e40: 45 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ED is greater th
0e50: 61 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51  an 30..*/.#if SQ
0e60: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0e70: 44 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33  D>30.int sqlite3
0e80: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44  DbMaskAllZero(yD
0e90: 62 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20  bMask m){.  int 
0ea0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
0eb0: 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b  sizeof(yDbMask);
0ec0: 20 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29   i++) if( m[i] )
0ed0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
0ee0: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
0ef0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
0f00: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
0f10: 74 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c  ter a single SQL
0f20: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62   statement has b
0f30: 65 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e  een.** parsed an
0f40: 64 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d  d a VDBE program
0f50: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74   to execute that
0f60: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62   statement has b
0f70: 65 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e  een.** prepared.
0f80: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70    This routine p
0f90: 75 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e  uts the finishin
0fa0: 67 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65  g touches on the
0fb0: 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d  .** VDBE program
0fc0: 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20   and resets the 
0fd0: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
0fe0: 20 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a   for the next.**
0ff0: 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   parse..**.** No
1000: 74 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72  te that if an er
1010: 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74  ror occurred, it
1020: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
1030: 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44  se that.** no VD
1040: 42 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65  BE code was gene
1050: 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rated..*/.void s
1060: 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69  qlite3FinishCodi
1070: 6e 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ng(Parse *pParse
1080: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1090: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
10a0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
10b0: 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a  pToplevel==0 );.
10c0: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
10d0: 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  b;.  if( pParse-
10e0: 3e 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e  >nested ) return
10f0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
1100: 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
1110: 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
1120: 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d  if( pParse->rc==
1130: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72  SQLITE_OK ) pPar
1140: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
1150: 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72  ERROR;.    retur
1160: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67  n;.  }..  /* Beg
1170: 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67  in by generating
1180: 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f   some terminatio
1190: 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e  n code at the en
11a0: 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64  d of the.  ** vd
11b0: 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a  be program.  */.
11c0: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
11d0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
11e0: 61 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d  assert( !pParse-
11f0: 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20  >isMultiWrite . 
1200: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
1210: 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f  VdbeAssertMayAbo
1220: 72 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61  rt(v, pParse->ma
1230: 79 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20  yAbort));.  if( 
1240: 76 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  v ){.    while( 
1250: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
1260: 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 76 2c 20  ePriorOpcode(v, 
1270: 4f 50 5f 43 6c 6f 73 65 29 20 29 7b 7d 0a 20 20  OP_Close) ){}.  
1280: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1290: 4f 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b  Op0(v, OP_Halt);
12a0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  ..#if SQLITE_USE
12b0: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
12c0: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
12d0: 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3e 30 20 26 26  >nTableLock>0 &&
12e0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
12f0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1300: 65 33 55 73 65 72 41 75 74 68 49 6e 69 74 28 64  e3UserAuthInit(d
1310: 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  b);.      if( db
1320: 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c  ->auth.authLevel
1330: 3c 55 41 55 54 48 5f 55 73 65 72 20 29 7b 0a 20  <UAUTH_User ){. 
1340: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72         pParse->r
1350: 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48 5f  c = SQLITE_AUTH_
1360: 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 73 71  USER;.        sq
1370: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1380: 61 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20  arse, "user not 
1390: 61 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b  authenticated");
13a0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
13b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
13c0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68  endif..    /* Th
13d0: 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b 20 63 6f  e cookie mask co
13e0: 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69 74 20 66  ntains one bit f
13f0: 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65  or each database
1400: 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20 20 20 20   file open..    
1410: 2a 2a 20 28 42 69 74 20 30 20 69 73 20 66 6f 72  ** (Bit 0 is for
1420: 20 6d 61 69 6e 2c 20 62 69 74 20 31 20 69 73 20   main, bit 1 is 
1430: 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64 20 73 6f  for temp, and so
1440: 20 66 6f 72 74 68 2e 29 20 20 42 69 74 73 20 61   forth.)  Bits a
1450: 72 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 66 6f  re.    ** set fo
1460: 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  r each database 
1470: 74 68 61 74 20 69 73 20 75 73 65 64 2e 20 20 47  that is used.  G
1480: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1490: 73 74 61 72 74 20 61 0a 20 20 20 20 2a 2a 20 74  start a.    ** t
14a0: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 65 61  ransaction on ea
14b0: 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65  ch used database
14c0: 20 61 6e 64 20 74 6f 20 76 65 72 69 66 79 20 74   and to verify t
14d0: 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
14e0: 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61 63 68 20  .    ** on each 
14f0: 75 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20  used database.. 
1500: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62     */.    if( db
1510: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
1520: 30 20 0a 20 20 20 20 20 26 26 20 28 44 62 4d 61  0 .     && (DbMa
1530: 73 6b 4e 6f 6e 5a 65 72 6f 28 70 50 61 72 73 65  skNonZero(pParse
1540: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 20 7c 7c  ->cookieMask) ||
1550: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1560: 78 70 72 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  xpr).    ){.    
1570: 20 20 69 6e 74 20 69 44 62 2c 20 69 3b 0a 20 20    int iDb, i;.  
1580: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
1590: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
15a0: 30 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  0)->opcode==OP_I
15b0: 6e 69 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  nit );.      sql
15c0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
15d0: 28 76 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f  (v, 0);.      fo
15e0: 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64 62 2d  r(iDb=0; iDb<db-
15f0: 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20 20  >nDb; iDb++){.  
1600: 20 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b        if( DbMask
1610: 54 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f  Test(pParse->coo
1620: 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30  kieMask, iDb)==0
1630: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1640: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1650: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
1660: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1670: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
1680: 76 2c 0a 20 20 20 20 20 20 20 20 20 20 4f 50 5f  v,.          OP_
1690: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20  Transaction,    
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  /* Opcode */.   
16c0: 20 20 20 20 20 20 20 69 44 62 2c 20 20 20 20 20         iDb,     
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20            /* P1 
16f0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 44 62 4d  */.          DbM
1700: 61 73 6b 54 65 73 74 28 70 50 61 72 73 65 2d 3e  askTest(pParse->
1710: 77 72 69 74 65 4d 61 73 6b 2c 69 44 62 29 2c 20  writeMask,iDb), 
1720: 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 20 20 20  /* P2 */.       
1730: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69     pParse->cooki
1740: 65 56 61 6c 75 65 5b 69 44 62 5d 2c 20 20 20 20  eValue[iDb],    
1750: 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20        /* P3 */. 
1760: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62           db->aDb
1770: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69  [iDb].pSchema->i
1780: 47 65 6e 65 72 61 74 69 6f 6e 20 20 2f 2a 20 50  Generation  /* P
1790: 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 3b 0a  4 */.        );.
17a0: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
17b0: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 20 73  init.busy==0 ) s
17c0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
17d0: 50 35 28 76 2c 20 31 29 3b 0a 20 20 20 20 20 20  P5(v, 1);.      
17e0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
17f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1800: 22 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  "usesStmtJournal
1810: 3d 25 64 22 2c 20 70 50 61 72 73 65 2d 3e 6d 61  =%d", pParse->ma
1820: 79 41 62 6f 72 74 20 26 26 20 70 50 61 72 73 65  yAbort && pParse
1830: 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 29 29  ->isMultiWrite))
1840: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
1850: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
1860: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
1870: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
1880: 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 3b 20 69  se->nVtabLock; i
1890: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
18a0: 72 20 2a 76 74 61 62 20 3d 20 28 63 68 61 72 20  r *vtab = (char 
18b0: 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  *)sqlite3GetVTab
18c0: 6c 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 61  le(db, pParse->a
18d0: 70 56 74 61 62 4c 6f 63 6b 5b 69 5d 29 3b 0a 20  pVtabLock[i]);. 
18e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18f0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56  beAddOp4(v, OP_V
1900: 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30 2c 20  Begin, 0, 0, 0, 
1910: 76 74 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a  vtab, P4_VTAB);.
1920: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
1930: 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 20  arse->nVtabLock 
1940: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  = 0;.#endif..   
1950: 20 20 20 2f 2a 20 4f 6e 63 65 20 61 6c 6c 20 74     /* Once all t
1960: 68 65 20 63 6f 6f 6b 69 65 73 20 68 61 76 65 20  he cookies have 
1970: 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 61 6e  been verified an
1980: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f  d transactions o
1990: 70 65 6e 65 64 2c 20 0a 20 20 20 20 20 20 2a 2a  pened, .      **
19a0: 20 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71 75   obtain the requ
19b0: 69 72 65 64 20 74 61 62 6c 65 2d 6c 6f 63 6b 73  ired table-locks
19c0: 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
19d0: 70 20 75 6e 6c 65 73 73 20 74 68 65 20 0a 20 20  p unless the .  
19e0: 20 20 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61      ** shared-ca
19f0: 63 68 65 20 66 65 61 74 75 72 65 20 69 73 20 65  che feature is e
1a00: 6e 61 62 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f  nabled..      */
1a10: 0a 20 20 20 20 20 20 63 6f 64 65 54 61 62 6c 65  .      codeTable
1a20: 4c 6f 63 6b 73 28 70 50 61 72 73 65 29 3b 0a 0a  Locks(pParse);..
1a30: 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
1a40: 69 7a 65 20 61 6e 79 20 41 55 54 4f 49 4e 43 52  ize any AUTOINCR
1a50: 45 4d 45 4e 54 20 64 61 74 61 20 73 74 72 75 63  EMENT data struc
1a60: 74 75 72 65 73 20 72 65 71 75 69 72 65 64 2e 0a  tures required..
1a70: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
1a80: 71 6c 69 74 65 33 41 75 74 6f 69 6e 63 72 65 6d  qlite3Autoincrem
1a90: 65 6e 74 42 65 67 69 6e 28 70 50 61 72 73 65 29  entBegin(pParse)
1aa0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ;..      /* Code
1ab0: 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
1ac0: 73 69 6f 6e 73 20 74 68 61 74 20 77 68 65 72 65  sions that where
1ad0: 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20 6f 66   factored out of
1ae0: 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a   inner loops */.
1af0: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
1b00: 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20 29 7b 0a  ->pConstExpr ){.
1b10: 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
1b20: 20 2a 70 45 4c 20 3d 20 70 50 61 72 73 65 2d 3e   *pEL = pParse->
1b30: 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 20 20  pConstExpr;.    
1b40: 20 20 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f      pParse->okCo
1b50: 6e 73 74 46 61 63 74 6f 72 20 3d 20 30 3b 0a 20  nstFactor = 0;. 
1b60: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
1b70: 69 3c 70 45 4c 2d 3e 6e 45 78 70 72 3b 20 69 2b  i<pEL->nExpr; i+
1b80: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +){.          sq
1b90: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1ba0: 61 72 73 65 2c 20 70 45 4c 2d 3e 61 5b 69 5d 2e  arse, pEL->a[i].
1bb0: 70 45 78 70 72 2c 20 70 45 4c 2d 3e 61 5b 69 5d  pExpr, pEL->a[i]
1bc0: 2e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67  .u.iConstExprReg
1bd0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1be0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46     }..      /* F
1bf0: 69 6e 61 6c 6c 79 2c 20 6a 75 6d 70 20 62 61 63  inally, jump bac
1c00: 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  k to the beginni
1c10: 6e 67 20 6f 66 20 74 68 65 20 65 78 65 63 75 74  ng of the execut
1c20: 61 62 6c 65 20 63 6f 64 65 2e 20 2a 2f 0a 20 20  able code. */.  
1c30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
1c40: 6f 74 6f 28 76 2c 20 31 29 3b 0a 20 20 20 20 7d  oto(v, 1);.    }
1c50: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65 74 20  .  }...  /* Get 
1c60: 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d  the VDBE program
1c70: 20 72 65 61 64 79 20 66 6f 72 20 65 78 65 63 75   ready for execu
1c80: 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  tion.  */.  if( 
1c90: 76 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72  v && pParse->nEr
1ca0: 72 3d 3d 30 20 26 26 20 21 64 62 2d 3e 6d 61 6c  r==0 && !db->mal
1cb0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1cc0: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1cd0: 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 30 20  >iCacheLevel==0 
1ce0: 29 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 73 20  );  /* Disables 
1cf0: 61 6e 64 20 72 65 2d 65 6e 61 62 6c 65 73 20 6d  and re-enables m
1d00: 61 74 63 68 20 2a 2f 0a 20 20 20 20 2f 2a 20 41  atch */.    /* A
1d10: 20 6d 69 6e 69 6d 75 6d 20 6f 66 20 6f 6e 65 20   minimum of one 
1d20: 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 69 72  cursor is requir
1d30: 65 64 20 69 66 20 61 75 74 6f 69 6e 63 72 65 6d  ed if autoincrem
1d40: 65 6e 74 20 69 73 20 75 73 65 64 0a 20 20 20 20  ent is used.    
1d50: 2a 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b 61  *  See ticket [a
1d60: 36 39 36 33 37 39 63 31 66 30 38 38 36 36 5d 20  696379c1f08866] 
1d70: 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  */.    if( pPars
1d80: 65 2d 3e 70 41 69 6e 63 21 3d 30 20 26 26 20 70  e->pAinc!=0 && p
1d90: 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 30 20 29  Parse->nTab==0 )
1da0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
1db0: 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  1;.    sqlite3Vd
1dc0: 62 65 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 70  beMakeReady(v, p
1dd0: 50 61 72 73 65 29 3b 0a 20 20 20 20 70 50 61 72  Parse);.    pPar
1de0: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
1df0: 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73 65  DONE;.    pParse
1e00: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20  ->colNamesSet = 
1e10: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1e20: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
1e30: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
1e40: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
1e50: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  0;.  pParse->nMe
1e60: 6d 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  m = 0;.  pParse-
1e70: 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70 50 61  >nSet = 0;.  pPa
1e80: 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20  rse->nVar = 0;. 
1e90: 20 44 62 4d 61 73 6b 5a 65 72 6f 28 70 50 61 72   DbMaskZero(pPar
1ea0: 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3b  se->cookieMask);
1eb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68  .}../*.** Run th
1ec0: 65 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64  e parser and cod
1ed0: 65 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75  e generator recu
1ee0: 72 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72  rsively in order
1ef0: 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20   to generate.** 
1f00: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c  code for the SQL
1f10: 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e   statement given
1f20: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
1f30: 20 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74   the pParse cont
1f40: 65 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  ext.** currently
1f50: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
1f60: 69 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70  ion.  When the p
1f70: 61 72 73 65 72 20 69 73 20 72 75 6e 20 72 65 63  arser is run rec
1f80: 75 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73  ursively.** this
1f90: 20 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20   way, the final 
1fa0: 4f 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61  OP_Halt is not a
1fb0: 70 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65  ppended and othe
1fc0: 72 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  r initialization
1fd0: 0a 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61  .** and finaliza
1fe0: 74 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f  tion steps are o
1ff0: 6d 69 74 74 65 64 20 62 65 63 61 75 73 65 20 74  mitted because t
2000: 68 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e  hose are handlin
2010: 67 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65  g by the.** oute
2020: 72 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a  rmost parser..**
2030: 0a 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69  .** Not everythi
2040: 6e 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20  ng is nestable. 
2050: 20 54 68 69 73 20 66 61 63 69 6c 69 74 79 20 69   This facility i
2060: 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65  s designed to pe
2070: 72 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20  rmit.** INSERT, 
2080: 55 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45  UPDATE, and DELE
2090: 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67  TE operations ag
20a0: 61 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53  ainst SQLITE_MAS
20b0: 54 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72  TER.  Use.** car
20c0: 65 20 69 66 20 79 6f 75 20 64 65 63 69 64 65 20  e if you decide 
20d0: 74 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  to try to use th
20e0: 69 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73  is routine for s
20f0: 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73  ome other purpos
2100: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
2110: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 50  te3NestedParse(P
2120: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
2130: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
2140: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
2150: 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a  st ap;.  char *z
2160: 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  Sql;.  char *zEr
2170: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69  rMsg = 0;.  sqli
2180: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
2190: 2d 3e 64 62 3b 0a 23 20 64 65 66 69 6e 65 20 53  ->db;.# define S
21a0: 41 56 45 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28  AVE_SZ  (sizeof(
21b0: 50 61 72 73 65 29 20 2d 20 6f 66 66 73 65 74 6f  Parse) - offseto
21c0: 66 28 50 61 72 73 65 2c 6e 56 61 72 29 29 0a 20  f(Parse,nVar)). 
21d0: 20 63 68 61 72 20 73 61 76 65 42 75 66 5b 53 41   char saveBuf[SA
21e0: 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70  VE_SZ];..  if( p
21f0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
2200: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
2210: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31  pParse->nested<1
2220: 30 20 29 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67  0 );  /* Nesting
2230: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
2240: 6f 66 20 6c 69 6d 69 74 65 64 20 64 65 70 74 68  of limited depth
2250: 20 2a 2f 0a 20 20 76 61 5f 73 74 61 72 74 28 61   */.  va_start(a
2260: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a  p, zFormat);.  z
2270: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 56 4d 50  Sql = sqlite3VMP
2280: 72 69 6e 74 66 28 64 62 2c 20 7a 46 6f 72 6d 61  rintf(db, zForma
2290: 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
22a0: 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c  (ap);.  if( zSql
22b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
22c0: 6e 3b 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63  n;   /* A malloc
22d0: 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
22e0: 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73  d */.  }.  pPars
22f0: 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d  e->nested++;.  m
2300: 65 6d 63 70 79 28 73 61 76 65 42 75 66 2c 20 26  emcpy(saveBuf, &
2310: 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41  pParse->nVar, SA
2320: 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74  VE_SZ);.  memset
2330: 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20  (&pParse->nVar, 
2340: 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 73  0, SAVE_SZ);.  s
2350: 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28  qlite3RunParser(
2360: 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a  pParse, zSql, &z
2370: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
2380: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
2390: 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  rMsg);.  sqlite3
23a0: 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29  DbFree(db, zSql)
23b0: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61 72  ;.  memcpy(&pPar
23c0: 73 65 2d 3e 6e 56 61 72 2c 20 73 61 76 65 42 75  se->nVar, saveBu
23d0: 66 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 70  f, SAVE_SZ);.  p
23e0: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b  Parse->nested--;
23f0: 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 55  .}..#if SQLITE_U
2400: 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
2410: 4f 4e 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ON./*.** Return 
2420: 54 52 55 45 20 69 66 20 7a 54 61 62 6c 65 20 69  TRUE if zTable i
2430: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
2440: 65 20 73 79 73 74 65 6d 20 74 61 62 6c 65 20 74  e system table t
2450: 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 0a 2a  hat stores the.*
2460: 2a 20 6c 69 73 74 20 6f 66 20 75 73 65 72 73 20  * list of users 
2470: 61 6e 64 20 74 68 65 69 72 20 61 63 63 65 73 73  and their access
2480: 20 63 72 65 64 65 6e 74 69 61 6c 73 2e 0a 2a 2f   credentials..*/
2490: 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 73 65 72  .int sqlite3User
24a0: 41 75 74 68 54 61 62 6c 65 28 63 6f 6e 73 74 20  AuthTable(const 
24b0: 63 68 61 72 20 2a 7a 54 61 62 6c 65 29 7b 0a 20  char *zTable){. 
24c0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
24d0: 73 74 72 69 63 6d 70 28 7a 54 61 62 6c 65 2c 20  stricmp(zTable, 
24e0: 22 73 71 6c 69 74 65 5f 75 73 65 72 22 29 3d 3d  "sqlite_user")==
24f0: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
2500: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
2510: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
2520: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
2530: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
2540: 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20  tabase.** table 
2550: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
2560: 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64  f that table and
2570: 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68   (optionally) th
2580: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
2590: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
25a0: 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ning the table. 
25b0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
25c0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  not found..**.**
25d0: 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73   If zDatabase is
25e0: 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65   0, all database
25f0: 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66  s are searched f
2600: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  or the table and
2610: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61   the.** first ma
2620: 74 63 68 69 6e 67 20 74 61 62 6c 65 20 69 73 20  tching table is 
2630: 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63  returned.  (No c
2640: 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c  hecking for dupl
2650: 69 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e  icate table.** n
2660: 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20  ames is done.)  
2670: 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72  The search order
2680: 20 69 73 20 54 45 4d 50 20 66 69 72 73 74 2c 20   is TEMP first, 
2690: 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20  then MAIN, then 
26a0: 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79  any.** auxiliary
26b0: 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64   databases added
26c0: 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43   using the ATTAC
26d0: 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  H command..**.**
26e0: 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
26f0: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a  3LocateTable()..
2700: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
2710: 33 46 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74  3FindTable(sqlit
2720: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
2730: 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74  ar *zName, const
2740: 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65   char *zDatabase
2750: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20  ){.  Table *p = 
2760: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  0;.  int i;..  /
2770: 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72  * All mutexes ar
2780: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  e required for s
2790: 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d  chema access.  M
27a0: 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64  ake sure we hold
27b0: 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65   them. */.  asse
27c0: 72 74 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30  rt( zDatabase!=0
27d0: 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65   || sqlite3Btree
27e0: 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28  HoldsAllMutexes(
27f0: 64 62 29 20 29 3b 0a 23 69 66 20 53 51 4c 49 54  db) );.#if SQLIT
2800: 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
2810: 41 54 49 4f 4e 0a 20 20 2f 2a 20 4f 6e 6c 79 20  ATION.  /* Only 
2820: 74 68 65 20 61 64 6d 69 6e 20 75 73 65 72 20 69  the admin user i
2830: 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6b 6e 6f  s allowed to kno
2840: 77 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  w that the sqlit
2850: 65 5f 75 73 65 72 20 74 61 62 6c 65 0a 20 20 2a  e_user table.  *
2860: 2a 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 66  * exists */.  if
2870: 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74 68 4c  ( db->auth.authL
2880: 65 76 65 6c 3c 55 41 55 54 48 5f 41 64 6d 69 6e  evel<UAUTH_Admin
2890: 20 26 26 20 73 71 6c 69 74 65 33 55 73 65 72 41   && sqlite3UserA
28a0: 75 74 68 54 61 62 6c 65 28 7a 4e 61 6d 65 29 21  uthTable(zName)!
28b0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
28c0: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
28d0: 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50   for(i=OMIT_TEMP
28e0: 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  DB; i<db->nDb; i
28f0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d  ++){.    int j =
2900: 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69   (i<2) ? i^1 : i
2910: 3b 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45  ;   /* Search TE
2920: 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a  MP before MAIN *
2930: 2f 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 62  /.    if( zDatab
2940: 61 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65  ase!=0 && sqlite
2950: 33 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61  3StrICmp(zDataba
2960: 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a  se, db->aDb[j].z
2970: 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  Name) ) continue
2980: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
2990: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
29a0: 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29  Held(db, j, 0) )
29b0: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
29c0: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
29d0: 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74  Db[j].pSchema->t
29e0: 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a  blHash, zName);.
29f0: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
2a00: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
2a10: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
2a20: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
2a30: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2a40: 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74  describes a part
2a50: 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a  icular database.
2a60: 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  ** table given t
2a70: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
2a80: 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f  table and (optio
2a90: 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20  nally) the name 
2aa0: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
2ab0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
2ac0: 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
2ad0: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
2ae0: 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20  nd.  Also leave 
2af0: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73  an.** error mess
2b00: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
2b10: 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
2b20: 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
2b30: 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
2b40: 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e  e and sqlite3Fin
2b50: 64 54 61 62 6c 65 28 29 20 69 73 20 74 68 61 74  dTable() is that
2b60: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
2b70: 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72   leaves an error
2b80: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
2b90: 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72  se->zErrMsg wher
2ba0: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64  e.** sqlite3Find
2bb0: 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74  Table() does not
2bc0: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
2bd0: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a  te3LocateTable(.
2be0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2bf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74           /* cont
2c00: 65 78 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ext in which to 
2c10: 72 65 70 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f  report errors */
2c20: 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20  .  int isView,  
2c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2c40: 65 20 69 66 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  e if looking for
2c50: 20 61 20 56 49 45 57 20 72 61 74 68 65 72 20 74   a VIEW rather t
2c60: 68 61 6e 20 61 20 54 41 42 4c 45 20 2a 2f 0a 20  han a TABLE */. 
2c70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
2c80: 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me,     /* Name 
2c90: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20  of the table we 
2ca0: 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  are looking for 
2cb0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2cc0: 2a 7a 44 62 61 73 65 20 20 20 20 20 2f 2a 20 4e  *zDbase     /* N
2cd0: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
2ce0: 61 73 65 2e 20 20 4d 69 67 68 74 20 62 65 20 4e  ase.  Might be N
2cf0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ULL */.){.  Tabl
2d00: 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  e *p;..  /* Read
2d10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
2d20: 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f  hema. If an erro
2d30: 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
2d40: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
2d50: 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69  .  ** and code i
2d60: 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
2d70: 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69  urn NULL. */.  i
2d80: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
2d90: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
2da0: 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72  pParse) ){.    r
2db0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
2dc0: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  p = sqlite3FindT
2dd0: 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
2de0: 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b   zName, zDbase);
2df0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
2e00: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2e10: 4d 73 67 20 3d 20 69 73 56 69 65 77 20 3f 20 22  Msg = isView ? "
2e20: 6e 6f 20 73 75 63 68 20 76 69 65 77 22 20 3a 20  no such view" : 
2e30: 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 22 3b  "no such table";
2e40: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2e50: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2e60: 45 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  E.    if( sqlite
2e70: 33 46 69 6e 64 44 62 4e 61 6d 65 28 70 50 61 72  3FindDbName(pPar
2e80: 73 65 2d 3e 64 62 2c 20 7a 44 62 61 73 65 29 3c  se->db, zDbase)<
2e90: 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  1 ){.      /* If
2ea0: 20 7a 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 6f   zName is the no
2eb0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
2ec0: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 73 63 68  table in the sch
2ed0: 65 6d 61 20 63 72 65 61 74 65 64 20 75 73 69 6e  ema created usin
2ee0: 67 0a 20 20 20 20 20 20 2a 2a 20 43 52 45 41 54  g.      ** CREAT
2ef0: 45 2c 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f  E, then check to
2f00: 20 73 65 65 20 69 66 20 69 74 20 69 73 20 74 68   see if it is th
2f10: 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 76 69 72  e name of an vir
2f20: 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 0a  tual table that.
2f30: 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20        ** can be 
2f40: 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72  an eponymous vir
2f50: 74 75 61 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  tual table. */. 
2f60: 20 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f       Module *pMo
2f70: 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29 73 71 6c  d = (Module*)sql
2f80: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 50  ite3HashFind(&pP
2f90: 61 72 73 65 2d 3e 64 62 2d 3e 61 4d 6f 64 75 6c  arse->db->aModul
2fa0: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, zName);.     
2fb0: 20 69 66 28 20 70 4d 6f 64 20 26 26 20 73 71 6c   if( pMod && sql
2fc0: 69 74 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75  ite3VtabEponymou
2fd0: 73 54 61 62 6c 65 49 6e 69 74 28 70 50 61 72 73  sTableInit(pPars
2fe0: 65 2c 20 70 4d 6f 64 29 20 29 7b 0a 20 20 20 20  e, pMod) ){.    
2ff0: 20 20 20 20 72 65 74 75 72 6e 20 70 4d 6f 64 2d      return pMod-
3000: 3e 70 45 70 6f 54 61 62 3b 0a 20 20 20 20 20 20  >pEpoTab;.      
3010: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
3020: 20 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b     if( zDbase ){
3030: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
3040: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3050: 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d 73 67  %s: %s.%s", zMsg
3060: 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29  , zDbase, zName)
3070: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3080: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
3090: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20  sg(pParse, "%s: 
30a0: 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 4e 61 6d 65  %s", zMsg, zName
30b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
30c0: 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
30d0: 20 3d 20 31 3b 0a 20 20 7d 0a 23 69 66 20 53 51   = 1;.  }.#if SQ
30e0: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
30f0: 54 49 43 41 54 49 4f 4e 0a 20 20 65 6c 73 65 20  TICATION.  else 
3100: 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
3110: 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c 3c 55  auth.authLevel<U
3120: 41 55 54 48 5f 55 73 65 72 20 29 7b 0a 20 20 20  AUTH_User ){.   
3130: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3140: 28 70 50 61 72 73 65 2c 20 22 75 73 65 72 20 6e  (pParse, "user n
3150: 6f 74 20 61 75 74 68 65 6e 74 69 63 61 74 65 64  ot authenticated
3160: 22 29 3b 0a 20 20 20 20 70 20 3d 20 30 3b 0a 20  ");.    p = 0;. 
3170: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
3180: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn p;.}../*.** L
3190: 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
31a0: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 2a 70  identified by *p
31b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
31c0: 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
31d0: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
31e0: 62 6c 65 28 29 2e 20 54 68 65 20 64 69 66 66 65  ble(). The diffe
31f0: 72 65 6e 63 65 20 62 65 74 77 65 65 6e 0a 2a 2a  rence between.**
3200: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
3210: 62 6c 65 28 29 20 61 6e 64 20 74 68 69 73 20 66  ble() and this f
3220: 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 61 74 20  unction is that 
3230: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
3240: 73 74 72 69 63 74 73 0a 2a 2a 20 74 68 65 20 73  stricts.** the s
3250: 65 61 72 63 68 20 74 6f 20 73 63 68 65 6d 61 20  earch to schema 
3260: 28 70 2d 3e 70 53 63 68 65 6d 61 29 20 69 66 20  (p->pSchema) if 
3270: 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20  it is not NULL. 
3280: 70 2d 3e 70 53 63 68 65 6d 61 20 6d 61 79 20 62  p->pSchema may b
3290: 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66  e.** non-NULL if
32a0: 20 69 74 20 69 73 20 70 61 72 74 20 6f 66 20 61   it is part of a
32b0: 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65 72   view or trigger
32c0: 20 70 72 6f 67 72 61 6d 20 64 65 66 69 6e 69 74   program definit
32d0: 69 6f 6e 2e 20 53 65 65 0a 2a 2a 20 73 71 6c 69  ion. See.** sqli
32e0: 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 29 20  te3FixSrcList() 
32f0: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a  for details..*/.
3300: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f  Table *sqlite3Lo
3310: 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 0a 20  cateTableItem(. 
3320: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
3330: 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 0a  .  int isView, .
3340: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
3350: 5f 69 74 65 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f  _item *p.){.  co
3360: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20  nst char *zDb;. 
3370: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 63 68   assert( p->pSch
3380: 65 6d 61 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 61  ema==0 || p->zDa
3390: 74 61 62 61 73 65 3d 3d 30 20 29 3b 0a 20 20 69  tabase==0 );.  i
33a0: 66 28 20 70 2d 3e 70 53 63 68 65 6d 61 20 29 7b  f( p->pSchema ){
33b0: 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73  .    int iDb = s
33c0: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
33d0: 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
33e0: 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  p->pSchema);.   
33f0: 20 7a 44 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   zDb = pParse->d
3400: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
3410: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
3420: 7a 44 62 20 3d 20 70 2d 3e 7a 44 61 74 61 62 61  zDb = p->zDataba
3430: 73 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  se;.  }.  return
3440: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
3450: 62 6c 65 28 70 50 61 72 73 65 2c 20 69 73 56 69  ble(pParse, isVi
3460: 65 77 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 44  ew, p->zName, zD
3470: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  b);.}../*.** Loc
3480: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
3490: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
34a0: 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61   describes .** a
34b0: 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65   particular inde
34c0: 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  x given the name
34d0: 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a   of that index.*
34e0: 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f  * and the name o
34f0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
3500: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
3510: 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72   index..** Retur
3520: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
3530: 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44  und..**.** If zD
3540: 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c  atabase is 0, al
3550: 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  l databases are 
3560: 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65  searched for the
3570: 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68  .** table and th
3580: 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
3590: 20 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e   index is return
35a0: 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e  ed.  (No checkin
35b0: 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61  g.** for duplica
35c0: 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69  te index names i
35d0: 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65  s done.)  The se
35e0: 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a  arch order is.**
35f0: 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65   TEMP first, the
3600: 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79  n MAIN, then any
3610: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
3620: 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73  ases added.** us
3630: 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63  ing the ATTACH c
3640: 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78  ommand..*/.Index
3650: 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64   *sqlite3FindInd
3660: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ex(sqlite3 *db, 
3670: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
3680: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
3690: 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20  Db){.  Index *p 
36a0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
36b0: 2f 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61  /* All mutexes a
36c0: 72 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  re required for 
36d0: 73 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20  schema access.  
36e0: 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c  Make sure we hol
36f0: 64 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73  d them. */.  ass
3700: 65 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73  ert( zDb!=0 || s
3710: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
3720: 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29  AllMutexes(db) )
3730: 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54  ;.  for(i=OMIT_T
3740: 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62  EMPDB; i<db->nDb
3750: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
3760: 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20  j = (i<2) ? i^1 
3770: 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20  : i;  /* Search 
3780: 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e  TEMP before MAIN
3790: 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a   */.    Schema *
37a0: 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
37b0: 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  b[j].pSchema;.  
37c0: 20 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d    assert( pSchem
37d0: 61 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62  a );.    if( zDb
37e0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
37f0: 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b  mp(zDb, db->aDb[
3800: 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74  j].zName) ) cont
3810: 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
3820: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
3830: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20  utexHeld(db, j, 
3840: 30 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71  0) );.    p = sq
3850: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70  lite3HashFind(&p
3860: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c  Schema->idxHash,
3870: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   zName);.    if(
3880: 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a   p ) break;.  }.
3890: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
38a0: 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74 68 65  *.** Reclaim the
38b0: 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
38c0: 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74  an index.*/.stat
38d0: 69 63 20 76 6f 69 64 20 66 72 65 65 49 6e 64 65  ic void freeInde
38e0: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  x(sqlite3 *db, I
38f0: 6e 64 65 78 20 2a 70 29 7b 0a 23 69 66 6e 64 65  ndex *p){.#ifnde
3900: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e  f SQLITE_OMIT_AN
3910: 41 4c 59 5a 45 0a 20 20 73 71 6c 69 74 65 33 44  ALYZE.  sqlite3D
3920: 65 6c 65 74 65 49 6e 64 65 78 53 61 6d 70 6c 65  eleteIndexSample
3930: 73 28 64 62 2c 20 70 29 3b 0a 23 65 6e 64 69 66  s(db, p);.#endif
3940: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
3950: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 61 72  lete(db, p->pPar
3960: 74 49 64 78 57 68 65 72 65 29 3b 0a 20 20 73 71  tIdxWhere);.  sq
3970: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
3980: 65 74 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 45  ete(db, p->aColE
3990: 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  xpr);.  sqlite3D
39a0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 43 6f  bFree(db, p->zCo
39b0: 6c 41 66 66 29 3b 0a 20 20 69 66 28 20 70 2d 3e  lAff);.  if( p->
39c0: 69 73 52 65 73 69 7a 65 64 20 29 20 73 71 6c 69  isResized ) sqli
39d0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
39e0: 3e 61 7a 43 6f 6c 6c 29 3b 0a 23 69 66 64 65 66  >azColl);.#ifdef
39f0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
3a00: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
3a10: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
3a20: 61 69 52 6f 77 45 73 74 29 3b 0a 23 65 6e 64 69  aiRowEst);.#endi
3a30: 66 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  f.  sqlite3DbFre
3a40: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
3a50: 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78  ** For the index
3a60: 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65   called zIdxName
3a70: 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20   which is found 
3a80: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
3a90: 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74  iDb,.** unlike t
3aa0: 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69  hat index from i
3ab0: 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65  ts Table then re
3ac0: 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 66  move the index f
3ad0: 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  rom.** the index
3ae0: 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20   hash table and 
3af0: 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  free all memory 
3b00: 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
3b10: 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
3b20: 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64  e index..*/.void
3b30: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
3b40: 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c  dDeleteIndex(sql
3b50: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
3b60: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
3b70: 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65  IdxName){.  Inde
3b80: 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 48 61 73  x *pIndex;.  Has
3b90: 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73 73  h *pHash;..  ass
3ba0: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
3bb0: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
3bc0: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48 61  iDb, 0) );.  pHa
3bd0: 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  sh = &db->aDb[iD
3be0: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  b].pSchema->idxH
3bf0: 61 73 68 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20  ash;.  pIndex = 
3c00: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
3c10: 74 28 70 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d  t(pHash, zIdxNam
3c20: 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57  e, 0);.  if( ALW
3c30: 41 59 53 28 70 49 6e 64 65 78 29 20 29 7b 0a 20  AYS(pIndex) ){. 
3c40: 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70     if( pIndex->p
3c50: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70  Table->pIndex==p
3c60: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70  Index ){.      p
3c70: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70  Index->pTable->p
3c80: 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e  Index = pIndex->
3c90: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
3ca0: 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
3cb0: 3b 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73 74 69  ;.      /* Justi
3cc0: 66 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41  fication of ALWA
3cd0: 59 53 28 29 3b 20 20 54 68 65 20 69 6e 64 65 78  YS();  The index
3ce0: 20 6d 75 73 74 20 62 65 20 6f 6e 20 74 68 65 20   must be on the 
3cf0: 6c 69 73 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a  list of.      **
3d00: 20 69 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20   indices. */.   
3d10: 20 20 20 70 20 3d 20 70 49 6e 64 65 78 2d 3e 70     p = pIndex->p
3d20: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a 20  Table->pIndex;. 
3d30: 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41       while( ALWA
3d40: 59 53 28 70 29 20 26 26 20 70 2d 3e 70 4e 65 78  YS(p) && p->pNex
3d50: 74 21 3d 70 49 6e 64 65 78 20 29 7b 20 70 20 3d  t!=pIndex ){ p =
3d60: 20 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20   p->pNext; }.   
3d70: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 20     if( ALWAYS(p 
3d80: 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e  && p->pNext==pIn
3d90: 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  dex) ){.        
3da0: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65  p->pNext = pInde
3db0: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  x->pNext;.      
3dc0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  }.    }.    free
3dd0: 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
3de0: 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61  );.  }.  db->fla
3df0: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
3e00: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
3e10: 2a 0a 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67  *.** Look throug
3e20: 68 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6f 70  h the list of op
3e30: 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
3e40: 73 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61  s in db->aDb[] a
3e50: 6e 64 20 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76  nd if.** any hav
3e60: 65 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72  e been closed, r
3e70: 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20  emove them from 
3e80: 74 68 65 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c  the list.  Reall
3e90: 6f 63 61 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d  ocate the.** db-
3ea0: 3e 61 44 62 5b 5d 20 73 74 72 75 63 74 75 72 65  >aDb[] structure
3eb0: 20 74 6f 20 61 20 73 6d 61 6c 6c 65 72 20 73 69   to a smaller si
3ec0: 7a 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e  ze, if possible.
3ed0: 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28  .**.** Entry 0 (
3ee0: 74 68 65 20 22 6d 61 69 6e 22 20 64 61 74 61 62  the "main" datab
3ef0: 61 73 65 29 20 61 6e 64 20 65 6e 74 72 79 20 31  ase) and entry 1
3f00: 20 28 74 68 65 20 22 74 65 6d 70 22 20 64 61 74   (the "temp" dat
3f10: 61 62 61 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65  abase).** are ne
3f20: 76 65 72 20 63 61 6e 64 69 64 61 74 65 73 20 66  ver candidates f
3f30: 6f 72 20 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73  or being collaps
3f40: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
3f50: 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62  te3CollapseDatab
3f60: 61 73 65 41 72 72 61 79 28 73 71 6c 69 74 65 33  aseArray(sqlite3
3f70: 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20   *db){.  int i, 
3f80: 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20  j;.  for(i=j=2; 
3f90: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
3fa0: 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a  .    struct Db *
3fb0: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
3fc0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
3fd0: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
3fe0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3ff0: 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  , pDb->zName);. 
4000: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20       pDb->zName 
4010: 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  = 0;.      conti
4020: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
4030: 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20  f( j<i ){.      
4040: 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d  db->aDb[j] = db-
4050: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  >aDb[i];.    }. 
4060: 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65     j++;.  }.  me
4070: 6d 73 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d  mset(&db->aDb[j]
4080: 2c 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29  , 0, (db->nDb-j)
4090: 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b  *sizeof(db->aDb[
40a0: 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20  j]));.  db->nDb 
40b0: 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e  = j;.  if( db->n
40c0: 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62  Db<=2 && db->aDb
40d0: 21 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20  !=db->aDbStatic 
40e0: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62  ){.    memcpy(db
40f0: 2d 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d  ->aDbStatic, db-
4100: 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64  >aDb, 2*sizeof(d
4110: 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20  b->aDb[0]));.   
4120: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4130: 62 2c 20 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20  b, db->aDb);.   
4140: 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61   db->aDb = db->a
4150: 44 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a  DbStatic;.  }.}.
4160: 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65  ./*.** Reset the
4170: 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 20   schema for the 
4180: 64 61 74 61 62 61 73 65 20 61 74 20 69 6e 64 65  database at inde
4190: 78 20 69 44 62 2e 20 20 41 6c 73 6f 20 72 65 73  x iDb.  Also res
41a0: 65 74 20 74 68 65 0a 2a 2a 20 54 45 4d 50 20 73  et the.** TEMP s
41b0: 63 68 65 6d 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73  chema..*/.void s
41c0: 71 6c 69 74 65 33 52 65 73 65 74 4f 6e 65 53 63  qlite3ResetOneSc
41d0: 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62  hema(sqlite3 *db
41e0: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 44 62  , int iDb){.  Db
41f0: 20 2a 70 44 62 3b 0a 20 20 61 73 73 65 72 74 28   *pDb;.  assert(
4200: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
4210: 0a 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 52  .  /* Case 1:  R
4220: 65 73 65 74 20 74 68 65 20 73 69 6e 67 6c 65 20  eset the single 
4230: 73 63 68 65 6d 61 20 69 64 65 6e 74 69 66 69 65  schema identifie
4240: 64 20 62 79 20 69 44 62 20 2a 2f 0a 20 20 70 44  d by iDb */.  pD
4250: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
4260: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ];.  assert( sql
4270: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
4280: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
4290: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
42a0: 2d 3e 70 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a  ->pSchema!=0 );.
42b0: 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43    sqlite3SchemaC
42c0: 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d  lear(pDb->pSchem
42d0: 61 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79  a);..  /* If any
42e0: 20 64 61 74 61 62 61 73 65 20 6f 74 68 65 72 20   database other 
42f0: 74 68 61 6e 20 54 45 4d 50 20 69 73 20 72 65 73  than TEMP is res
4300: 65 74 2c 20 74 68 65 6e 20 61 6c 73 6f 20 72 65  et, then also re
4310: 73 65 74 20 54 45 4d 50 0a 20 20 2a 2a 20 73 69  set TEMP.  ** si
4320: 6e 63 65 20 54 45 4d 50 20 6d 69 67 68 74 20 62  nce TEMP might b
4330: 65 20 68 6f 6c 64 69 6e 67 20 74 72 69 67 67 65  e holding trigge
4340: 72 73 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  rs that referenc
4350: 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 0a  e tables in the.
4360: 20 20 2a 2a 20 6f 74 68 65 72 20 64 61 74 61 62    ** other datab
4370: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ase..  */.  if( 
4380: 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 70 44  iDb!=1 ){.    pD
4390: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 31 5d 3b  b = &db->aDb[1];
43a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62  .    assert( pDb
43b0: 2d 3e 70 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a  ->pSchema!=0 );.
43c0: 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d      sqlite3Schem
43d0: 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68  aClear(pDb->pSch
43e0: 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ema);.  }.  retu
43f0: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61  rn;.}../*.** Era
4400: 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e  se all schema in
4410: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61  formation from a
4420: 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
4430: 62 61 73 65 73 20 28 69 6e 63 6c 75 64 69 6e 67  bases (including
4440: 0a 2a 2a 20 22 6d 61 69 6e 22 20 61 6e 64 20 22  .** "main" and "
4450: 74 65 6d 70 22 29 20 66 6f 72 20 61 20 73 69 6e  temp") for a sin
4460: 67 6c 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  gle database con
4470: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
4480: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
4490: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
44a0: 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ion(sqlite3 *db)
44b0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  {.  int i;.  sql
44c0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
44d0: 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30  l(db);.  for(i=0
44e0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
44f0: 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d  ){.    Db *pDb =
4500: 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20   &db->aDb[i];.  
4510: 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
4520: 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ma ){.      sqli
4530: 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70  te3SchemaClear(p
4540: 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Db->pSchema);.  
4550: 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c    }.  }.  db->fl
4560: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
4570: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20  nternChanges;.  
4580: 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63  sqlite3VtabUnloc
4590: 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c  kList(db);.  sql
45a0: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c  ite3BtreeLeaveAl
45b0: 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  l(db);.  sqlite3
45c0: 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65  CollapseDatabase
45d0: 41 72 72 61 79 28 64 62 29 3b 0a 7d 0a 0a 2f 2a  Array(db);.}../*
45e0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
45f0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
4600: 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e  a commit occurs.
4610: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4620: 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
4630: 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
4640: 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  b){.  db->flags 
4650: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
4660: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
4670: 2a 2a 20 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79  ** Delete memory
4680: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
4690: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
46a0: 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69  of a table or vi
46b0: 65 77 20 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65  ew (the.** Table
46c0: 2e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a  .aCol[] array)..
46d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
46e0: 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
46f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
4700: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
4710: 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20  int i;.  Column 
4720: 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28  *pCol;.  assert(
4730: 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20   pTable!=0 );.  
4740: 69 66 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62  if( (pCol = pTab
4750: 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a  le->aCol)!=0 ){.
4760: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
4770: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
4780: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
4790: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
47a0: 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  b, pCol->zName);
47b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
47c0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f  prDelete(db, pCo
47d0: 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20  l->pDflt);.     
47e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
47f0: 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b  b, pCol->zDflt);
4800: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
4810: 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a  Free(db, pCol->z
4820: 54 79 70 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Type);.      sql
4830: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4840: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20  Col->zColl);.   
4850: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
4860: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  Free(db, pTable-
4870: 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  >aCol);.  }.}../
4880: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
4890: 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75  memory data stru
48a0: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
48b0: 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  d with the given
48c0: 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63  .** Table.  No c
48d0: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
48e0: 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73 20  to disk by this 
48f0: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
4900: 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
4910: 20 64 65 6c 65 74 65 73 20 74 68 65 20 64 61 74   deletes the dat
4920: 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74  a structure.  It
4930: 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b   does not unlink
4940: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61  .** the table da
4950: 74 61 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ta structure fro
4960: 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  m the hash table
4970: 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20 64  .  But it does d
4980: 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79  estroy.** memory
4990: 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 74   structures of t
49a0: 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66  he indices and f
49b0: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f  oreign keys asso
49c0: 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20  ciated with .** 
49d0: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
49e0: 20 54 68 65 20 64 62 20 70 61 72 61 6d 65 74 65   The db paramete
49f0: 72 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20  r is optional.  
4a00: 49 74 20 69 73 20 6e 65 65 64 65 64 20 69 66 20  It is needed if 
4a10: 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
4a20: 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6c 6f   .** contains lo
4a30: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 20  okaside memory. 
4a40: 20 28 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20   (Table objects 
4a50: 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 64 6f  in the schema do
4a60: 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b   not use.** look
4a70: 61 73 69 64 65 20 6d 65 6d 6f 72 79 2c 20 62 75  aside memory, bu
4a80: 74 20 73 6f 6d 65 20 65 70 68 65 6d 65 72 61 6c  t some ephemeral
4a90: 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 64   Table objects d
4aa0: 6f 2e 29 20 20 4f 72 20 74 68 65 0a 2a 2a 20 64  o.)  Or the.** d
4ab0: 62 20 70 61 72 61 6d 65 74 65 72 20 63 61 6e 20  b parameter can 
4ac0: 62 65 20 75 73 65 64 20 77 69 74 68 20 64 62 2d  be used with db-
4ad0: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 74 6f  >pnBytesFreed to
4ae0: 20 6d 65 61 73 75 72 65 20 74 68 65 20 6d 65 6d   measure the mem
4af0: 6f 72 79 0a 2a 2a 20 75 73 65 64 20 62 79 20 74  ory.** used by t
4b00: 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e  he Table object.
4b10: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4b20: 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  DeleteTable(sqli
4b30: 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  te3 *db, Table *
4b40: 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78  pTable){.  Index
4b50: 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74   *pIndex, *pNext
4b60: 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e  ;.  TESTONLY( in
4b70: 74 20 6e 4c 6f 6f 6b 61 73 69 64 65 3b 20 29 20  t nLookaside; ) 
4b80: 2f 2a 20 55 73 65 64 20 74 6f 20 76 65 72 69 66  /* Used to verif
4b90: 79 20 6c 6f 6f 6b 61 73 69 64 65 20 6e 6f 74 20  y lookaside not 
4ba0: 75 73 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20  used for schema 
4bb0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  */..  assert( !p
4bc0: 54 61 62 6c 65 20 7c 7c 20 70 54 61 62 6c 65 2d  Table || pTable-
4bd0: 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a  >nRef>0 );..  /*
4be0: 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   Do not delete t
4bf0: 68 65 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74  he table until t
4c00: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
4c10: 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e  nt reaches zero.
4c20: 20 2a 2f 0a 20 20 69 66 28 20 21 70 54 61 62 6c   */.  if( !pTabl
4c30: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  e ) return;.  if
4c40: 28 20 28 28 21 64 62 20 7c 7c 20 64 62 2d 3e 70  ( ((!db || db->p
4c50: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20  nBytesFreed==0) 
4c60: 26 26 20 28 2d 2d 70 54 61 62 6c 65 2d 3e 6e 52  && (--pTable->nR
4c70: 65 66 29 3e 30 29 20 29 20 72 65 74 75 72 6e 3b  ef)>0) ) return;
4c80: 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68  ..  /* Record th
4c90: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73  e number of outs
4ca0: 74 61 6e 64 69 6e 67 20 6c 6f 6f 6b 61 73 69 64  tanding lookasid
4cb0: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e  e allocations in
4cc0: 20 73 63 68 65 6d 61 20 54 61 62 6c 65 73 0a 20   schema Tables. 
4cd0: 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 64 6f 69   ** prior to doi
4ce0: 6e 67 20 61 6e 79 20 66 72 65 65 28 29 20 6f 70  ng any free() op
4cf0: 65 72 61 74 69 6f 6e 73 2e 20 20 53 69 6e 63 65  erations.  Since
4d00: 20 73 63 68 65 6d 61 20 54 61 62 6c 65 73 20 64   schema Tables d
4d10: 6f 20 6e 6f 74 20 75 73 65 0a 20 20 2a 2a 20 6c  o not use.  ** l
4d20: 6f 6f 6b 61 73 69 64 65 2c 20 74 68 69 73 20 6e  ookaside, this n
4d30: 75 6d 62 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74  umber should not
4d40: 20 63 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 54 45   change. */.  TE
4d50: 53 54 4f 4e 4c 59 28 20 6e 4c 6f 6f 6b 61 73 69  STONLY( nLookasi
4d60: 64 65 20 3d 20 28 64 62 20 26 26 20 28 70 54 61  de = (db && (pTa
4d70: 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  ble->tabFlags & 
4d80: 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30  TF_Ephemeral)==0
4d90: 29 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) ?.            
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d               db-
4db0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20  >lookaside.nOut 
4dc0: 3a 20 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c  : 0 );..  /* Del
4dd0: 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ete all indices 
4de0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
4df0: 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  this table. */. 
4e00: 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54   for(pIndex = pT
4e10: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49  able->pIndex; pI
4e20: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65  ndex; pIndex=pNe
4e30: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
4e40: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
4e50: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
4e60: 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  ex->pSchema==pTa
4e70: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  ble->pSchema );.
4e80: 20 20 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64      if( !db || d
4e90: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
4ea0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =0 ){.      char
4eb0: 20 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e 64 65 78   *zName = pIndex
4ec0: 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20 20 20 20  ->zName; .      
4ed0: 54 45 53 54 4f 4e 4c 59 20 28 20 49 6e 64 65 78  TESTONLY ( Index
4ee0: 20 2a 70 4f 6c 64 20 3d 20 29 20 73 71 6c 69 74   *pOld = ) sqlit
4ef0: 65 33 48 61 73 68 49 6e 73 65 72 74 28 0a 20 20  e3HashInsert(.  
4f00: 20 20 20 20 20 20 20 26 70 49 6e 64 65 78 2d 3e         &pIndex->
4f10: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
4f20: 2c 20 7a 4e 61 6d 65 2c 20 30 0a 20 20 20 20 20  , zName, 0.     
4f30: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
4f40: 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ( db==0 || sqlit
4f50: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
4f60: 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d  d(db, 0, pIndex-
4f70: 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20  >pSchema) );.   
4f80: 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d     assert( pOld=
4f90: 3d 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c 64 3d  =pIndex || pOld=
4fa0: 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =0 );.    }.    
4fb0: 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49  freeIndex(db, pI
4fc0: 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ndex);.  }..  /*
4fd0: 20 44 65 6c 65 74 65 20 61 6e 79 20 66 6f 72 65   Delete any fore
4fe0: 69 67 6e 20 6b 65 79 73 20 61 74 74 61 63 68 65  ign keys attache
4ff0: 64 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 2e  d to this table.
5000: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46 6b 44   */.  sqlite3FkD
5010: 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65  elete(db, pTable
5020: 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  );..  /* Delete 
5030: 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
5040: 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f  ure itself..  */
5050: 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  .  sqlite3Delete
5060: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20  ColumnNames(db, 
5070: 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74  pTable);.  sqlit
5080: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
5090: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  ble->zName);.  s
50a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
50b0: 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66   pTable->zColAff
50c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
50d0: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61  ctDelete(db, pTa
50e0: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  ble->pSelect);. 
50f0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5100: 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c  Delete(db, pTabl
5110: 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 69 66 6e  e->pCheck);.#ifn
5120: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5130: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73  VIRTUALTABLE.  s
5140: 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61 72 28  qlite3VtabClear(
5150: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 23 65 6e  db, pTable);.#en
5160: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62 46  dif.  sqlite3DbF
5170: 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ree(db, pTable);
5180: 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68  ..  /* Verify th
5190: 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73 69 64 65 20  at no lookaside 
51a0: 6d 65 6d 6f 72 79 20 77 61 73 20 75 73 65 64 20  memory was used 
51b0: 62 79 20 73 63 68 65 6d 61 20 74 61 62 6c 65 73  by schema tables
51c0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 4c   */.  assert( nL
51d0: 6f 6f 6b 61 73 69 64 65 3d 3d 30 20 7c 7c 20 6e  ookaside==0 || n
51e0: 4c 6f 6f 6b 61 73 69 64 65 3d 3d 64 62 2d 3e 6c  Lookaside==db->l
51f0: 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20 29 3b  ookaside.nOut );
5200: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
5210: 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65   the given table
5220: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
5230: 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65  ables and the de
5240: 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c  lete the.** tabl
5250: 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  e structure with
5260: 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73   all its indices
5270: 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79   and foreign key
5280: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
5290: 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  e3UnlinkAndDelet
52a0: 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  eTable(sqlite3 *
52b0: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e  db, int iDb, con
52c0: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d  st char *zTabNam
52d0: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
52e0: 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73    Db *pDb;..  as
52f0: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
5300: 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
5310: 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
5320: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54 61 62  ;.  assert( zTab
5330: 4e 61 6d 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Name );.  assert
5340: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
5350: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
5360: 2c 20 30 29 20 29 3b 0a 20 20 74 65 73 74 63 61  , 0) );.  testca
5370: 73 65 28 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d  se( zTabName[0]=
5380: 3d 30 20 29 3b 20 20 2f 2a 20 5a 65 72 6f 2d 6c  =0 );  /* Zero-l
5390: 65 6e 67 74 68 20 74 61 62 6c 65 20 6e 61 6d 65  ength table name
53a0: 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 2a 2f  s are allowed */
53b0: 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
53c0: 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73 71  b[iDb];.  p = sq
53d0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
53e0: 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
53f0: 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61 6d 65  blHash, zTabName
5400: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  , 0);.  sqlite3D
5410: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
5420: 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  );.  db->flags |
5430: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
5440: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
5450: 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20   Given a token, 
5460: 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20  return a string 
5470: 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  that consists of
5480: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 61   the text of tha
5490: 74 0a 2a 2a 20 74 6f 6b 65 6e 2e 20 20 53 70 61  t.** token.  Spa
54a0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
54b0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a  eturned string.*
54c0: 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  * is obtained fr
54d0: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
54e0: 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
54f0: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
5500: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a  ng.** function..
5510: 2a 2a 0a 2a 2a 20 41 6e 79 20 71 75 6f 74 61 74  **.** Any quotat
5520: 69 6f 6e 20 6d 61 72 6b 73 20 28 65 78 3a 20 20  ion marks (ex:  
5530: 22 6e 61 6d 65 22 2c 20 27 6e 61 6d 65 27 2c 20  "name", 'name', 
5540: 5b 6e 61 6d 65 5d 2c 20 6f 72 20 60 6e 61 6d 65  [name], or `name
5550: 60 29 20 74 68 61 74 0a 2a 2a 20 73 75 72 72 6f  `) that.** surro
5560: 75 6e 64 20 74 68 65 20 62 6f 64 79 20 6f 66 20  und the body of 
5570: 74 68 65 20 74 6f 6b 65 6e 20 61 72 65 20 72 65  the token are re
5580: 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b  moved..**.** Tok
5590: 65 6e 73 20 61 72 65 20 6f 66 74 65 6e 20 6a 75  ens are often ju
55a0: 73 74 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f  st pointers into
55b0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
55c0: 4c 20 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a  L text and so.**
55d0: 20 61 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65   are not \000 te
55e0: 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65  rminated and are
55f0: 20 6e 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e   not persistent.
5600: 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 73    The returned s
5610: 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30  tring.** is \000
5620: 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20   terminated and 
5630: 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a  is persistent..*
5640: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e  /.char *sqlite3N
5650: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c  ameFromToken(sql
5660: 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20  ite3 *db, Token 
5670: 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  *pName){.  char 
5680: 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e  *zName;.  if( pN
5690: 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  ame ){.    zName
56a0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
56b0: 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70  Dup(db, (char*)p
56c0: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
56d0: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  n);.    sqlite3D
56e0: 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20  equote(zName);. 
56f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d   }else{.    zNam
5700: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
5710: 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  urn zName;.}../*
5720: 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c  .** Open the sql
5730: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
5740: 20 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62   stored in datab
5750: 61 73 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66  ase number iDb f
5760: 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54  or.** writing. T
5770: 68 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e  he table is open
5780: 65 64 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20  ed using cursor 
5790: 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
57a0: 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
57b0: 65 28 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20  e(Parse *p, int 
57c0: 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  iDb){.  Vdbe *v 
57d0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
57e0: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61  (p);.  sqlite3Ta
57f0: 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20  bleLock(p, iDb, 
5800: 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20  MASTER_ROOT, 1, 
5810: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
5820: 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ));.  sqlite3Vdb
5830: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
5840: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d  _OpenWrite, 0, M
5850: 41 53 54 45 52 5f 52 4f 4f 54 2c 20 69 44 62 2c  ASTER_ROOT, iDb,
5860: 20 35 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 54   5);.  if( p->nT
5870: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ab==0 ){.    p->
5880: 6e 54 61 62 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  nTab = 1;.  }.}.
5890: 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
58a0: 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73 20 74 6f   zName points to
58b0: 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
58c0: 64 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  d buffer contain
58d0: 69 6e 67 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20  ing the name.** 
58e0: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28 22  of a database ("
58f0: 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 6f 72  main", "temp" or
5900: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20   the name of an 
5910: 61 74 74 61 63 68 65 64 20 64 62 29 2e 20 54 68  attached db). Th
5920: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  is.** function r
5930: 65 74 75 72 6e 73 20 74 68 65 20 69 6e 64 65 78  eturns the index
5940: 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61   of the named da
5950: 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44  tabase in db->aD
5960: 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d 31 20 69 66  b[], or.** -1 if
5970: 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 63 61   the named db ca
5980: 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
5990: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e  /.int sqlite3Fin
59a0: 64 44 62 4e 61 6d 65 28 73 71 6c 69 74 65 33 20  dDbName(sqlite3 
59b0: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
59c0: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
59d0: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f   = -1;         /
59e0: 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65  * Database numbe
59f0: 72 20 2a 2f 0a 20 20 69 66 28 20 7a 4e 61 6d 65  r */.  if( zName
5a00: 20 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 3b   ){.    Db *pDb;
5a10: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c  .    int n = sql
5a20: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
5a30: 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28  me);.    for(i=(
5a40: 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d  db->nDb-1), pDb=
5a50: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d  &db->aDb[i]; i>=
5a60: 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a  0; i--, pDb--){.
5a70: 20 20 20 20 20 20 69 66 28 20 28 21 4f 4d 49 54        if( (!OMIT
5a80: 5f 54 45 4d 50 44 42 20 7c 7c 20 69 21 3d 31 20  _TEMPDB || i!=1 
5a90: 29 20 26 26 20 6e 3d 3d 73 71 6c 69 74 65 33 53  ) && n==sqlite3S
5aa0: 74 72 6c 65 6e 33 30 28 70 44 62 2d 3e 7a 4e 61  trlen30(pDb->zNa
5ab0: 6d 65 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  me) && .        
5ac0: 20 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49    0==sqlite3StrI
5ad0: 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20  Cmp(pDb->zName, 
5ae0: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
5af0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
5b00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5b10: 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn i;.}../*.** 
5b20: 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65  The token *pName
5b30: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61   contains the na
5b40: 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  me of a database
5b50: 20 28 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20   (either "main" 
5b60: 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20  or.** "temp" or 
5b70: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61  the name of an a
5b80: 74 74 61 63 68 65 64 20 64 62 29 2e 20 54 68 69  ttached db). Thi
5b90: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
5ba0: 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f  s the.** index o
5bb0: 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61  f the named data
5bc0: 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b  base in db->aDb[
5bd0: 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20  ], or -1 if the 
5be0: 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65  named db .** doe
5bf0: 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a  s not exist..*/.
5c00: 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44  int sqlite3FindD
5c10: 62 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  b(sqlite3 *db, T
5c20: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
5c30: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
5c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c50: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
5c60: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61   number */.  cha
5c70: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c90: 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72 65    /* Name we are
5ca0: 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 2a   searching for *
5cb0: 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  /.  zName = sqli
5cc0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
5cd0: 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  (db, pName);.  i
5ce0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
5cf0: 4e 61 6d 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Name(db, zName);
5d00: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
5d10: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72  (db, zName);.  r
5d20: 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54  eturn i;.}../* T
5d30: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
5d40: 20 6f 72 20 74 72 69 67 67 65 72 20 6e 61 6d 65   or trigger name
5d50: 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68   is passed to th
5d60: 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74  is routine via t
5d70: 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20  okens.** pName1 
5d80: 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74  and pName2. If t
5d90: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61  he table name wa
5da0: 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  s fully qualifie
5db0: 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  d, for example:.
5dc0: 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42  **.** CREATE TAB
5dd0: 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29  LE xxx.yyy (...)
5de0: 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e  ;.** .** Then pN
5df0: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
5e00: 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  xxx" and pName2 
5e10: 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74  "yyy". On the ot
5e20: 68 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74  her hand if.** t
5e30: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73  he table name is
5e40: 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69   not fully quali
5e50: 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a  fied, i.e.:.**.*
5e60: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 79  * CREATE TABLE y
5e70: 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54  yy(...);.**.** T
5e80: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
5e90: 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70  t to "yyy" and p
5ea0: 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a  Name2 is ""..**.
5eb0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5ec0: 73 65 74 73 20 74 68 65 20 2a 70 70 55 6e 71 75  sets the *ppUnqu
5ed0: 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f  al pointer to po
5ee0: 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e  int at the token
5ef0: 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70   (pName1 or.** p
5f00: 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72  Name2) that stor
5f10: 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  es the unqualifi
5f20: 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20  ed table name.  
5f30: 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  The index of the
5f40: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 22 78 78  .** database "xx
5f50: 78 22 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  x" is returned..
5f60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 77  */.int sqlite3Tw
5f70: 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20 50 61 72  oPartName(.  Par
5f80: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
5f90: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
5fa0: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
5fb0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
5fc0: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
5fd0: 20 2f 2a 20 54 68 65 20 22 78 78 78 22 20 69 6e   /* The "xxx" in
5fe0: 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79   the name "xxx.y
5ff0: 79 79 22 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a  yy" or "xxx" */.
6000: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
6010: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 79 79        /* The "yy
6020: 79 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22  y" in the name "
6030: 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f  xxx.yyy" */.  To
6040: 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20  ken **pUnqual   
6050: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 75    /* Write the u
6060: 6e 71 75 61 6c 69 66 69 65 64 20 6f 62 6a 65 63  nqualified objec
6070: 74 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29  t name here */.)
6080: 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  {.  int iDb;    
6090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60a0: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
60b0: 69 6e 67 20 74 68 65 20 6f 62 6a 65 63 74 20 2a  ing the object *
60c0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
60d0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
60e0: 20 69 66 28 20 41 4c 57 41 59 53 28 70 4e 61 6d   if( ALWAYS(pNam
60f0: 65 32 21 3d 30 29 20 26 26 20 70 4e 61 6d 65 32  e2!=0) && pName2
6100: 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  ->n>0 ){.    if(
6110: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
6120: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
6130: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
6140: 20 22 63 6f 72 72 75 70 74 20 64 61 74 61 62 61   "corrupt databa
6150: 73 65 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  se");.      retu
6160: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
6170: 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d   *pUnqual = pNam
6180: 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  e2;.    iDb = sq
6190: 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20  lite3FindDb(db, 
61a0: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28  pName1);.    if(
61b0: 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20   iDb<0 ){.      
61c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
61d0: 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
61e0: 20 64 61 74 61 62 61 73 65 20 25 54 22 2c 20 70   database %T", p
61f0: 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 72 65  Name1);.      re
6200: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
6210: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
6220: 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  rt( db->init.iDb
6230: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e  ==0 || db->init.
6240: 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44 62 20  busy );.    iDb 
6250: 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a  = db->init.iDb;.
6260: 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70      *pUnqual = p
6270: 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74  Name1;.  }.  ret
6280: 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn iDb;.}../*.*
6290: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
62a0: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
62b0: 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72  if the UTF-8 str
62c0: 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c  ing zName is a l
62d0: 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66  egal.** unqualif
62e0: 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e  ied name for a n
62f0: 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  ew schema object
6300: 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20   (table, index, 
6310: 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67  view or.** trigg
6320: 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61  er). All names a
6330: 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20  re legal except 
6340: 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e  those that begin
6350: 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67   with the string
6360: 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69  .** "sqlite_" (i
6370: 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f  n upper, lower o
6380: 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54  r mixed case). T
6390: 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  his portion of t
63a0: 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20  he namespace.** 
63b0: 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  is reserved for 
63c0: 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f  internal use..*/
63d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
63e0: 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73  kObjectName(Pars
63f0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
6400: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
6410: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62   if( !pParse->db
6420: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70  ->init.busy && p
6430: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30  Parse->nested==0
6440: 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28   .          && (
6450: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
6460: 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65  s & SQLITE_Write
6470: 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20  Schema)==0.     
6480: 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
6490: 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65  e3StrNICmp(zName
64a0: 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 20  , "sqlite_", 7) 
64b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
64c0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
64d0: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73 65  object name rese
64e0: 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61  rved for interna
64f0: 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d  l use: %s", zNam
6500: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
6510: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
6520: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6530: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
6540: 74 75 72 6e 20 74 68 65 20 50 52 49 4d 41 52 59  turn the PRIMARY
6550: 20 4b 45 59 20 69 6e 64 65 78 20 6f 66 20 61 20   KEY index of a 
6560: 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65 78 20 2a  table.*/.Index *
6570: 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
6580: 79 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54  yIndex(Table *pT
6590: 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b  ab){.  Index *p;
65a0: 0a 20 20 66 6f 72 28 70 3d 70 54 61 62 2d 3e 70  .  for(p=pTab->p
65b0: 49 6e 64 65 78 3b 20 70 20 26 26 20 21 49 73 50  Index; p && !IsP
65c0: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
65d0: 29 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d  ); p=p->pNext){}
65e0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
65f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
6600: 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   column of index
6610: 20 70 49 64 78 20 74 68 61 74 20 63 6f 72 72 65   pIdx that corre
6620: 73 70 6f 6e 64 73 20 74 6f 20 74 61 62 6c 65 0a  sponds to table.
6630: 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20  ** column iCol. 
6640: 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 6e 6f   Return -1 if no
6650: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20  t found..*/.i16 
6660: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49  sqlite3ColumnOfI
6670: 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64 78  ndex(Index *pIdx
6680: 2c 20 69 31 36 20 69 43 6f 6c 29 7b 0a 20 20 69  , i16 iCol){.  i
6690: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
66a0: 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   i<pIdx->nColumn
66b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
66c0: 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  iCol==pIdx->aiCo
66d0: 6c 75 6d 6e 5b 69 5d 20 29 20 72 65 74 75 72 6e  lumn[i] ) return
66e0: 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
66f0: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65   -1;.}../*.** Be
6700: 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67  gin constructing
6710: 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70   a new table rep
6720: 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d  resentation in m
6730: 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a  emory.  This is.
6740: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20  ** the first of 
6750: 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72  several action r
6760: 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74  outines that get
6770: 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f   called in respo
6780: 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41  nse.** to a CREA
6790: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
67a0: 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c  nt.  In particul
67b0: 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ar, this routine
67c0: 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66   is called.** af
67d0: 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e  ter seeing token
67e0: 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22  s "CREATE" and "
67f0: 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74  TABLE" and the t
6800: 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 69  able name. The i
6810: 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73  sTemp.** flag is
6820: 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62   true if the tab
6830: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f  le should be sto
6840: 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c  red in the auxil
6850: 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a  iary database.**
6860: 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
6870: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
6880: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
6890: 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68  s is normally th
68a0: 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74  e case.** when t
68b0: 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45  he "TEMP" or "TE
68c0: 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64  MPORARY" keyword
68d0: 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65   occurs in betwe
68e0: 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64  en.** CREATE and
68f0: 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68   TABLE..**.** Th
6900: 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f  e new table reco
6910: 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  rd is initialize
6920: 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61  d and put in pPa
6930: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a  rse->pNewTable..
6940: 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68  ** As more of th
6950: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
6960: 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
6970: 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61  ed, additional a
6980: 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65  ction.** routine
6990: 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  s will be called
69a0: 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66   to add more inf
69b0: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73  ormation to this
69c0: 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74   record..** At t
69d0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52  he end of the CR
69e0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
69f0: 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65  ment, the sqlite
6a00: 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74  3EndTable() rout
6a10: 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
6a20: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65   to complete the
6a30: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66   construction of
6a40: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   the new table r
6a50: 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ecord..*/.void s
6a60: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
6a70: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
6a80: 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63  e,   /* Parser c
6a90: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
6aa0: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20  n *pName1,   /* 
6ab0: 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68  First part of th
6ac0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
6ad0: 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ble or view */. 
6ae0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
6af0: 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74    /* Second part
6b00: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   of the name of 
6b10: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
6b20: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  w */.  int isTem
6b30: 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  p,      /* True 
6b40: 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  if this is a TEM
6b50: 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  P table */.  int
6b60: 20 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f 2a   isView,      /*
6b70: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
6b80: 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74   a VIEW */.  int
6b90: 20 69 73 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a   isVirtual,   /*
6ba0: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
6bb0: 20 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c 65   a VIRTUAL table
6bc0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20   */.  int noErr 
6bd0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
6be0: 68 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61 6c  hing if table al
6bf0: 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
6c00: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
6c10: 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  le;.  char *zNam
6c20: 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61  e = 0; /* The na
6c30: 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  me of the new ta
6c40: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
6c50: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
6c60: 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
6c70: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
6c80: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
6c90: 62 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68  ber to create th
6ca0: 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20  e table in */.  
6cb0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20  Token *pName;   
6cc0: 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20   /* Unqualified 
6cd0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
6ce0: 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a  e to create */..
6cf0: 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f    /* The table o
6d00: 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f 20 63  r view name to c
6d10: 72 65 61 74 65 20 69 73 20 70 61 73 73 65 64 20  reate is passed 
6d20: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
6d30: 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20  via tokens.  ** 
6d40: 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65  pName1 and pName
6d50: 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  2. If the table 
6d60: 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71  name was fully q
6d70: 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78  ualified, for ex
6d80: 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
6d90: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
6da0: 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a  x.yyy (...);.  *
6db0: 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61  * .  ** Then pNa
6dc0: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78  me1 is set to "x
6dd0: 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22  xx" and pName2 "
6de0: 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68  yyy". On the oth
6df0: 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20  er hand if.  ** 
6e00: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69  the table name i
6e10: 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c  s not fully qual
6e20: 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a  ified, i.e.:.  *
6e30: 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41  *.  ** CREATE TA
6e40: 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20  BLE yyy(...);.  
6e50: 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61  **.  ** Then pNa
6e60: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79  me1 is set to "y
6e70: 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69  yy" and pName2 i
6e80: 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  s ""..  **.  ** 
6e90: 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73  The call below s
6ea0: 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20 70 6f  ets the pName po
6eb0: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  inter to point a
6ec0: 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61  t the token (pNa
6ed0: 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d  me1 or.  ** pNam
6ee0: 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20  e2) that stores 
6ef0: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
6f00: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20  table name. The 
6f10: 76 61 72 69 61 62 6c 65 20 69 44 62 20 69 73 0a  variable iDb is.
6f20: 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20    ** set to the 
6f30: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74  index of the dat
6f40: 61 62 61 73 65 20 74 68 61 74 20 74 68 65 20 74  abase that the t
6f50: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20  able or view is 
6f60: 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74  to be.  ** creat
6f70: 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44  ed in..  */.  iD
6f80: 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
6f90: 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
6fa0: 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
6fb0: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44  pName);.  if( iD
6fc0: 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
6fd0: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
6fe0: 20 26 26 20 69 73 54 65 6d 70 20 26 26 20 70 4e   && isTemp && pN
6ff0: 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62  ame2->n>0 && iDb
7000: 21 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  !=1 ){.    /* If
7010: 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70   creating a temp
7020: 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65   table, the name
7030: 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c   may not be qual
7040: 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 20 0a 20  ified. Unless . 
7050: 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
7060: 73 65 20 6e 61 6d 65 20 69 73 20 22 74 65 6d 70  se name is "temp
7070: 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f 0a 20 20  " anyway.  */.  
7080: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7090: 67 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f  g(pParse, "tempo
70a0: 72 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20  rary table name 
70b0: 6d 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66  must be unqualif
70c0: 69 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ied");.    retur
70d0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 4f 4d  n;.  }.  if( !OM
70e0: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54  IT_TEMPDB && isT
70f0: 65 6d 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a  emp ) iDb = 1;..
7100: 20 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54    pParse->sNameT
7110: 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20  oken = *pName;. 
7120: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
7130: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
7140: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
7150: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
7160: 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  n;.  if( SQLITE_
7170: 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
7180: 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
7190: 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
71a0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
71b0: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69  e_error;.  }.  i
71c0: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d  f( db->init.iDb=
71d0: 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b  =1 ) isTemp = 1;
71e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
71f0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
7200: 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 28 69 73  ON.  assert( (is
7210: 54 65 6d 70 20 26 20 31 29 3d 3d 69 73 54 65 6d  Temp & 1)==isTem
7220: 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74  p );.  {.    int
7230: 20 63 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20   code;.    char 
7240: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
7250: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  Db].zName;.    i
7260: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
7270: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
7280: 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
7290: 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c  A_TABLE(isTemp),
72a0: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
72b0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
72c0: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
72d0: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29      if( isView )
72e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
72f0: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
7300: 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  mp ){.        co
7310: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
7320: 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  TE_TEMP_VIEW;.  
7330: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7340: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
7350: 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20  _CREATE_VIEW;.  
7360: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
7370: 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
7380: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
7390: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  p ){.        cod
73a0: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
73b0: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20  E_TEMP_TABLE;.  
73c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
73d0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
73e0: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20  _CREATE_TABLE;. 
73f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
7400: 20 69 66 28 20 21 69 73 56 69 72 74 75 61 6c 20   if( !isVirtual 
7410: 26 26 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  && sqlite3AuthCh
7420: 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
7430: 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  , zName, 0, zDb)
7440: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
7450: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
7460: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
7470: 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  if..  /* Make su
7480: 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  re the new table
7490: 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63   name does not c
74a0: 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65  ollide with an e
74b0: 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64  xisting.  ** ind
74c0: 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65  ex or table name
74d0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
74e0: 61 62 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e  abase.  Issue an
74f0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
7500: 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 20  f.  ** it does. 
7510: 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73  The exception is
7520: 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
7530: 74 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 77  t being parsed w
7540: 61 73 20 70 61 73 73 65 64 0a 20 20 2a 2a 20 74  as passed.  ** t
7550: 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 64 65 63  o an sqlite3_dec
7560: 6c 61 72 65 5f 76 74 61 62 28 29 20 63 61 6c 6c  lare_vtab() call
7570: 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 20 6f  . In that case o
7580: 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  nly the column n
7590: 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20 74 79  ames.  ** and ty
75a0: 70 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64  pes will be used
75b0: 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f  , so there is no
75c0: 20 6e 65 65 64 20 74 6f 20 74 65 73 74 20 66 6f   need to test fo
75d0: 72 20 6e 61 6d 65 73 70 61 63 65 0a 20 20 2a 2a  r namespace.  **
75e0: 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a   collisions..  *
75f0: 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44 45 43 4c  /.  if( !IN_DECL
7600: 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20  ARE_VTAB ){.    
7610: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
7620: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
7630: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
7640: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
7650: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
7660: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
7670: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
7680: 20 20 7d 0a 20 20 20 20 70 54 61 62 6c 65 20 3d    }.    pTable =
7690: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
76a0: 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  e(db, zName, zDb
76b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c  );.    if( pTabl
76c0: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  e ){.      if( !
76d0: 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20  noErr ){.       
76e0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
76f0: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
7700: 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %T already exist
7710: 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  s", pName);.    
7720: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7730: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e   assert( !db->in
7740: 69 74 2e 62 75 73 79 20 7c 7c 20 43 4f 52 52 55  it.busy || CORRU
7750: 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 20  PT_DB );.       
7760: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
7770: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
7780: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20   iDb);.      }. 
7790: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
77a0: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
77b0: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
77c0: 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
77d0: 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29  zName, zDb)!=0 )
77e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
77f0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7800: 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
7810: 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64  y an index named
7820: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
7830: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
7840: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
7850: 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20  }.  }..  pTable 
7860: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
7870: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
7880: 28 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20  (Table));.  if( 
7890: 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  pTable==0 ){.   
78a0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
78b0: 64 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 72 73  d = 1;.    pPars
78c0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  e->rc = SQLITE_N
78d0: 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72 73 65  OMEM;.    pParse
78e0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
78f0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7900: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rror;.  }.  pTab
7910: 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  le->zName = zNam
7920: 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b  e;.  pTable->iPK
7930: 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c  ey = -1;.  pTabl
7940: 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  e->pSchema = db-
7950: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
7960: 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65  a;.  pTable->nRe
7970: 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 6c 65 2d  f = 1;.  pTable-
7980: 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30  >nRowLogEst = 20
7990: 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d  0; assert( 200==
79a0: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
79b0: 34 38 35 37 36 29 20 29 3b 0a 20 20 61 73 73 65  48576) );.  asse
79c0: 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  rt( pParse->pNew
79d0: 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70 50  Table==0 );.  pP
79e0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
79f0: 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20  = pTable;..  /* 
7a00: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d  If this is the m
7a10: 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75  agic sqlite_sequ
7a20: 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64 20  ence table used 
7a30: 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  by autoincrement
7a40: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f  ,.  ** then reco
7a50: 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rd a pointer to 
7a60: 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68  this table in th
7a70: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
7a80: 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73  structure.  ** s
7a90: 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20 63 61  o that INSERT ca
7aa0: 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65  n find the table
7ab0: 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69   easily..  */.#i
7ac0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7ad0: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
7ae0: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e    if( !pParse->n
7af0: 65 73 74 65 64 20 26 26 20 73 74 72 63 6d 70 28  ested && strcmp(
7b00: 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73  zName, "sqlite_s
7b10: 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a  equence")==0 ){.
7b20: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
7b30: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
7b40: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
7b50: 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53  ;.    pTable->pS
7b60: 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d  chema->pSeqTab =
7b70: 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e   pTable;.  }.#en
7b80: 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  dif..  /* Begin 
7b90: 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63  generating the c
7ba0: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ode that will in
7bb0: 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72  sert the table r
7bc0: 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20  ecord into.  ** 
7bd0: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
7be0: 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69  R table.  Note i
7bf0: 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61  n particular tha
7c00: 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65  t we must go ahe
7c10: 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f  ad.  ** and allo
7c20: 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20  cate the record 
7c30: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
7c40: 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20  able entry now. 
7c50: 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a   Before any.  **
7c60: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
7c70: 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20  UNIQUE keywords 
7c80: 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f  are parsed.  Tho
7c90: 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c  se keywords will
7ca0: 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69   cause.  ** indi
7cb0: 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65  ces to be create
7cc0: 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  d and the table 
7cd0: 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65  record must come
7ce0: 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a   before the .  *
7cf0: 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63  * indices.  Henc
7d00: 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  e, the record nu
7d10: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
7d20: 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63  le must be alloc
7d30: 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20  ated.  ** now.. 
7d40: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
7d50: 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d  nit.busy && (v =
7d60: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
7d70: 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20  pParse))!=0 ){. 
7d80: 20 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20     int addr1;.  
7d90: 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74    int fileFormat
7da0: 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20  ;.    int reg1, 
7db0: 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20  reg2, reg3;.    
7dc0: 2f 2a 20 6e 75 6c 6c 52 6f 77 5b 5d 20 69 73 20  /* nullRow[] is 
7dd0: 61 6e 20 4f 50 5f 52 65 63 6f 72 64 20 65 6e 63  an OP_Record enc
7de0: 6f 64 69 6e 67 20 6f 66 20 61 20 72 6f 77 20 63  oding of a row c
7df0: 6f 6e 74 61 69 6e 69 6e 67 20 35 20 4e 55 4c 4c  ontaining 5 NULL
7e00: 73 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20  s */.    static 
7e10: 63 6f 6e 73 74 20 63 68 61 72 20 6e 75 6c 6c 52  const char nullR
7e20: 6f 77 5b 5d 20 3d 20 7b 20 36 2c 20 30 2c 20 30  ow[] = { 6, 0, 0
7e30: 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20  , 0, 0, 0 };.   
7e40: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
7e50: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
7e60: 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69  se, 1, iDb);..#i
7e70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7e80: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
7e90: 20 20 20 69 66 28 20 69 73 56 69 72 74 75 61 6c     if( isVirtual
7ea0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7eb0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
7ec0: 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d  P_VBegin);.    }
7ed0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
7ee0: 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d  If the file form
7ef0: 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20  at and encoding 
7f00: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7f10: 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65  have not been se
7f20: 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74  t, .    ** set t
7f30: 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a  hem now..    */.
7f40: 20 20 20 20 72 65 67 31 20 3d 20 70 50 61 72 73      reg1 = pPars
7f50: 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b  e->regRowid = ++
7f60: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
7f70: 20 20 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d    reg2 = pParse-
7f80: 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61  >regRoot = ++pPa
7f90: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
7fa0: 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  eg3 = ++pParse->
7fb0: 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
7fc0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
7fd0: 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44  P_ReadCookie, iD
7fe0: 62 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46  b, reg3, BTREE_F
7ff0: 49 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20  ILE_FORMAT);.   
8000: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
8010: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
8020: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
8030: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
8040: 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b 20 56 64  OP_If, reg3); Vd
8050: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
8060: 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20     fileFormat = 
8070: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
8080: 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d  ITE_LegacyFileFm
8090: 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20  t)!=0 ?.        
80a0: 20 20 20 20 20 20 20 20 20 20 31 20 3a 20 53 51            1 : SQ
80b0: 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f  LITE_MAX_FILE_FO
80c0: 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65  RMAT;.    sqlite
80d0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
80e0: 50 5f 49 6e 74 65 67 65 72 2c 20 66 69 6c 65 46  P_Integer, fileF
80f0: 6f 72 6d 61 74 2c 20 72 65 67 33 29 3b 0a 20 20  ormat, reg3);.  
8100: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8110: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  Op3(v, OP_SetCoo
8120: 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f  kie, iDb, BTREE_
8130: 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 72 65 67  FILE_FORMAT, reg
8140: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
8150: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8160: 49 6e 74 65 67 65 72 2c 20 45 4e 43 28 64 62 29  Integer, ENC(db)
8170: 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c  , reg3);.    sql
8180: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8190: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
81a0: 69 44 62 2c 20 42 54 52 45 45 5f 54 45 58 54 5f  iDb, BTREE_TEXT_
81b0: 45 4e 43 4f 44 49 4e 47 2c 20 72 65 67 33 29 3b  ENCODING, reg3);
81c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
81d0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
81e0: 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  1);..    /* This
81f0: 20 6a 75 73 74 20 63 72 65 61 74 65 73 20 61 20   just creates a 
8200: 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72 65 63  place-holder rec
8210: 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74  ord in the sqlit
8220: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a  e_master table..
8230: 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 72      ** The recor
8240: 64 20 63 72 65 61 74 65 64 20 64 6f 65 73 20 6e  d created does n
8250: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68  ot contain anyth
8260: 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77 69 6c  ing yet.  It wil
8270: 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a 20 20  l be replaced.  
8280: 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65 61 6c    ** by the real
8290: 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65 20 67   entry in code g
82a0: 65 6e 65 72 61 74 65 64 20 61 74 20 73 71 6c 69  enerated at sqli
82b0: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20  te3EndTable().. 
82c0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
82d0: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 6e   rowid for the n
82e0: 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65 66 74  ew entry is left
82f0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50 61   in register pPa
8300: 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 2e 0a 20  rse->regRowid.. 
8310: 20 20 20 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70     ** The root p
8320: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
8330: 65 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 6c  e new table is l
8340: 65 66 74 20 69 6e 20 72 65 67 20 70 50 61 72 73  eft in reg pPars
8350: 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20  e->regRoot..    
8360: 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 61 6e 64  ** The rowid and
8370: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
8380: 72 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65 65  r values are nee
8390: 64 65 64 20 62 79 20 74 68 65 20 63 6f 64 65 20  ded by the code 
83a0: 74 68 61 74 0a 20 20 20 20 2a 2a 20 73 71 6c 69  that.    ** sqli
83b0: 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c  te3EndTable will
83c0: 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a   generate..    *
83d0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
83e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
83f0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
8400: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
8410: 54 41 42 4c 45 29 0a 20 20 20 20 69 66 28 20 69  TABLE).    if( i
8420: 73 56 69 65 77 20 7c 7c 20 69 73 56 69 72 74 75  sView || isVirtu
8430: 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  al ){.      sqli
8440: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8450: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
8460: 72 65 67 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65  reg2);.    }else
8470: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
8480: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 64 64 72      pParse->addr
8490: 43 72 54 61 62 20 3d 20 73 71 6c 69 74 65 33 56  CrTab = sqlite3V
84a0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
84b0: 43 72 65 61 74 65 54 61 62 6c 65 2c 20 69 44 62  CreateTable, iDb
84c0: 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 0a 20  , reg2);.    }. 
84d0: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61     sqlite3OpenMa
84e0: 73 74 65 72 54 61 62 6c 65 28 70 50 61 72 73 65  sterTable(pParse
84f0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
8500: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8510: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c   OP_NewRowid, 0,
8520: 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69   reg1);.    sqli
8530: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
8540: 20 4f 50 5f 42 6c 6f 62 2c 20 36 2c 20 72 65 67   OP_Blob, 6, reg
8550: 33 2c 20 30 2c 20 6e 75 6c 6c 52 6f 77 2c 20 50  3, 0, nullRow, P
8560: 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  4_STATIC);.    s
8570: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
8580: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30  (v, OP_Insert, 0
8590: 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b 0a 20  , reg3, reg1);. 
85a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
85b0: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
85c0: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71  _APPEND);.    sq
85d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
85e0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20  v, OP_Close);.  
85f0: 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28  }..  /* Normal (
8600: 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72  non-error) retur
8610: 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a  n. */.  return;.
8620: 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
8630: 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d  r occurs, we jum
8640: 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f  p here */.begin_
8650: 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73  table_error:.  s
8660: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8670: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
8680: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  n;.}../*.** Add 
8690: 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20  a new column to 
86a0: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
86b0: 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
86c0: 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ucted..**.** The
86d0: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
86e0: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20  is routine once 
86f0: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
8700: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69  declaration.** i
8710: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
8720: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c   statement.  sql
8730: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29  ite3StartTable()
8740: 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20   gets called.** 
8750: 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69  first to get thi
8760: 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e  ngs going.  Then
8770: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
8780: 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68   called for each
8790: 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76  .** column..*/.v
87a0: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
87b0: 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lumn(Parse *pPar
87c0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
87d0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
87e0: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
87f0: 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  z;.  Column *pCo
8800: 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  l;.  sqlite3 *db
8810: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
8820: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
8830: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
8840: 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 53 51  ) return;.#if SQ
8850: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a  LITE_MAX_COLUMN.
8860: 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e    if( p->nCol+1>
8870: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
8880: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
8890: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
88a0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
88b0: 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
88c0: 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d   on %s", p->zNam
88d0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
88e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a 20 3d    }.#endif.  z =
88f0: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
8900: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
8910: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
8920: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
8930: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
8940: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
8950: 65 33 5f 73 74 72 69 63 6d 70 28 7a 2c 20 70 2d  e3_stricmp(z, p-
8960: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  >aCol[i].zName)=
8970: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
8980: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8990: 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63  se, "duplicate c
89a0: 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c  olumn name: %s",
89b0: 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   z);.      sqlit
89c0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
89d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
89e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28     }.  }.  if( (
89f0: 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d  p->nCol & 0x7)==
8a00: 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20  0 ){.    Column 
8a10: 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20  *aNew;.    aNew 
8a20: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
8a30: 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70  oc(db,p->aCol,(p
8a40: 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66  ->nCol+8)*sizeof
8a50: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
8a60: 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
8a70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
8a80: 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20  bFree(db, z);.  
8a90: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
8aa0: 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20  }.    p->aCol = 
8ab0: 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c  aNew;.  }.  pCol
8ac0: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e   = &p->aCol[p->n
8ad0: 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  Col];.  memset(p
8ae0: 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  Col, 0, sizeof(p
8af0: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70  ->aCol[0]));.  p
8b00: 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a  Col->zName = z;.
8b10: 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20   .  /* If there 
8b20: 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69  is no type speci
8b30: 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61  fied, columns ha
8b40: 76 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 61  ve the default a
8b50: 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27 42 4c  ffinity.  ** 'BL
8b60: 4f 42 27 2e 20 49 66 20 74 68 65 72 65 20 69 73  OB'. If there is
8b70: 20 61 20 74 79 70 65 20 73 70 65 63 69 66 69 65   a type specifie
8b80: 64 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33 41  d, then sqlite3A
8b90: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20 77  ddColumnType() w
8ba0: 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c  ill.  ** be call
8bb0: 65 64 20 6e 65 78 74 20 74 6f 20 73 65 74 20 70  ed next to set p
8bc0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f  Col->affinity co
8bd0: 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20  rrectly..  */.  
8be0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
8bf0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
8c00: 3b 0a 20 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20  ;.  pCol->szEst 
8c10: 3d 20 31 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b  = 1;.  p->nCol++
8c20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
8c30: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
8c40: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
8c50: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
8c60: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
8c70: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
8c80: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22   statement.  A "
8c90: 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72  NOT NULL" constr
8ca0: 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e  aint has.** been
8cb0: 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d   seen on a colum
8cc0: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
8cd0: 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c   sets the notNul
8ce0: 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65  l flag on.** the
8cf0: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
8d00: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
8d10: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
8d20: 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28  lite3AddNotNull(
8d30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
8d40: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54  nt onError){.  T
8d50: 61 62 6c 65 20 2a 70 3b 0a 20 20 70 20 3d 20 70  able *p;.  p = p
8d60: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
8d70: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
8d80: 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29  NEVER(p->nCol<1)
8d90: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e   ) return;.  p->
8da0: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e  aCol[p->nCol-1].
8db0: 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e  notNull = (u8)on
8dc0: 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Error;.}../*.** 
8dd0: 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Scan the column 
8de0: 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20  type name zType 
8df0: 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61  (length nType) a
8e00: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a  nd return the.**
8e10: 20 61 73 73 6f 63 69 61 74 65 64 20 61 66 66 69   associated affi
8e20: 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a  nity type..**.**
8e30: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
8e40: 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65 70 65  es a case-indepe
8e50: 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f 66 20  ndent search of 
8e60: 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 0a 2a  zType for the .*
8e70: 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20  * substrings in 
8e80: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  the following ta
8e90: 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74  ble. If one of t
8ea0: 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 73  he substrings is
8eb0: 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20 63  .** found, the c
8ec0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 66 66  orresponding aff
8ed0: 69 6e 69 74 79 20 69 73 20 72 65 74 75 72 6e 65  inity is returne
8ee0: 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f 6e 74  d. If zType cont
8ef0: 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61  ains.** more tha
8f00: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62  n one of the sub
8f10: 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69 65 73  strings, entries
8f20: 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f 70 20   toward the top 
8f30: 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  of .** the table
8f40: 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79 2e 20   take priority. 
8f50: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
8f60: 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42 49 4e  zType is 'BLOBIN
8f70: 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  T', .** SQLITE_A
8f80: 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20 72 65  FF_INTEGER is re
8f90: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75  turned..**.** Su
8fa0: 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20 41 66  bstring     | Af
8fb0: 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  finity.** ------
8fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49  ----------.** 'I
8fe0: 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20 53 51  NT'         | SQ
8ff0: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
9000: 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20 20 20  .** 'CHAR'      
9010: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54    | SQLITE_AFF_T
9020: 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20  EXT.** 'CLOB'   
9030: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
9040: 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58 54 27  F_TEXT.** 'TEXT'
9050: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
9060: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c  _AFF_TEXT.** 'BL
9070: 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OB'        | SQL
9080: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 0a 2a 2a 20  ITE_AFF_BLOB.** 
9090: 27 52 45 41 4c 27 20 20 20 20 20 20 20 20 7c 20  'REAL'        | 
90a0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
90b0: 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20 20 20  ** 'FLOA'       
90c0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   | SQLITE_AFF_RE
90d0: 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20 20  AL.** 'DOUB'    
90e0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
90f0: 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  _REAL.**.** If n
9100: 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74  one of the subst
9110: 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61 62 6f  rings in the abo
9120: 76 65 20 74 61 62 6c 65 20 61 72 65 20 66 6f 75  ve table are fou
9130: 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46  nd,.** SQLITE_AF
9140: 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72 65 74  F_NUMERIC is ret
9150: 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73  urned..*/.char s
9160: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
9170: 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  pe(const char *z
9180: 49 6e 2c 20 75 38 20 2a 70 73 7a 45 73 74 29 7b  In, u8 *pszEst){
9190: 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20  .  u32 h = 0;.  
91a0: 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54  char aff = SQLIT
91b0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
91c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68   const char *zCh
91d0: 61 72 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 7a  ar = 0;..  if( z
91e0: 49 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61  In==0 ) return a
91f0: 66 66 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e  ff;.  while( zIn
9200: 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20 28  [0] ){.    h = (
9210: 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55  h<<8) + sqlite3U
9220: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49  pperToLower[(*zI
9230: 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49  n)&0xff];.    zI
9240: 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d  n++;.    if( h==
9250: 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c  (('c'<<24)+('h'<
9260: 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72  <16)+('a'<<8)+'r
9270: 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  ') ){           
9280: 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20    /* CHAR */.   
9290: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
92a0: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 20 20  AFF_TEXT;.      
92b0: 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20 20  zChar = zIn;.   
92c0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
92d0: 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'c'<<24)+('l'<<1
92e0: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29  6)+('o'<<8)+'b')
92f0: 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f   ){       /* CLO
9300: 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  B */.      aff =
9310: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
9320: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9330: 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27  h==(('t'<<24)+('
9340: 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29  e'<<16)+('x'<<8)
9350: 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f  +'t') ){       /
9360: 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20  * TEXT */.      
9370: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
9380: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _TEXT;.    }else
9390: 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32   if( h==(('b'<<2
93a0: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
93b0: 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20  '<<8)+'b')      
93c0: 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20      /* BLOB */. 
93d0: 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d         && (aff==
93e0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
93f0: 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  IC || aff==SQLIT
9400: 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20  E_AFF_REAL) ){. 
9410: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
9420: 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
9430: 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27 28    if( zIn[0]=='(
9440: 27 20 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b  ' ) zChar = zIn;
9450: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9460: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
9470: 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  INT.    }else if
9480: 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b  ( h==(('r'<<24)+
9490: 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c  ('e'<<16)+('a'<<
94a0: 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20 20 20  8)+'l')         
94b0: 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20   /* REAL */.    
94c0: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
94d0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
94e0: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
94f0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20  LITE_AFF_REAL;. 
9500: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
9510: 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('f'<<24)+('l'<
9520: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61  <16)+('o'<<8)+'a
9530: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ')          /* F
9540: 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  LOA */.        &
9550: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
9560: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
9570: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
9580: 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65  AFF_REAL;.    }e
9590: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 64 27  lse if( h==(('d'
95a0: 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b  <<24)+('o'<<16)+
95b0: 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20 20 20  ('u'<<8)+'b')   
95c0: 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a         /* DOUB *
95d0: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66  /.        && aff
95e0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
95f0: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66  ERIC ){.      af
9600: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  f = SQLITE_AFF_R
9610: 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  EAL;.#endif.    
9620: 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30 78 30  }else if( (h&0x0
9630: 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69 27 3c  0FFFFFF)==(('i'<
9640: 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74  <16)+('n'<<8)+'t
9650: 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20  ') ){    /* INT 
9660: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
9670: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
9680: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
9690: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
96a0: 49 66 20 70 73 7a 45 73 74 20 69 73 20 6e 6f 74  If pszEst is not
96b0: 20 4e 55 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20   NULL, store an 
96c0: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
96d0: 66 69 65 6c 64 20 73 69 7a 65 2e 20 20 54 68 65  field size.  The
96e0: 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 20 69  .  ** estimate i
96f0: 73 20 73 63 61 6c 65 64 20 73 6f 20 74 68 61 74  s scaled so that
9700: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20   the size of an 
9710: 69 6e 74 65 67 65 72 20 69 73 20 31 2e 20 20 2a  integer is 1.  *
9720: 2f 0a 20 20 69 66 28 20 70 73 7a 45 73 74 20 29  /.  if( pszEst )
9730: 7b 0a 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20  {.    *pszEst = 
9740: 31 3b 20 20 20 2f 2a 20 64 65 66 61 75 6c 74 20  1;   /* default 
9750: 73 69 7a 65 20 69 73 20 61 70 70 72 6f 78 20 34  size is approx 4
9760: 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 66   bytes */.    if
9770: 28 20 61 66 66 3c 53 51 4c 49 54 45 5f 41 46 46  ( aff<SQLITE_AFF
9780: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
9790: 20 20 69 66 28 20 7a 43 68 61 72 20 29 7b 0a 20    if( zChar ){. 
97a0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 43         while( zC
97b0: 68 61 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  har[0] ){.      
97c0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
97d0: 73 64 69 67 69 74 28 7a 43 68 61 72 5b 30 5d 29  sdigit(zChar[0])
97e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
97f0: 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 20 20 20  int v = 0;.     
9800: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65         sqlite3Ge
9810: 74 49 6e 74 33 32 28 7a 43 68 61 72 2c 20 26 76  tInt32(zChar, &v
9820: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76  );.            v
9830: 20 3d 20 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20   = v/4 + 1;.    
9840: 20 20 20 20 20 20 20 20 69 66 28 20 76 3e 32 35          if( v>25
9850: 35 20 29 20 76 20 3d 20 32 35 35 3b 0a 20 20 20  5 ) v = 255;.   
9860: 20 20 20 20 20 20 20 20 20 2a 70 73 7a 45 73 74           *pszEst
9870: 20 3d 20 76 3b 20 2f 2a 20 42 4c 4f 42 28 6b 29   = v; /* BLOB(k)
9880: 2c 20 56 41 52 43 48 41 52 28 6b 29 2c 20 43 48  , VARCHAR(k), CH
9890: 41 52 28 6b 29 20 2d 3e 20 72 3d 28 6b 2f 34 2b  AR(k) -> r=(k/4+
98a0: 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  1) */.          
98b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
98c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a     }.          z
98d0: 43 68 61 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Char++;.        
98e0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
98f0: 20 20 20 20 20 20 20 2a 70 73 7a 45 73 74 20 3d         *pszEst =
9900: 20 35 3b 20 20 20 2f 2a 20 42 4c 4f 42 2c 20 54   5;   /* BLOB, T
9910: 45 58 54 2c 20 43 4c 4f 42 20 2d 3e 20 72 3d 35  EXT, CLOB -> r=5
9920: 20 20 28 61 70 70 72 6f 78 20 32 30 20 62 79 74    (approx 20 byt
9930: 65 73 29 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  es)*/.      }.  
9940: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
9950: 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   aff;.}../*.** T
9960: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
9970: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
9980: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
9990: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
99a0: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
99b0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
99c0: 20 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65   The pFirst toke
99d0: 6e 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a  n is the first.*
99e0: 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73  * token in the s
99f0: 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e  equence of token
9a00: 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20  s that describe 
9a10: 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a  the type of the.
9a20: 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e  ** column curren
9a30: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
9a40: 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20  uction.   pLast 
9a50: 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65  is the last toke
9a60: 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75  n.** in the sequ
9a70: 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73 20  ence.  Use this 
9a80: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63  information to c
9a90: 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72 69 6e  onstruct a strin
9aa0: 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69  g.** that contai
9ab0: 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20  ns the typename 
9ac0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e  of the column an
9ad0: 64 20 73 74 6f 72 65 20 74 68 61 74 20 73 74 72  d store that str
9ae0: 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e  ing.** in zType.
9af0: 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  .*/ .void sqlite
9b00: 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50  3AddColumnType(P
9b10: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
9b20: 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 54  ken *pType){.  T
9b30: 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d  able *p;.  Colum
9b40: 6e 20 2a 70 43 6f 6c 3b 0a 0a 20 20 70 20 3d 20  n *pCol;..  p = 
9b50: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
9b60: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  e;.  if( p==0 ||
9b70: 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31   NEVER(p->nCol<1
9b80: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43  ) ) return;.  pC
9b90: 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d  ol = &p->aCol[p-
9ba0: 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 61 73 73 65  >nCol-1];.  asse
9bb0: 72 74 28 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d  rt( pCol->zType=
9bc0: 3d 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  =0 || CORRUPT_DB
9bd0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46   );.  sqlite3DbF
9be0: 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
9bf0: 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20  pCol->zType);.  
9c00: 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71  pCol->zType = sq
9c10: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
9c20: 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
9c30: 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61  Type);.  pCol->a
9c40: 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
9c50: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 43  3AffinityType(pC
9c60: 6f 6c 2d 3e 7a 54 79 70 65 2c 20 26 70 43 6f 6c  ol->zType, &pCol
9c70: 2d 3e 73 7a 45 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  ->szEst);.}../*.
9c80: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
9c90: 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  n is the default
9ca0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d   value for the m
9cb0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
9cc0: 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20  ed column.** of 
9cd0: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
9ce0: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
9cf0: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65  uction..**.** De
9d00: 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72  fault value expr
9d10: 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20  essions must be 
9d20: 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65  constant.  Raise
9d30: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66   an exception if
9d40: 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20   this.** is not 
9d50: 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  the case..**.** 
9d60: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
9d70: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
9d80: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
9d90: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
9da0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
9db0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
9dc0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9dd0: 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28  AddDefaultValue(
9de0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
9df0: 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e 29 7b  xprSpan *pSpan){
9e00: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43  .  Table *p;.  C
9e10: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73  olumn *pCol;.  s
9e20: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
9e30: 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 70  rse->db;.  p = p
9e40: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
9e50: 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a  ;.  if( p!=0 ){.
9e60: 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e      pCol = &(p->
9e70: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29  aCol[p->nCol-1])
9e80: 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  ;.    if( !sqlit
9e90: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
9ea0: 4f 72 46 75 6e 63 74 69 6f 6e 28 70 53 70 61 6e  OrFunction(pSpan
9eb0: 2d 3e 70 45 78 70 72 2c 20 64 62 2d 3e 69 6e 69  ->pExpr, db->ini
9ec0: 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20 20  t.busy) ){.     
9ed0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9ee0: 28 70 50 61 72 73 65 2c 20 22 64 65 66 61 75 6c  (pParse, "defaul
9ef0: 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d  t value of colum
9f00: 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f  n [%s] is not co
9f10: 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20 20 20  nstant",.       
9f20: 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b     pCol->zName);
9f30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9f40: 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70    /* A copy of p
9f50: 45 78 70 72 20 69 73 20 75 73 65 64 20 69 6e 73  Expr is used ins
9f60: 74 65 61 64 20 6f 66 20 74 68 65 20 6f 72 69 67  tead of the orig
9f70: 69 6e 61 6c 2c 20 61 73 20 70 45 78 70 72 20 63  inal, as pExpr c
9f80: 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a  ontains.      **
9f90: 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 70 6f 69   tokens that poi
9fa0: 6e 74 20 74 6f 20 76 6f 6c 61 74 69 6c 65 20 6d  nt to volatile m
9fb0: 65 6d 6f 72 79 2e 20 54 68 65 20 27 73 70 61 6e  emory. The 'span
9fc0: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
9fd0: 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ion.      ** is 
9fe0: 72 65 71 75 69 72 65 64 20 62 79 20 70 72 61 67  required by prag
9ff0: 6d 61 20 74 61 62 6c 65 5f 69 6e 66 6f 2e 0a 20  ma table_info.. 
a000: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
a010: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
a020: 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29  db, pCol->pDflt)
a030: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44  ;.      pCol->pD
a040: 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  flt = sqlite3Exp
a050: 72 44 75 70 28 64 62 2c 20 70 53 70 61 6e 2d 3e  rDup(db, pSpan->
a060: 70 45 78 70 72 2c 20 45 58 50 52 44 55 50 5f 52  pExpr, EXPRDUP_R
a070: 45 44 55 43 45 29 3b 0a 20 20 20 20 20 20 73 71  EDUCE);.      sq
a080: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
a090: 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20  pCol->zDflt);.  
a0a0: 20 20 20 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 20      pCol->zDflt 
a0b0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
a0c0: 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53  up(db, (char*)pS
a0d0: 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20  pan->zStart,.   
a0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a100: 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a    (int)(pSpan->z
a110: 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74  End - pSpan->zSt
a120: 61 72 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  art));.    }.  }
a130: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
a140: 6c 65 74 65 28 64 62 2c 20 70 53 70 61 6e 2d 3e  lete(db, pSpan->
a150: 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExpr);.}../*.**
a160: 20 42 61 63 6b 77 61 72 64 73 20 43 6f 6d 70 61   Backwards Compa
a170: 74 69 62 69 6c 69 74 79 20 48 61 63 6b 3a 0a 2a  tibility Hack:.*
a180: 2a 20 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c  * .** Historical
a190: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
a1a0: 69 74 65 20 61 63 63 65 70 74 65 64 20 73 74 72  ite accepted str
a1b0: 69 6e 67 73 20 61 73 20 63 6f 6c 75 6d 6e 20 6e  ings as column n
a1c0: 61 6d 65 73 20 69 6e 0a 2a 2a 20 69 6e 64 65 78  ames in.** index
a1d0: 65 73 20 61 6e 64 20 50 52 49 4d 41 52 59 20 4b  es and PRIMARY K
a1e0: 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  EY constraints a
a1f0: 6e 64 20 69 6e 20 55 4e 49 51 55 45 20 63 6f 6e  nd in UNIQUE con
a200: 73 74 72 61 69 6e 74 73 2e 20 20 45 78 61 6d 70  straints.  Examp
a210: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52  le:.**.**     CR
a220: 45 41 54 45 20 54 41 42 4c 45 20 78 79 7a 28 61  EATE TABLE xyz(a
a230: 2c 62 2c 63 2c 64 2c 65 2c 50 52 49 4d 41 52 59  ,b,c,d,e,PRIMARY
a240: 20 4b 45 59 28 27 61 27 29 2c 55 4e 49 51 55 45   KEY('a'),UNIQUE
a250: 28 27 62 27 2c 27 63 27 20 43 4f 4c 4c 41 54 45  ('b','c' COLLATE
a260: 20 74 72 69 6d 29 0a 2a 2a 20 20 20 20 20 43 52   trim).**     CR
a270: 45 41 54 45 20 49 4e 44 45 58 20 61 62 63 20 4f  EATE INDEX abc O
a280: 4e 20 78 79 7a 28 27 63 27 2c 27 64 27 20 44 45  N xyz('c','d' DE
a290: 53 43 2c 27 65 27 20 43 4f 4c 4c 41 54 45 20 6e  SC,'e' COLLATE n
a2a0: 6f 63 61 73 65 20 44 45 53 43 29 3b 0a 2a 2a 0a  ocase DESC);.**.
a2b0: 2a 2a 20 54 68 69 73 20 69 73 20 67 6f 6f 66 79  ** This is goofy
a2c0: 2e 20 20 42 75 74 20 74 6f 20 70 72 65 73 65 72  .  But to preser
a2d0: 76 65 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  ve backwards com
a2e0: 70 61 74 69 62 69 6c 69 74 79 20 77 65 20 63 6f  patibility we co
a2f0: 6e 74 69 6e 75 65 20 74 6f 0a 2a 2a 20 61 63 63  ntinue to.** acc
a300: 65 70 74 20 69 74 2e 20 20 54 68 69 73 20 72 6f  ept it.  This ro
a310: 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 6e  utine does the n
a320: 65 63 65 73 73 61 72 79 20 63 6f 6e 76 65 72 73  ecessary convers
a330: 69 6f 6e 2e 20 20 49 74 20 63 6f 6e 76 65 72 74  ion.  It convert
a340: 73 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73  s.** the express
a350: 69 6f 6e 20 67 69 76 65 6e 20 69 6e 20 69 74 73  ion given in its
a360: 20 61 72 67 75 6d 65 6e 74 20 66 72 6f 6d 20 61   argument from a
a370: 20 54 4b 5f 53 54 52 49 4e 47 20 69 6e 74 6f 20   TK_STRING into 
a380: 61 20 54 4b 5f 49 44 0a 2a 2a 20 69 66 20 74 68  a TK_ID.** if th
a390: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
a3a0: 6a 75 73 74 20 61 20 54 4b 5f 53 54 52 49 4e 47  just a TK_STRING
a3b0: 20 77 69 74 68 20 61 6e 20 6f 70 74 69 6f 6e 61   with an optiona
a3c0: 6c 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65  l COLLATE clause
a3d0: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65 70 78 72  ..** If the epxr
a3e0: 65 73 73 69 6f 6e 20 69 73 20 61 6e 79 74 68 69  ession is anythi
a3f0: 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 54 4b  ng other than TK
a400: 5f 53 54 52 49 4e 47 2c 20 74 68 65 20 65 78 70  _STRING, the exp
a410: 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 75 6e  ression is.** un
a420: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74  changed..*/.stat
a430: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
a440: 74 72 69 6e 67 54 6f 49 64 28 45 78 70 72 20 2a  tringToId(Expr *
a450: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d  p){.  if( p->op=
a460: 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20  =TK_STRING ){.  
a470: 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b    p->op = TK_ID;
a480: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
a490: 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26  op==TK_COLLATE &
a4a0: 26 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d  & p->pLeft->op==
a4b0: 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20  TK_STRING ){.   
a4c0: 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 20 3d 20   p->pLeft->op = 
a4d0: 54 4b 5f 49 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TK_ID;.  }.}../*
a4e0: 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68  .** Designate th
a4f0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f  e PRIMARY KEY fo
a500: 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c  r the table.  pL
a510: 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
a520: 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f   names .** of co
a530: 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20  lumns that form 
a540: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
a550: 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55    If pList is NU
a560: 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  LL, then the.** 
a570: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
a580: 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ded column of th
a590: 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70  e table is the p
a5a0: 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a  rimary key..**.*
a5b0: 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61  * A table can ha
a5c0: 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70  ve at most one p
a5d0: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
a5e0: 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
a5f0: 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61  y has.** a prima
a600: 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73  ry key (and this
a610: 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   is the second p
a620: 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e  rimary key) then
a630: 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72   create an.** er
a640: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ror..**.** If th
a650: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
a660: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   on a single col
a670: 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79  umn whose dataty
a680: 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a  pe is INTEGER,.*
a690: 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74  * then we will t
a6a0: 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63  ry to use that c
a6b0: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77  olumn as the row
a6c0: 69 64 2e 20 20 53 65 74 20 74 68 65 20 54 61 62  id.  Set the Tab
a6d0: 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c  le.iPKey.** fiel
a6e0: 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75  d of the table u
a6f0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
a700: 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65  n to be the inde
a710: 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45  x of the.** INTE
a720: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
a730: 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69  column.  Table.i
a740: 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d  PKey is set to -
a750: 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  1 if there is.**
a760: 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d   no INTEGER PRIM
a770: 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49  ARY KEY..**.** I
a780: 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74  f the key is not
a790: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
a7a0: 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72  ARY KEY, then cr
a7b0: 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a  eate a unique.**
a7c0: 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b   index for the k
a7d0: 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73  ey.  No index is
a7e0: 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54   created for INT
a7f0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
a800: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
a810: 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28  e3AddPrimaryKey(
a820: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a830: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
a840: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
a850: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f  rList *pList,  /
a860: 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20  * List of field 
a870: 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65  names to be inde
a880: 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  xed */.  int onE
a890: 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68  rror,      /* Wh
a8a0: 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20  at to do with a 
a8b0: 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c  uniqueness confl
a8c0: 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74  ict */.  int aut
a8d0: 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54 72  oInc,      /* Tr
a8e0: 75 65 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e  ue if the AUTOIN
a8f0: 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20  CREMENT keyword 
a900: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
a910: 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20  int sortOrder   
a920: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41    /* SQLITE_SO_A
a930: 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f  SC or SQLITE_SO_
a940: 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  DESC */.){.  Tab
a950: 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73  le *pTab = pPars
a960: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
a970: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b  char *zType = 0;
a980: 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31  .  int iCol = -1
a990: 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d  , i;.  int nTerm
a9a0: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
a9b0: 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
a9c0: 41 42 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72  AB ) goto primar
a9d0: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66  y_key_exit;.  if
a9e0: 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73  ( pTab->tabFlags
a9f0: 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79   & TF_HasPrimary
aa00: 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Key ){.    sqlit
aa10: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
aa20: 65 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65  e, .      "table
aa30: 20 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65   \"%s\" has more
aa40: 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72   than one primar
aa50: 79 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e  y key", pTab->zN
aa60: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70  ame);.    goto p
aa70: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b  rimary_key_exit;
aa80: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 74 61 62  .  }.  pTab->tab
aa90: 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 50  Flags |= TF_HasP
aaa0: 72 69 6d 61 72 79 4b 65 79 3b 0a 20 20 69 66 28  rimaryKey;.  if(
aab0: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
aac0: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43   iCol = pTab->nC
aad0: 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54 61 62  ol - 1;.    pTab
aae0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 63 6f 6c  ->aCol[iCol].col
aaf0: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
ab00: 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 7a 54  _PRIMKEY;.    zT
ab10: 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ype = pTab->aCol
ab20: 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20  [iCol].zType;.  
ab30: 20 20 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 7d    nTerm = 1;.  }
ab40: 65 6c 73 65 7b 0a 20 20 20 20 6e 54 65 72 6d 20  else{.    nTerm 
ab50: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
ab60: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
ab70: 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Term; i++){.    
ab80: 20 20 45 78 70 72 20 2a 70 43 45 78 70 72 20 3d    Expr *pCExpr =
ab90: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
aba0: 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61  Collate(pList->a
abb0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
abc0: 20 20 61 73 73 65 72 74 28 20 70 43 45 78 70 72    assert( pCExpr
abd0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  !=0 );.      sql
abe0: 69 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28 70  ite3StringToId(p
abf0: 43 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  CExpr);.      if
ac00: 28 20 70 43 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  ( pCExpr->op==TK
ac10: 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 63  _ID ){.        c
ac20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 4e 61 6d  onst char *zCNam
ac30: 65 20 3d 20 70 43 45 78 70 72 2d 3e 75 2e 7a 54  e = pCExpr->u.zT
ac40: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f  oken;.        fo
ac50: 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70  r(iCol=0; iCol<p
ac60: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b  Tab->nCol; iCol+
ac70: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
ac80: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
ac90: 28 7a 43 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61  (zCName, pTab->a
aca0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29  Col[iCol].zName)
acb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
acc0: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43     pTab->aCol[iC
acd0: 6f 6c 5d 2e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20  ol].colFlags |= 
ace0: 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b  COLFLAG_PRIMKEY;
acf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 79  .            zTy
ad00: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
ad10: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20  iCol].zType;.   
ad20: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
ad30: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ad40: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
ad50: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 54    }.  }.  if( nT
ad60: 65 72 6d 3d 3d 31 0a 20 20 20 26 26 20 7a 54 79  erm==1.   && zTy
ad70: 70 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  pe && sqlite3Str
ad80: 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54  ICmp(zType, "INT
ad90: 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 26 26 20  EGER")==0.   && 
ada0: 73 6f 72 74 4f 72 64 65 72 21 3d 53 51 4c 49 54  sortOrder!=SQLIT
adb0: 45 5f 53 4f 5f 44 45 53 43 0a 20 20 29 7b 0a 20  E_SO_DESC.  ){. 
adc0: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
add0: 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d   iCol;.    pTab-
ade0: 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38 29 6f  >keyConf = (u8)o
adf0: 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61 73 73 65  nError;.    asse
ae00: 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20 7c  rt( autoInc==0 |
ae10: 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a  | autoInc==1 );.
ae20: 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
ae30: 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54 46  gs |= autoInc*TF
ae40: 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a  _Autoincrement;.
ae50: 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 20      if( pList ) 
ae60: 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f  pParse->iPkSortO
ae70: 72 64 65 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  rder = pList->a[
ae80: 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  0].sortOrder;.  
ae90: 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e  }else if( autoIn
aea0: 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  c ){.#ifndef SQL
aeb0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
aec0: 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74  REMENT.    sqlit
aed0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
aee0: 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e  e, "AUTOINCREMEN
aef0: 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65  T is only allowe
af00: 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20  d on an ".      
af10: 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52   "INTEGER PRIMAR
af20: 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a  Y KEY");.#endif.
af30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64    }else{.    Ind
af40: 65 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73  ex *p;.    p = s
af50: 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
af60: 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  x(pParse, 0, 0, 
af70: 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f  0, pList, onErro
af80: 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  r, 0,.          
af90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afa0: 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20 30   0, sortOrder, 0
afb0: 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
afc0: 20 20 20 20 20 20 70 2d 3e 69 64 78 54 79 70 65        p->idxType
afd0: 20 3d 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50   = SQLITE_IDXTYP
afe0: 45 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20  E_PRIMARYKEY;.  
aff0: 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20    }.    pList = 
b000: 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f  0;.  }..primary_
b010: 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  key_exit:.  sqli
b020: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
b030: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  e(pParse->db, pL
b040: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ist);.  return;.
b050: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
b060: 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ew CHECK constra
b070: 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65  int to the table
b080: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
b090: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
b0a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
b0b0: 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74  dCheckConstraint
b0c0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
b0d0: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
b0e0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
b0f0: 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20  pr *pCheckExpr  
b100: 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78 70  /* The check exp
b110: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69  ression */.){.#i
b120: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b130: 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65 20  T_CHECK.  Table 
b140: 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  *pTab = pParse->
b150: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 73 71 6c  pNewTable;.  sql
b160: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
b170: 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 54 61  e->db;.  if( pTa
b180: 62 20 26 26 20 21 49 4e 5f 44 45 43 4c 41 52 45  b && !IN_DECLARE
b190: 5f 56 54 41 42 0a 20 20 20 26 26 20 21 73 71 6c  _VTAB.   && !sql
b1a0: 69 74 65 33 42 74 72 65 65 49 73 52 65 61 64 6f  ite3BtreeIsReado
b1b0: 6e 6c 79 28 64 62 2d 3e 61 44 62 5b 64 62 2d 3e  nly(db->aDb[db->
b1c0: 69 6e 69 74 2e 69 44 62 5d 2e 70 42 74 29 0a 20  init.iDb].pBt). 
b1d0: 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 70 43   ){.    pTab->pC
b1e0: 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78  heck = sqlite3Ex
b1f0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
b200: 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63  rse, pTab->pChec
b210: 6b 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a  k, pCheckExpr);.
b220: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
b230: 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e  constraintName.n
b240: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b250: 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
b260: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70  (pParse, pTab->p
b270: 43 68 65 63 6b 2c 20 26 70 50 61 72 73 65 2d 3e  Check, &pParse->
b280: 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2c 20  constraintName, 
b290: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  1);.    }.  }els
b2a0: 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  e.#endif.  {.   
b2b0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
b2c0: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
b2d0: 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 7d 0a  CheckExpr);.  }.
b2e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
b2f0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
b300: 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ion of the most 
b310: 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20  recently parsed 
b320: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  table column.** 
b330: 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20 67  to the CollSeq g
b340: 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  iven..*/.void sq
b350: 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65 54  lite3AddCollateT
b360: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
b370: 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  e, Token *pToken
b380: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
b390: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
b3a0: 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  zColl;          
b3b0: 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65 64 20      /* Dequoted 
b3c0: 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f  name of collatio
b3d0: 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20  n sequence */.  
b3e0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
b3f0: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
b400: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
b410: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
b420: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d  ->nCol-1;.  db =
b430: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a   pParse->db;.  z
b440: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61  Coll = sqlite3Na
b450: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
b460: 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21  pToken);.  if( !
b470: 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a  zColl ) return;.
b480: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c 6f  .  if( sqlite3Lo
b490: 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
b4a0: 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  se, zColl) ){.  
b4b0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
b4c0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
b4d0: 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  (db, p->aCol[i].
b4e0: 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e 61  zColl);.    p->a
b4f0: 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a  Col[i].zColl = z
b500: 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  Coll;.  .    /* 
b510: 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  If the column is
b520: 20 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e   declared as "<n
b530: 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59  ame> PRIMARY KEY
b540: 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22   COLLATE <type>"
b550: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e  ,.    ** then an
b560: 20 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65 20   index may have 
b570: 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e 20  been created on 
b580: 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f  this column befo
b590: 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f  re the.    ** co
b5a0: 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61 73  llation type was
b5b0: 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74 20   added. Correct 
b5c0: 74 68 69 73 20 69 66 20 69 74 20 69 73 20 74 68  this if it is th
b5d0: 65 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  e case..    */. 
b5e0: 20 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70     for(pIdx=p->p
b5f0: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
b600: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
b610: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
b620: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29  dx->nKeyCol==1 )
b630: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
b640: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69  ->aiColumn[0]==i
b650: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78   ){.        pIdx
b660: 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d  ->azColl[0] = p-
b670: 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a  >aCol[i].zColl;.
b680: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b690: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
b6a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f  e3DbFree(db, zCo
b6b0: 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ll);.  }.}../*.*
b6c0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
b6d0: 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c  returns the coll
b6e0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
b6f0: 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61 74 69  or database nati
b700: 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64  ve text.** encod
b710: 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20 62  ing identified b
b720: 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61  y the string zNa
b730: 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65  me, length nName
b740: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
b750: 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69  equested collati
b760: 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e  on sequence is n
b770: 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72  ot available, or
b780: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a   not available.*
b790: 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  * in the databas
b7a0: 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e  e native encodin
b7b0: 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  g, the collation
b7c0: 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f   factory is invo
b7d0: 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73  ked to.** reques
b7e0: 74 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c  t it. If the col
b7f0: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64  lation factory d
b800: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73  oes not supply s
b810: 75 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a  uch a sequence,.
b820: 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75 65  ** and the seque
b830: 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  nce is available
b840: 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74   in another text
b850: 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20   encoding, then 
b860: 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72  that is.** retur
b870: 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  ned instead..**.
b880: 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e  ** If no version
b890: 73 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74  s of the request
b8a0: 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65  ed collations se
b8b0: 71 75 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c  quence are avail
b8c0: 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74  able, or.** anot
b8d0: 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73  her error occurs
b8e0: 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
b8f0: 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ed and an error 
b900: 6d 65 73 73 61 67 65 20 77 72 69 74 74 65 6e 20  message written 
b910: 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a  into.** pParse..
b920: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
b930: 6e 65 20 69 73 20 61 20 77 72 61 70 70 65 72 20  ne is a wrapper 
b940: 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 46 69  around sqlite3Fi
b950: 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68  ndCollSeq().  Th
b960: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e  is routine.** in
b970: 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61 74  vokes the collat
b980: 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 66 20 74  ion factory if t
b990: 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69  he named collati
b9a0: 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  on cannot be fou
b9b0: 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61  nd.** and genera
b9c0: 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  tes an error mes
b9d0: 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  sage..**.** See 
b9e0: 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33 46 69 6e  also: sqlite3Fin
b9f0: 64 43 6f 6c 6c 53 65 71 28 29 2c 20 73 71 6c 69  dCollSeq(), sqli
ba00: 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 29 0a  te3GetCollSeq().
ba10: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
ba20: 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
ba30: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
ba40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
ba50: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
ba60: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
ba70: 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64    u8 enc = ENC(d
ba80: 62 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73  b);.  u8 initbus
ba90: 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  y = db->init.bus
baa0: 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  y;.  CollSeq *pC
bab0: 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20  oll;..  pColl = 
bac0: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
bad0: 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d  eq(db, enc, zNam
bae0: 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20  e, initbusy);.  
baf0: 69 66 28 20 21 69 6e 69 74 62 75 73 79 20 26 26  if( !initbusy &&
bb00: 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f   (!pColl || !pCo
bb10: 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20  ll->xCmp) ){.   
bb20: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
bb30: 47 65 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  GetCollSeq(pPars
bb40: 65 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a  e, enc, pColl, z
bb50: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  Name);.  }..  re
bb60: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a  turn pColl;.}...
bb70: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
bb80: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ode that will in
bb90: 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68 65  crement the sche
bba0: 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a  ma cookie..**.**
bbb0: 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   The schema cook
bbc0: 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ie is used to de
bbd0: 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65  termine when the
bbe0: 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a   schema for the.
bbf0: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e  ** database chan
bc00: 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63 68  ges.  After each
bc10: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20   schema change, 
bc20: 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  the cookie value
bc30: 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68  .** changes.  Wh
bc40: 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69 72  en a process fir
bc50: 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63 68  st reads the sch
bc60: 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20 74  ema it records t
bc70: 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54  he.** cookie.  T
bc80: 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65  hereafter, whene
bc90: 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61  ver it goes to a
bca0: 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
bcb0: 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73  se,.** it checks
bcc0: 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d   the cookie to m
bcd0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 68  ake sure the sch
bce0: 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e  ema has not chan
bcf0: 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20  ged.** since it 
bd00: 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a  was last read..*
bd10: 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69  *.** This plan i
bd20: 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  s not completely
bd30: 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20   bullet-proof.  
bd40: 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  It is possible f
bd50: 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61  or.** the schema
bd60: 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69   to change multi
bd70: 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f  ple times and fo
bd80: 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  r the cookie to 
bd90: 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74  be.** set back t
bda0: 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20  o prior value.  
bdb0: 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67  But schema chang
bdc0: 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e  es are infrequen
bdd0: 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f  t.** and the pro
bde0: 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74  bability of hitt
bdf0: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f  ing the same coo
be00: 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c  kie value is onl
be10: 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e  y.** 1 chance in
be20: 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65   2^32.  So we're
be30: 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f   safe enough..*/
be40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61  .void sqlite3Cha
be50: 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72 73 65 20  ngeCookie(Parse 
be60: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62  *pParse, int iDb
be70: 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71  ){.  int r1 = sq
be80: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
be90: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
bea0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
beb0: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  >db;.  Vdbe *v =
bec0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
bed0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
bee0: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
bef0: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
bf00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bf10: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
bf20: 72 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  r, db->aDb[iDb].
bf30: 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f  pSchema->schema_
bf40: 63 6f 6f 6b 69 65 2b 31 2c 20 72 31 29 3b 0a 20  cookie+1, r1);. 
bf50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bf60: 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  p3(v, OP_SetCook
bf70: 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 53  ie, iDb, BTREE_S
bf80: 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 72  CHEMA_VERSION, r
bf90: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
bfa0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
bfb0: 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  se, r1);.}../*.*
bfc0: 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75  * Measure the nu
bfd0: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
bfe0: 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74  rs needed to out
bff0: 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  put the given.**
c000: 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68   identifier.  Th
c010: 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65  e number returne
c020: 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71  d includes any q
c030: 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75  uotes used.** bu
c040: 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75  t does not inclu
c050: 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d  de the null term
c060: 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  inator..**.** Th
c070: 65 20 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f  e estimate is co
c080: 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49 74 20  nservative.  It 
c090: 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20  might be larger 
c0a0: 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20  that what is.** 
c0b0: 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a  really needed..*
c0c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65  /.static int ide
c0d0: 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63  ntLength(const c
c0e0: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e  har *z){.  int n
c0f0: 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b  ;.  for(n=0; *z;
c100: 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20   n++, z++){.    
c110: 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e  if( *z=='"' ){ n
c120: 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75  ++; }.  }.  retu
c130: 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a  rn n + 2;.}../*.
c140: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72  ** The first par
c150: 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
c160: 74 65 72 20 74 6f 20 61 6e 20 6f 75 74 70 75 74  ter to an output
c170: 20 62 75 66 66 65 72 2e 20 54 68 65 20 73 65 63   buffer. The sec
c180: 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ond .** paramete
c190: 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
c1a0: 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61  o an integer tha
c1b0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6f  t contains the o
c1c0: 66 66 73 65 74 20 61 74 0a 2a 2a 20 77 68 69 63  ffset at.** whic
c1d0: 68 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20  h to write into 
c1e0: 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
c1f0: 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
c200: 20 63 6f 70 69 65 73 20 74 68 65 0a 2a 2a 20 6e   copies the.** n
c210: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
c220: 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f 20  ring pointed to 
c230: 62 79 20 74 68 65 20 74 68 69 72 64 20 70 61 72  by the third par
c240: 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e 65 64 49  ameter, zSignedI
c250: 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68 65 20  dent,.** to the 
c260: 73 70 65 63 69 66 69 65 64 20 6f 66 66 73 65 74  specified offset
c270: 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 61   in the buffer a
c280: 6e 64 20 75 70 64 61 74 65 73 20 2a 70 49 64 78  nd updates *pIdx
c290: 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20 74 6f 20   to refer.** to 
c2a0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 61  the first byte a
c2b0: 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 62 79  fter the last by
c2c0: 74 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72  te written befor
c2d0: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20  e returning..** 
c2e0: 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 72 69 6e  .** If the strin
c2f0: 67 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 20 63  g zSignedIdent c
c300: 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79  onsists entirely
c310: 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d 65 72 69   of alpha-numeri
c320: 63 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 2c  c.** characters,
c330: 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20   does not begin 
c340: 77 69 74 68 20 61 20 64 69 67 69 74 20 61 6e 64  with a digit and
c350: 20 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20 6b   is not an SQL k
c360: 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e 20  eyword,.** then 
c370: 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20  it is copied to 
c380: 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
c390: 72 20 65 78 61 63 74 6c 79 20 61 73 20 69 74 20  r exactly as it 
c3a0: 69 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  is. Otherwise,.*
c3b0: 2a 20 69 74 20 69 73 20 71 75 6f 74 65 64 20 75  * it is quoted u
c3c0: 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71 75 6f 74  sing double-quot
c3d0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
c3e0: 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61 72  id identPut(char
c3f0: 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20   *z, int *pIdx, 
c400: 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64 65  char *zSignedIde
c410: 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  nt){.  unsigned 
c420: 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28  char *zIdent = (
c430: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a  unsigned char*)z
c440: 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69  SignedIdent;.  i
c450: 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f  nt i, j, needQuo
c460: 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b  te;.  i = *pIdx;
c470: 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ..  for(j=0; zId
c480: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
c490: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73    if( !sqlite3Is
c4a0: 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29  alnum(zIdent[j])
c4b0: 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27   && zIdent[j]!='
c4c0: 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  _' ) break;.  }.
c4d0: 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 73 71    needQuote = sq
c4e0: 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 49 64  lite3Isdigit(zId
c4f0: 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20 20  ent[0]).        
c500: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65      || sqlite3Ke
c510: 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74  ywordCode(zIdent
c520: 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a 20 20 20 20  , j)!=TK_ID.    
c530: 20 20 20 20 20 20 20 20 7c 7c 20 7a 49 64 65 6e          || zIden
c540: 74 5b 6a 5d 21 3d 30 0a 20 20 20 20 20 20 20 20  t[j]!=0.        
c550: 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b 0a 0a 20 20      || j==0;..  
c560: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
c570: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
c580: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
c590: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b  j]; j++){.    z[
c5a0: 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d  i++] = zIdent[j]
c5b0: 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74  ;.    if( zIdent
c5c0: 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b  [j]=='"' ) z[i++
c5d0: 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69  ] = '"';.  }.  i
c5e0: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
c5f0: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a  [i++] = '"';.  z
c600: 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78  [i] = 0;.  *pIdx
c610: 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   = i;.}../*.** G
c620: 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45  enerate a CREATE
c630: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
c640: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
c650: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61   the given.** ta
c660: 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20  ble.  Memory to 
c670: 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66  hold the text of
c680: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
c690: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  s obtained.** fr
c6a0: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
c6b0: 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
c6c0: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
c6d0: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
c6e0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65  static char *cre
c6f0: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71 6c  ateTableStmt(sql
c700: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
c710: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c  *p){.  int i, k,
c720: 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d   n;.  char *zStm
c730: 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c  t;.  char *zSep,
c740: 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a   *zSep2, *zEnd;.
c750: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
c760: 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70    n = 0;.  for(p
c770: 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69  Col = p->aCol, i
c780: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
c790: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
c7a0: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
c7b0: 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b  h(pCol->zName) +
c7c0: 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69   5;.  }.  n += i
c7d0: 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e  dentLength(p->zN
c7e0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30  ame);.  if( n<50
c7f0: 20 29 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d 20   ){ .    zSep = 
c800: 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20  "";.    zSep2 = 
c810: 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20  ",";.    zEnd = 
c820: 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ")";.  }else{.  
c830: 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b    zSep = "\n  ";
c840: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c  .    zSep2 = ",\
c850: 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d  n  ";.    zEnd =
c860: 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20   "\n)";.  }.  n 
c870: 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f  += 35 + 6*p->nCo
c880: 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c  l;.  zStmt = sql
c890: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
c8a0: 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53 74  0, n);.  if( zSt
c8b0: 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  mt==0 ){.    db-
c8c0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
c8d0: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  1;.    return 0;
c8e0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
c8f0: 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74  nprintf(n, zStmt
c900: 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  , "CREATE TABLE 
c910: 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65  ");.  k = sqlite
c920: 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29  3Strlen30(zStmt)
c930: 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74  ;.  identPut(zSt
c940: 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65  mt, &k, p->zName
c950: 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20  );.  zStmt[k++] 
c960: 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f  = '(';.  for(pCo
c970: 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20  l=p->aCol, i=0; 
c980: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  i<p->nCol; i++, 
c990: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61  pCol++){.    sta
c9a0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
c9b0: 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20   const azType[] 
c9c0: 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  = {.        /* S
c9d0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 20  QLITE_AFF_BLOB  
c9e0: 20 20 2a 2f 20 22 22 2c 0a 20 20 20 20 20 20 20    */ "",.       
c9f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54   /* SQLITE_AFF_T
ca00: 45 58 54 20 20 20 20 2a 2f 20 22 20 54 45 58 54  EXT    */ " TEXT
ca10: 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51  ",.        /* SQ
ca20: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
ca30: 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20   */ " NUM",.    
ca40: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
ca50: 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20 49  F_INTEGER */ " I
ca60: 4e 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  NT",.        /* 
ca70: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
ca80: 20 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20     */ " REAL".  
ca90: 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e    };.    int len
caa0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
cab0: 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73 71   *zType;..    sq
cac0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
cad0: 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  -k, &zStmt[k], z
cae0: 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73  Sep);.    k += s
caf0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26  qlite3Strlen30(&
cb00: 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a  zStmt[k]);.    z
cb10: 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20  Sep = zSep2;.   
cb20: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
cb30: 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65   &k, pCol->zName
cb40: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
cb50: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51  Col->affinity-SQ
cb60: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 3e 3d  LITE_AFF_BLOB >=
cb70: 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74   0 );.    assert
cb80: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
cb90: 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  -SQLITE_AFF_BLOB
cba0: 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61 7a 54   < ArraySize(azT
cbb0: 79 70 65 29 20 29 3b 0a 20 20 20 20 74 65 73 74  ype) );.    test
cbc0: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
cbd0: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
cbe0: 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 74 65 73  _BLOB );.    tes
cbf0: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
cc00: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
cc10: 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 74 65  F_TEXT );.    te
cc20: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
cc30: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
cc40: 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20  FF_NUMERIC );.  
cc50: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
cc60: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
cc70: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29  TE_AFF_INTEGER )
cc80: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
cc90: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
cca0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
ccb0: 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79 70  );.    .    zTyp
ccc0: 65 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d  e = azType[pCol-
ccd0: 3e 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c 49  >affinity - SQLI
cce0: 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b 0a 20 20  TE_AFF_BLOB];.  
ccf0: 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53    len = sqlite3S
cd00: 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a  trlen30(zType);.
cd10: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
cd20: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
cd30: 54 45 5f 41 46 46 5f 42 4c 4f 42 20 0a 20 20 20  TE_AFF_BLOB .   
cd40: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c           || pCol
cd50: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69  ->affinity==sqli
cd60: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
cd70: 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a 20 20 20  zType, 0) );.   
cd80: 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74 5b 6b   memcpy(&zStmt[k
cd90: 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29 3b 0a  ], zType, len);.
cda0: 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20      k += len;.  
cdb0: 20 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e 20 29    assert( k<=n )
cdc0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
cdd0: 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a  snprintf(n-k, &z
cde0: 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a  Stmt[k], "%s", z
cdf0: 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  End);.  return z
ce00: 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Stmt;.}../*.** R
ce10: 65 73 69 7a 65 20 61 6e 20 49 6e 64 65 78 20 6f  esize an Index o
ce20: 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64 20 4e 20  bject to hold N 
ce30: 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c 2e 20 20  columns total.  
ce40: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
ce50: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 61  .** on success a
ce60: 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  nd SQLITE_NOMEM 
ce70: 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  on an OOM error.
ce80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
ce90: 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74  esizeIndexObject
cea0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e  (sqlite3 *db, In
ceb0: 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 4e  dex *pIdx, int N
cec0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72  ){.  char *zExtr
ced0: 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  a;.  int nByte;.
cee0: 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
cef0: 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75 72 6e 20  umn>=N ) return 
cf00: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
cf10: 65 72 74 28 20 70 49 64 78 2d 3e 69 73 52 65 73  ert( pIdx->isRes
cf20: 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 42 79  ized==0 );.  nBy
cf30: 74 65 20 3d 20 28 73 69 7a 65 6f 66 28 63 68 61  te = (sizeof(cha
cf40: 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28 69 31 36  r*) + sizeof(i16
cf50: 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a 45 78 74  ) + 1)*N;.  zExt
cf60: 72 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ra = sqlite3DbMa
cf70: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
cf80: 74 65 29 3b 0a 20 20 69 66 28 20 7a 45 78 74 72  te);.  if( zExtr
cf90: 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  a==0 ) return SQ
cfa0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
cfb0: 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64  mcpy(zExtra, pId
cfc0: 78 2d 3e 61 7a 43 6f 6c 6c 2c 20 73 69 7a 65 6f  x->azColl, sizeo
cfd0: 66 28 63 68 61 72 2a 29 2a 70 49 64 78 2d 3e 6e  f(char*)*pIdx->n
cfe0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d  Column);.  pIdx-
cff0: 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a  >azColl = (char*
d000: 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74  *)zExtra;.  zExt
d010: 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 63 68 61  ra += sizeof(cha
d020: 72 2a 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28  r*)*N;.  memcpy(
d030: 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 69  zExtra, pIdx->ai
d040: 43 6f 6c 75 6d 6e 2c 20 73 69 7a 65 6f 66 28 69  Column, sizeof(i
d050: 31 36 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  16)*pIdx->nColum
d060: 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f  n);.  pIdx->aiCo
d070: 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 7a 45 78  lumn = (i16*)zEx
d080: 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d  tra;.  zExtra +=
d090: 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 4e 3b 0a   sizeof(i16)*N;.
d0a0: 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c    memcpy(zExtra,
d0b0: 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
d0c0: 72 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  r, pIdx->nColumn
d0d0: 29 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72 74  );.  pIdx->aSort
d0e0: 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 7a 45 78  Order = (u8*)zEx
d0f0: 74 72 61 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f  tra;.  pIdx->nCo
d100: 6c 75 6d 6e 20 3d 20 4e 3b 0a 20 20 70 49 64 78  lumn = N;.  pIdx
d110: 2d 3e 69 73 52 65 73 69 7a 65 64 20 3d 20 31 3b  ->isResized = 1;
d120: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d130: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73  _OK;.}../*.** Es
d140: 74 69 6d 61 74 65 20 74 68 65 20 74 6f 74 61 6c  timate the total
d150: 20 72 6f 77 20 77 69 64 74 68 20 66 6f 72 20 61   row width for a
d160: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
d170: 63 20 76 6f 69 64 20 65 73 74 69 6d 61 74 65 54  c void estimateT
d180: 61 62 6c 65 57 69 64 74 68 28 54 61 62 6c 65 20  ableWidth(Table 
d190: 2a 70 54 61 62 29 7b 0a 20 20 75 6e 73 69 67 6e  *pTab){.  unsign
d1a0: 65 64 20 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20  ed wTable = 0;. 
d1b0: 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70   const Column *p
d1c0: 54 61 62 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b  TabCol;.  int i;
d1d0: 0a 20 20 66 6f 72 28 69 3d 70 54 61 62 2d 3e 6e  .  for(i=pTab->n
d1e0: 43 6f 6c 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61  Col, pTabCol=pTa
d1f0: 62 2d 3e 61 43 6f 6c 3b 20 69 3e 30 3b 20 69 2d  b->aCol; i>0; i-
d200: 2d 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20  -, pTabCol++){. 
d210: 20 20 20 77 54 61 62 6c 65 20 2b 3d 20 70 54 61     wTable += pTa
d220: 62 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 7d  bCol->szEst;.  }
d230: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b  .  if( pTab->iPK
d240: 65 79 3c 30 20 29 20 77 54 61 62 6c 65 2b 2b 3b  ey<0 ) wTable++;
d250: 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  .  pTab->szTabRo
d260: 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
d270: 74 28 77 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a 0a  t(wTable*4);.}..
d280: 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
d290: 68 65 20 61 76 65 72 61 67 65 20 73 69 7a 65 20  he average size 
d2a0: 6f 66 20 61 20 72 6f 77 20 66 6f 72 20 61 6e 20  of a row for an 
d2b0: 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
d2c0: 20 76 6f 69 64 20 65 73 74 69 6d 61 74 65 49 6e   void estimateIn
d2d0: 64 65 78 57 69 64 74 68 28 49 6e 64 65 78 20 2a  dexWidth(Index *
d2e0: 70 49 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pIdx){.  unsigne
d2f0: 64 20 77 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  d wIndex = 0;.  
d300: 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 43  int i;.  const C
d310: 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 49  olumn *aCol = pI
d320: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
d330: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
d340: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Idx->nColumn; i+
d350: 2b 29 7b 0a 20 20 20 20 69 31 36 20 78 20 3d 20  +){.    i16 x = 
d360: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
d370: 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 78  ];.    assert( x
d380: 3c 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e  <pIdx->pTable->n
d390: 43 6f 6c 20 29 3b 0a 20 20 20 20 77 49 6e 64 65  Col );.    wInde
d3a0: 78 20 2b 3d 20 78 3c 30 20 3f 20 31 20 3a 20 61  x += x<0 ? 1 : a
d3b0: 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75  Col[pIdx->aiColu
d3c0: 6d 6e 5b 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20 20  mn[i]].szEst;.  
d3d0: 7d 0a 20 20 70 49 64 78 2d 3e 73 7a 49 64 78 52  }.  pIdx->szIdxR
d3e0: 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
d3f0: 73 74 28 77 49 6e 64 65 78 2a 34 29 3b 0a 7d 0a  st(wIndex*4);.}.
d400: 0a 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  ./* Return true 
d410: 69 66 20 76 61 6c 75 65 20 78 20 69 73 20 66 6f  if value x is fo
d420: 75 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 20 66  und any of the f
d430: 69 72 73 74 20 6e 43 6f 6c 20 65 6e 74 72 69 65  irst nCol entrie
d440: 73 20 6f 66 20 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a  s of aiCol[].*/.
d450: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 43 6f  static int hasCo
d460: 6c 75 6d 6e 28 63 6f 6e 73 74 20 69 31 36 20 2a  lumn(const i16 *
d470: 61 69 43 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c  aiCol, int nCol,
d480: 20 69 6e 74 20 78 29 7b 0a 20 20 77 68 69 6c 65   int x){.  while
d490: 28 20 6e 43 6f 6c 2d 2d 20 3e 20 30 20 29 20 69  ( nCol-- > 0 ) i
d4a0: 66 28 20 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b 29  f( x==*(aiCol++)
d4b0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
d4c0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
d4d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
d4e0: 75 6e 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  uns at the end o
d4f0: 66 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  f parsing a CREA
d500: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
d510: 6e 74 20 74 68 61 74 0a 2a 2a 20 68 61 73 20 61  nt that.** has a
d520: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 63   WITHOUT ROWID c
d530: 6c 61 75 73 65 2e 20 20 54 68 65 20 6a 6f 62 20  lause.  The job 
d540: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
d550: 69 73 20 74 6f 20 63 6f 6e 76 65 72 74 20 62 6f  is to convert bo
d560: 74 68 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 73  th.** internal s
d570: 63 68 65 6d 61 20 64 61 74 61 20 73 74 72 75 63  chema data struc
d580: 74 75 72 65 73 20 61 6e 64 20 74 68 65 20 67 65  tures and the ge
d590: 6e 65 72 61 74 65 64 20 56 44 42 45 20 63 6f 64  nerated VDBE cod
d5a0: 65 20 73 6f 20 74 68 61 74 20 74 68 65 79 0a 2a  e so that they.*
d5b0: 2a 20 61 72 65 20 61 70 70 72 6f 70 72 69 61 74  * are appropriat
d5c0: 65 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20  e for a WITHOUT 
d5d0: 52 4f 57 49 44 20 74 61 62 6c 65 20 69 6e 73 74  ROWID table inst
d5e0: 65 61 64 20 6f 66 20 61 20 72 6f 77 69 64 20 74  ead of a rowid t
d5f0: 61 62 6c 65 2e 0a 2a 2a 20 43 68 61 6e 67 65 73  able..** Changes
d600: 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20   include:.**.** 
d610: 20 20 20 20 28 31 29 20 20 43 6f 6e 76 65 72 74      (1)  Convert
d620: 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65 54 61   the OP_CreateTa
d630: 62 6c 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 43  ble into an OP_C
d640: 72 65 61 74 65 49 6e 64 65 78 2e 20 20 54 68 65  reateIndex.  The
d650: 72 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20  re is.**        
d660: 20 20 6e 6f 20 72 6f 77 69 64 20 62 74 72 65 65    no rowid btree
d670: 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52   for a WITHOUT R
d680: 4f 57 49 44 2e 20 20 49 6e 73 74 65 61 64 2c 20  OWID.  Instead, 
d690: 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a  the canonical.**
d6a0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20 73            data s
d6b0: 74 6f 72 61 67 65 20 69 73 20 61 20 63 6f 76 65  torage is a cove
d6c0: 72 69 6e 67 20 69 6e 64 65 78 20 62 74 72 65 65  ring index btree
d6d0: 2e 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 42 79  ..**     (2)  By
d6e0: 70 61 73 73 20 74 68 65 20 63 72 65 61 74 69 6f  pass the creatio
d6f0: 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  n of the sqlite_
d700: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74  master table ent
d710: 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  ry.**          f
d720: 6f 72 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  or the PRIMARY K
d730: 45 59 20 61 73 20 74 68 65 20 70 72 69 6d 61 72  EY as the primar
d740: 79 20 6b 65 79 20 69 6e 64 65 78 20 69 73 20 6e  y key index is n
d750: 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  ow.**          i
d760: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
d770: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
d780: 61 62 6c 65 20 65 6e 74 72 79 20 6f 66 20 74 68  able entry of th
d790: 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 0a  e table itself..
d7a0: 2a 2a 20 20 20 20 20 28 33 29 20 20 53 65 74 20  **     (3)  Set 
d7b0: 74 68 65 20 49 6e 64 65 78 2e 74 6e 75 6d 20 6f  the Index.tnum o
d7c0: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
d7d0: 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69  Y Index object i
d7e0: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
d7f0: 20 20 73 63 68 65 6d 61 20 74 6f 20 74 68 65 20    schema to the 
d800: 72 6f 6f 74 70 61 67 65 20 66 72 6f 6d 20 74 68  rootpage from th
d810: 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a  e main table..**
d820: 20 20 20 20 20 28 34 29 20 20 53 65 74 20 61 6c       (4)  Set al
d830: 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  l columns of the
d840: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 73 63 68   PRIMARY KEY sch
d850: 65 6d 61 20 6f 62 6a 65 63 74 20 74 6f 20 62 65  ema object to be
d860: 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20   NOT NULL..**   
d870: 20 20 28 35 29 20 20 41 64 64 20 61 6c 6c 20 74    (5)  Add all t
d880: 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  able columns to 
d890: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
d8a0: 49 6e 64 65 78 20 6f 62 6a 65 63 74 0a 2a 2a 20  Index object.** 
d8b0: 20 20 20 20 20 20 20 20 20 73 6f 20 74 68 61 74           so that
d8c0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
d8d0: 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69   is a covering i
d8e0: 6e 64 65 78 2e 20 20 54 68 65 20 73 75 72 70 6c  ndex.  The surpl
d8f0: 75 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 63  us.**          c
d900: 6f 6c 75 6d 6e 73 20 61 72 65 20 70 61 72 74 20  olumns are part 
d910: 6f 66 20 4b 65 79 49 6e 66 6f 2e 6e 58 46 69 65  of KeyInfo.nXFie
d920: 6c 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 75  ld and are not u
d930: 73 65 64 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20  sed for.**      
d940: 20 20 20 20 73 6f 72 74 69 6e 67 20 6f 72 20 6c      sorting or l
d950: 6f 6f 6b 75 70 20 6f 72 20 75 6e 69 71 75 65 6e  ookup or uniquen
d960: 65 73 73 20 63 68 65 63 6b 73 2e 0a 2a 2a 20 20  ess checks..**  
d970: 20 20 20 28 36 29 20 20 52 65 70 6c 61 63 65 20     (6)  Replace 
d980: 74 68 65 20 72 6f 77 69 64 20 74 61 69 6c 20 6f  the rowid tail o
d990: 6e 20 61 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61  n all automatica
d9a0: 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 20 55 4e  lly generated UN
d9b0: 49 51 55 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  IQUE.**         
d9c0: 20 69 6e 64 69 63 65 73 20 77 69 74 68 20 74 68   indices with th
d9d0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  e PRIMARY KEY co
d9e0: 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  lumns..*/.static
d9f0: 20 76 6f 69 64 20 63 6f 6e 76 65 72 74 54 6f 57   void convertToW
da00: 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65  ithoutRowidTable
da10: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
da20: 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
da30: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 49  Index *pIdx;.  I
da40: 6e 64 65 78 20 2a 70 50 6b 3b 0a 20 20 69 6e 74  ndex *pPk;.  int
da50: 20 6e 50 6b 3b 0a 20 20 69 6e 74 20 69 2c 20 6a   nPk;.  int i, j
da60: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
da70: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
da80: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
da90: 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 2f 2a 20 43  ->pVdbe;..  /* C
daa0: 6f 6e 76 65 72 74 20 74 68 65 20 4f 50 5f 43 72  onvert the OP_Cr
dab0: 65 61 74 65 54 61 62 6c 65 20 6f 70 63 6f 64 65  eateTable opcode
dac0: 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 6f 72 6d   that would norm
dad0: 61 6c 6c 79 20 63 72 65 61 74 65 20 74 68 65 0a  ally create the.
dae0: 20 20 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 66    ** root-page f
daf0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74  or the table int
db00: 6f 20 61 6e 20 4f 50 5f 43 72 65 61 74 65 49 6e  o an OP_CreateIn
db10: 64 65 78 20 6f 70 63 6f 64 65 2e 20 20 54 68 65  dex opcode.  The
db20: 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63 72 65 61   index.  ** crea
db30: 74 65 64 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  ted will become 
db40: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
db50: 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66  index..  */.  if
db60: 28 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72  ( pParse->addrCr
db70: 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Tab ){.    asser
db80: 74 28 20 76 20 29 3b 0a 20 20 20 20 73 71 6c 69  t( v );.    sqli
db90: 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63  te3VdbeChangeOpc
dba0: 6f 64 65 28 76 2c 20 70 50 61 72 73 65 2d 3e 61  ode(v, pParse->a
dbb0: 64 64 72 43 72 54 61 62 2c 20 4f 50 5f 43 72 65  ddrCrTab, OP_Cre
dbc0: 61 74 65 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a  ateIndex);.  }..
dbd0: 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
dbe0: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
dbf0: 78 2e 20 20 4f 72 2c 20 69 66 20 74 68 69 73 20  x.  Or, if this 
dc00: 74 61 62 6c 65 20 77 61 73 20 6f 72 69 67 69 6e  table was origin
dc10: 61 6c 6c 79 0a 20 20 2a 2a 20 61 6e 20 49 4e 54  ally.  ** an INT
dc20: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
dc30: 20 74 61 62 6c 65 2c 20 63 72 65 61 74 65 20 61   table, create a
dc40: 20 6e 65 77 20 50 52 49 4d 41 52 59 20 4b 45 59   new PRIMARY KEY
dc50: 20 69 6e 64 65 78 2e 20 0a 20 20 2a 2f 0a 20 20   index. .  */.  
dc60: 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e  if( pTab->iPKey>
dc70: 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  =0 ){.    ExprLi
dc80: 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20 54  st *pList;.    T
dc90: 6f 6b 65 6e 20 69 70 6b 54 6f 6b 65 6e 3b 0a 20  oken ipkToken;. 
dca0: 20 20 20 69 70 6b 54 6f 6b 65 6e 2e 7a 20 3d 20     ipkToken.z = 
dcb0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
dcc0: 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 3b 0a 20  >iPKey].zName;. 
dcd0: 20 20 20 69 70 6b 54 6f 6b 65 6e 2e 6e 20 3d 20     ipkToken.n = 
dce0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
dcf0: 69 70 6b 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20  ipkToken.z);.   
dd00: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
dd10: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
dd20: 50 61 72 73 65 2c 20 30 2c 20 0a 20 20 20 20 20  Parse, 0, .     
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
dd40: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
dd50: 2c 20 54 4b 5f 49 44 2c 20 26 69 70 6b 54 6f 6b  , TK_ID, &ipkTok
dd60: 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 69 66 28  en, 0));.    if(
dd70: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
dd80: 72 6e 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  rn;.    pList->a
dd90: 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
dda0: 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f  pParse->iPkSortO
ddb0: 72 64 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74  rder;.    assert
ddc0: 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ( pParse->pNewTa
ddd0: 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20  ble==pTab );.   
dde0: 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 43 72   pPk = sqlite3Cr
ddf0: 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  eateIndex(pParse
de00: 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74  , 0, 0, 0, pList
de10: 2c 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 2c  , pTab->keyConf,
de20: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
de30: 20 20 69 66 28 20 70 50 6b 3d 3d 30 20 29 20 72    if( pPk==0 ) r
de40: 65 74 75 72 6e 3b 0a 20 20 20 20 70 50 6b 2d 3e  eturn;.    pPk->
de50: 69 64 78 54 79 70 65 20 3d 20 53 51 4c 49 54 45  idxType = SQLITE
de60: 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59  _IDXTYPE_PRIMARY
de70: 4b 45 59 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69  KEY;.    pTab->i
de80: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c  PKey = -1;.  }el
de90: 73 65 7b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71  se{.    pPk = sq
dea0: 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
deb0: 6e 64 65 78 28 70 54 61 62 29 3b 0a 0a 20 20 20  ndex(pTab);..   
dec0: 20 2f 2a 20 42 79 70 61 73 73 20 74 68 65 20 63   /* Bypass the c
ded0: 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 50  reation of the P
dee0: 52 49 4d 41 52 59 20 4b 45 59 20 62 74 72 65 65  RIMARY KEY btree
def0: 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f   and the sqlite_
df00: 6d 61 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 61  master.    ** ta
df10: 62 6c 65 20 65 6e 74 72 79 2e 20 54 68 69 73 20  ble entry. This 
df20: 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64  is only required
df30: 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 67 65   if currently ge
df40: 6e 65 72 61 74 69 6e 67 20 56 44 42 45 0a 20 20  nerating VDBE.  
df50: 20 20 2a 2a 20 63 6f 64 65 20 66 6f 72 20 61 20    ** code for a 
df60: 43 52 45 41 54 45 20 54 41 42 4c 45 20 28 6e 6f  CREATE TABLE (no
df70: 74 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 6f  t when parsing o
df80: 6e 65 20 61 73 20 70 61 72 74 20 6f 66 20 72 65  ne as part of re
df90: 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20 61 20 64  ading.    ** a d
dfa0: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 29 2e  atabase schema).
dfb0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 76 20 29    */.    if( v )
dfc0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
dfd0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
dfe0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
dff0: 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64  3VdbeChangeOpcod
e000: 65 28 76 2c 20 70 50 6b 2d 3e 74 6e 75 6d 2c 20  e(v, pPk->tnum, 
e010: 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a  OP_Goto);.    }.
e020: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52  .    /*.    ** R
e030: 65 6d 6f 76 65 20 61 6c 6c 20 72 65 64 75 6e 64  emove all redund
e040: 61 6e 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  ant columns from
e050: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
e060: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
e070: 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20 22 50  change.    ** "P
e080: 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c 61  RIMARY KEY(a,b,a
e090: 2c 62 2c 63 2c 62 2c 63 2c 64 29 22 20 69 6e 74  ,b,c,b,c,d)" int
e0a0: 6f 20 6a 75 73 74 20 22 50 52 49 4d 41 52 59 20  o just "PRIMARY 
e0b0: 4b 45 59 28 61 2c 62 2c 63 2c 64 29 22 2e 20 20  KEY(a,b,c,d)".  
e0c0: 4c 61 74 65 72 0a 20 20 20 20 2a 2a 20 63 6f 64  Later.    ** cod
e0d0: 65 20 61 73 73 75 6d 65 73 20 74 68 65 20 50 52  e assumes the PR
e0e0: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 74 61 69  IMARY KEY contai
e0f0: 6e 73 20 6e 6f 20 72 65 70 65 61 74 65 64 20 63  ns no repeated c
e100: 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20  olumns..    */. 
e110: 20 20 20 66 6f 72 28 69 3d 6a 3d 31 3b 20 69 3c     for(i=j=1; i<
e120: 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b  pPk->nKeyCol; i+
e130: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 61  +){.      if( ha
e140: 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43  sColumn(pPk->aiC
e150: 6f 6c 75 6d 6e 2c 20 6a 2c 20 70 50 6b 2d 3e 61  olumn, j, pPk->a
e160: 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20  iColumn[i]) ){. 
e170: 20 20 20 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c         pPk->nCol
e180: 75 6d 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c  umn--;.      }el
e190: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d  se{.        pPk-
e1a0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b 5d 20 3d  >aiColumn[j++] =
e1b0: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69   pPk->aiColumn[i
e1c0: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
e1d0: 0a 20 20 20 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  .    pPk->nKeyCo
e1e0: 6c 20 3d 20 6a 3b 0a 20 20 7d 0a 20 20 70 50 6b  l = j;.  }.  pPk
e1f0: 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31  ->isCovering = 1
e200: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 6b 21  ;.  assert( pPk!
e210: 3d 30 20 29 3b 0a 20 20 6e 50 6b 20 3d 20 70 50  =0 );.  nPk = pP
e220: 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20 2f  k->nKeyCol;..  /
e230: 2a 20 4d 61 6b 65 20 73 75 72 65 20 65 76 65 72  * Make sure ever
e240: 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  y column of the 
e250: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 4e  PRIMARY KEY is N
e260: 4f 54 20 4e 55 4c 4c 2e 20 20 28 45 78 63 65 70  OT NULL.  (Excep
e270: 74 2c 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 65  t,.  ** do not e
e280: 6e 66 6f 72 63 65 20 74 68 69 73 20 66 6f 72 20  nforce this for 
e290: 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e  imposter tables.
e2a0: 29 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e  ) */.  if( !db->
e2b0: 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62  init.imposterTab
e2c0: 6c 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  le ){.    for(i=
e2d0: 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a  0; i<nPk; i++){.
e2e0: 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
e2f0: 5b 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  [pPk->aiColumn[i
e300: 5d 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a  ]].notNull = 1;.
e310: 20 20 20 20 7d 0a 20 20 20 20 70 50 6b 2d 3e 75      }.    pPk->u
e320: 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a  niqNotNull = 1;.
e330: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 6f    }..  /* The ro
e340: 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 50  ot page of the P
e350: 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 74 68  RIMARY KEY is th
e360: 65 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67  e table root pag
e370: 65 20 2a 2f 0a 20 20 70 50 6b 2d 3e 74 6e 75 6d  e */.  pPk->tnum
e380: 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 0a   = pTab->tnum;..
e390: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
e3a0: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
e3b0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  entation of all 
e3c0: 55 4e 49 51 55 45 20 69 6e 64 69 63 65 73 20 62  UNIQUE indices b
e3d0: 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a 20 20 2a  y converting.  *
e3e0: 2a 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69  * the final rowi
e3f0: 64 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20 6f 6e  d column into on
e400: 65 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e  e or more column
e410: 73 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  s of the PRIMARY
e420: 20 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   KEY..  */.  for
e430: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
e440: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
e450: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
e460: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28 20   int n;.    if( 
e470: 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
e480: 78 28 70 49 64 78 29 20 29 20 63 6f 6e 74 69 6e  x(pIdx) ) contin
e490: 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d  ue;.    for(i=n=
e4a0: 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a  0; i<nPk; i++){.
e4b0: 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f        if( !hasCo
e4c0: 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c  lumn(pIdx->aiCol
e4d0: 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43  umn, pIdx->nKeyC
e4e0: 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  ol, pPk->aiColum
e4f0: 6e 5b 69 5d 29 20 29 20 6e 2b 2b 3b 0a 20 20 20  n[i]) ) n++;.   
e500: 20 7d 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20   }.    if( n==0 
e510: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
e520: 20 69 6e 64 65 78 20 69 73 20 61 20 73 75 70 65   index is a supe
e530: 72 73 65 74 20 6f 66 20 74 68 65 20 70 72 69 6d  rset of the prim
e540: 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20  ary key */.     
e550: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d   pIdx->nColumn =
e560: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a   pIdx->nKeyCol;.
e570: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
e580: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65      }.    if( re
e590: 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  sizeIndexObject(
e5a0: 64 62 2c 20 70 49 64 78 2c 20 70 49 64 78 2d 3e  db, pIdx, pIdx->
e5b0: 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29 20 72 65 74  nKeyCol+n) ) ret
e5c0: 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  urn;.    for(i=0
e5d0: 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  , j=pIdx->nKeyCo
e5e0: 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a  l; i<nPk; i++){.
e5f0: 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f        if( !hasCo
e600: 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c  lumn(pIdx->aiCol
e610: 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43  umn, pIdx->nKeyC
e620: 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  ol, pPk->aiColum
e630: 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  n[i]) ){.       
e640: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
e650: 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  j] = pPk->aiColu
e660: 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 70  mn[i];.        p
e670: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d  Idx->azColl[j] =
e680: 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b   pPk->azColl[i];
e690: 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  .        j++;.  
e6a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e6b0: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
e6c0: 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e 4b 65  olumn>=pIdx->nKe
e6d0: 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20 61 73  yCol+n );.    as
e6e0: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
e6f0: 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a 0a 20  umn>=j );.  }.. 
e700: 20 2f 2a 20 41 64 64 20 61 6c 6c 20 74 61 62 6c   /* Add all tabl
e710: 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65  e columns to the
e720: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
e730: 65 78 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50  ex.  */.  if( nP
e740: 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  k<pTab->nCol ){.
e750: 20 20 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e      if( resizeIn
e760: 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 50  dexObject(db, pP
e770: 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  k, pTab->nCol) )
e780: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72   return;.    for
e790: 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c 70  (i=0, j=nPk; i<p
e7a0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
e7b0: 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43  .      if( !hasC
e7c0: 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c  olumn(pPk->aiCol
e7d0: 75 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a 20 20  umn, j, i) ){.  
e7e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
e7f0: 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  pPk->nColumn );.
e800: 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43          pPk->aiC
e810: 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20 20  olumn[j] = i;.  
e820: 20 20 20 20 20 20 70 50 6b 2d 3e 61 7a 43 6f 6c        pPk->azCol
e830: 6c 5b 6a 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b  l[j] = "BINARY";
e840: 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  .        j++;.  
e850: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e860: 61 73 73 65 72 74 28 20 70 50 6b 2d 3e 6e 43 6f  assert( pPk->nCo
e870: 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20 20 20 61  lumn==j );.    a
e880: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f  ssert( pTab->nCo
e890: 6c 3d 3d 6a 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  l==j );.  }else{
e8a0: 0a 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d  .    pPk->nColum
e8b0: 6e 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a  n = pTab->nCol;.
e8c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
e8d0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
e8e0: 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  led to report th
e8f0: 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74  e final ")" that
e900: 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61   terminates.** a
e910: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
e920: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
e930: 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  he table structu
e940: 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63  re that other ac
e950: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61  tion routines ha
e960: 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67  ve been building
e970: 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20  .** is added to 
e980: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  the internal has
e990: 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69  h tables, assumi
e9a0: 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76  ng no errors hav
e9b0: 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a  e.** occurred..*
e9c0: 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f  *.** An entry fo
e9d0: 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d  r the table is m
e9e0: 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65  ade in the maste
e9f0: 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c  r table on disk,
ea00: 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20   unless.** this 
ea10: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  is a temporary t
ea20: 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74  able or db->init
ea30: 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20  .busy==1.  When 
ea40: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
ea50: 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20  .** it means we 
ea60: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
ea70: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
ea80: 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a  ble because we j
ea90: 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64  ust.** connected
eaa0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
eab0: 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20   or because the 
eac0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
ead0: 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e  ble has.** recen
eae0: 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20  tly changed, so 
eaf0: 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
eb00: 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  is table already
eb10: 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68   exists in.** th
eb20: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
eb30: 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f  table.  We do no
eb40: 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65  t want to create
eb50: 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a   it again..**.**
eb60: 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20   If the pSelect 
eb70: 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
eb80: 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74  NULL, it means t
eb90: 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hat this routine
eba0: 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74  .** was called t
ebb0: 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65  o create a table
ebc0: 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
ebd0: 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41  a .** "CREATE TA
ebe0: 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43  BLE ... AS SELEC
ebf0: 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74  T ..." statement
ec00: 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  .  The column na
ec10: 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  mes of.** the ne
ec20: 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74  w table will mat
ec30: 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ch the result se
ec40: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  t of the SELECT.
ec50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
ec60: 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73  EndTable(.  Pars
ec70: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
ec80: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
ec90: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
eca0: 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20  *pCons,         
ecb0: 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b    /* The ',' tok
ecc0: 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  en after the las
ecd0: 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a  t column defn. *
ece0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c  /.  Token *pEnd,
ecf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ed00: 68 65 20 27 29 27 20 62 65 66 6f 72 65 20 6f 70  he ')' before op
ed10: 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 43 52 45  tions in the CRE
ed20: 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 75  ATE TABLE */.  u
ed30: 38 20 74 61 62 4f 70 74 73 2c 20 20 20 20 20 20  8 tabOpts,      
ed40: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
ed50: 74 61 62 6c 65 20 6f 70 74 69 6f 6e 73 2e 20 55  table options. U
ed60: 73 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20 20 53  sually 0. */.  S
ed70: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20  elect *pSelect  
ed80: 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74         /* Select
ed90: 20 66 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20   from a "CREATE 
eda0: 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a  ... AS SELECT" *
edb0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
edc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edd0: 20 2f 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c   /* The new tabl
ede0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
edf0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
ee00: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
ee10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
ee20: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
ee30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
ee40: 74 61 62 61 73 65 20 69 6e 20 77 68 69 63 68 20  tabase in which 
ee50: 74 68 65 20 74 61 62 6c 65 20 6c 69 76 65 73 20  the table lives 
ee60: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
ee70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
ee80: 2a 20 41 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64  * An implied ind
ee90: 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ex of the table 
eea0: 2a 2f 0a 0a 20 20 69 66 28 20 70 45 6e 64 3d 3d  */..  if( pEnd==
eeb0: 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 20  0 && pSelect==0 
eec0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
eed0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 64 62   }.  assert( !db
eee0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
eef0: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
ef00: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
ef10: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
ef20: 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
ef30: 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70 53  init.busy || !pS
ef40: 65 6c 65 63 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  elect );..  /* I
ef50: 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  f the db->init.b
ef60: 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e  usy is 1 it mean
ef70: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
ef80: 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65   the SQL off the
ef90: 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61  .  ** "sqlite_ma
efa0: 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65  ster" or "sqlite
efb0: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61  _temp_master" ta
efc0: 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e  ble on the disk.
efd0: 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20  .  ** So do not 
efe0: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73  write to the dis
eff0: 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63  k again.  Extrac
f000: 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  t the root page 
f010: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
f020: 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
f030: 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  he db->init.newT
f040: 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65  num field.  (The
f050: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
f060: 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  * should have be
f070: 65 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20  en put there by 
f080: 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62  the sqliteOpenCb
f090: 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a   routine.).  */.
f0a0: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
f0b0: 75 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e  usy ){.    p->tn
f0c0: 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
f0d0: 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  wTnum;.  }..  /*
f0e0: 20 53 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73   Special process
f0f0: 69 6e 67 20 66 6f 72 20 57 49 54 48 4f 55 54 20  ing for WITHOUT 
f100: 52 4f 57 49 44 20 54 61 62 6c 65 73 20 2a 2f 0a  ROWID Tables */.
f110: 20 20 69 66 28 20 74 61 62 4f 70 74 73 20 26 20    if( tabOpts & 
f120: 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20  TF_WithoutRowid 
f130: 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74  ){.    if( (p->t
f140: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74  abFlags & TF_Aut
f150: 6f 69 6e 63 72 65 6d 65 6e 74 29 20 29 7b 0a 20  oincrement) ){. 
f160: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
f170: 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
f180: 20 20 20 20 20 20 20 22 41 55 54 4f 49 4e 43 52         "AUTOINCR
f190: 45 4d 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77 65  EMENT not allowe
f1a0: 64 20 6f 6e 20 57 49 54 48 4f 55 54 20 52 4f 57  d on WITHOUT ROW
f1b0: 49 44 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20  ID tables");.   
f1c0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
f1d0: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62  .    if( (p->tab
f1e0: 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72  Flags & TF_HasPr
f1f0: 69 6d 61 72 79 4b 65 79 29 3d 3d 30 20 29 7b 0a  imaryKey)==0 ){.
f200: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
f210: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 50  orMsg(pParse, "P
f220: 52 49 4d 41 52 59 20 4b 45 59 20 6d 69 73 73 69  RIMARY KEY missi
f230: 6e 67 20 6f 6e 20 74 61 62 6c 65 20 25 73 22 2c  ng on table %s",
f240: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20   p->zName);.    
f250: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
f260: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 57  tabFlags |= TF_W
f270: 69 74 68 6f 75 74 52 6f 77 69 64 20 7c 20 54 46  ithoutRowid | TF
f280: 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b  _NoVisibleRowid;
f290: 0a 20 20 20 20 20 20 63 6f 6e 76 65 72 74 54 6f  .      convertTo
f2a0: 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c  WithoutRowidTabl
f2b0: 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  e(pParse, p);.  
f2c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 44 62 20 3d    }.  }..  iDb =
f2d0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
f2e0: 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63  Index(db, p->pSc
f2f0: 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20  hema);..#ifndef 
f300: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
f310: 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e  K.  /* Resolve n
f320: 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48 45 43  ames in all CHEC
f330: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 70  K constraint exp
f340: 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ressions..  */. 
f350: 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b 20 29   if( p->pCheck )
f360: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
f370: 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63  olveSelfReferenc
f380: 65 28 70 50 61 72 73 65 2c 20 70 2c 20 4e 43 5f  e(pParse, p, NC_
f390: 49 73 43 68 65 63 6b 2c 20 30 2c 20 70 2d 3e 70  IsCheck, 0, p->p
f3a0: 43 68 65 63 6b 29 3b 0a 20 20 7d 0a 23 65 6e 64  Check);.  }.#end
f3b0: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
f3c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
f3d0: 29 20 2a 2f 0a 0a 20 20 2f 2a 20 45 73 74 69 6d  ) */..  /* Estim
f3e0: 61 74 65 20 74 68 65 20 61 76 65 72 61 67 65 20  ate the average 
f3f0: 72 6f 77 20 73 69 7a 65 20 66 6f 72 20 74 68 65  row size for the
f400: 20 74 61 62 6c 65 20 61 6e 64 20 66 6f 72 20 61   table and for a
f410: 6c 6c 20 69 6d 70 6c 69 65 64 20 69 6e 64 69 63  ll implied indic
f420: 65 73 20 2a 2f 0a 20 20 65 73 74 69 6d 61 74 65  es */.  estimate
f430: 54 61 62 6c 65 57 69 64 74 68 28 70 29 3b 0a 20  TableWidth(p);. 
f440: 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e   for(pIdx=p->pIn
f450: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
f460: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
f470: 20 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57    estimateIndexW
f480: 69 64 74 68 28 70 49 64 78 29 3b 0a 20 20 7d 0a  idth(pIdx);.  }.
f490: 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69  .  /* If not ini
f4a0: 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20  tializing, then 
f4b0: 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20  create a record 
f4c0: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
f4d0: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51  e.  ** in the SQ
f4e0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
f4f0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
f500: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
f510: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52  this is a TEMPOR
f520: 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65  ARY table, write
f530: 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20   the entry into 
f540: 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20  the auxiliary.  
f550: 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  ** file instead 
f560: 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  of into the main
f570: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
f580: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
f590: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
f5a0: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65   int n;.    Vdbe
f5b0: 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   *v;.    char *z
f5c0: 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65  Type;    /* "vie
f5d0: 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f  w" or "table" */
f5e0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65  .    char *zType
f5f0: 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f  2;   /* "VIEW" o
f600: 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20  r "TABLE" */.   
f610: 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20   char *zStmt;   
f620: 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20   /* Text of the 
f630: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20  CREATE TABLE or 
f640: 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74  CREATE VIEW stat
f650: 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20  ement */..    v 
f660: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
f670: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
f680: 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
f690: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c  return;..    sql
f6a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
f6b0: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a  , OP_Close, 0);.
f6c0: 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20  .    /* .    ** 
f6d0: 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65  Initialize zType
f6e0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69 65   for the new vie
f6f0: 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20 20  w or table..    
f700: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53  */.    if( p->pS
f710: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
f720: 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74    /* A regular t
f730: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54  able */.      zT
f740: 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20  ype = "table";. 
f750: 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54       zType2 = "T
f760: 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53  ABLE";.#ifndef S
f770: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
f780: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f790: 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20   /* A view */.  
f7a0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65      zType = "vie
f7b0: 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32  w";.      zType2
f7c0: 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69   = "VIEW";.#endi
f7d0: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
f7e0: 49 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45  If this is a CRE
f7f0: 41 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20  ATE TABLE xx AS 
f800: 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63  SELECT ..., exec
f810: 75 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20  ute the SELECT. 
f820: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
f830: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
f840: 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72  new table. The r
f850: 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20  oot-page number 
f860: 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  for the.    ** n
f870: 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e 20 72  ew table is in r
f880: 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e  egister pParse->
f890: 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a  regRoot..    **.
f8a0: 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20      ** Once the 
f8b0: 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20  SELECT has been 
f8c0: 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33  coded by sqlite3
f8d0: 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20  Select(), it is 
f8e0: 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74  in a.    ** suit
f8f0: 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75  able state to qu
f900: 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ery for the colu
f910: 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70  mn names and typ
f920: 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20  es to be used.  
f930: 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20    ** by the new 
f940: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  table..    **.  
f950: 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61    ** A shared-ca
f960: 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69  che write-lock i
f970: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74  s not required t
f980: 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e  o write to the n
f990: 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a  ew table,.    **
f9a0: 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63   as a schema-loc
f9b0: 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  k must have alre
f9c0: 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ady been obtaine
f9d0: 64 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20  d to create it. 
f9e0: 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73  Since.    ** a s
f9f0: 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75  chema-lock exclu
fa00: 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61  des all other da
fa10: 74 61 62 61 73 65 20 75 73 65 72 73 2c 20 74 68  tabase users, th
fa20: 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75  e write-lock wou
fa30: 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64  ld.    ** be red
fa40: 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20  undant..    */. 
fa50: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
fa60: 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65  {.      SelectDe
fa70: 73 74 20 64 65 73 74 3b 20 20 20 20 2f 2a 20 57  st dest;    /* W
fa80: 68 65 72 65 20 74 68 65 20 53 45 4c 45 43 54 20  here the SELECT 
fa90: 73 68 6f 75 6c 64 20 73 74 6f 72 65 20 72 65 73  should store res
faa0: 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ults */.      in
fab0: 74 20 72 65 67 59 69 65 6c 64 3b 20 20 20 20 20  t regYield;     
fac0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
fad0: 6c 64 69 6e 67 20 63 6f 2d 72 6f 75 74 69 6e 65  lding co-routine
fae0: 20 65 6e 74 72 79 2d 70 6f 69 6e 74 20 2a 2f 0a   entry-point */.
faf0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f        int addrTo
fb00: 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70  p;        /* Top
fb10: 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75 74 69   of the co-routi
fb20: 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ne */.      int 
fb30: 72 65 67 52 65 63 3b 20 20 20 20 20 20 20 20 20  regRec;         
fb40: 2f 2a 20 41 20 72 65 63 6f 72 64 20 74 6f 20 62  /* A record to b
fb50: 65 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 68  e insert into th
fb60: 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20  e new table */. 
fb70: 20 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69       int regRowi
fb80: 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  d;       /* Rowi
fb90: 64 20 6f 66 20 74 68 65 20 6e 65 78 74 20 72 6f  d of the next ro
fba0: 77 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20  w to insert */. 
fbb0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 6e 73       int addrIns
fbc0: 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 6f 70 20  Loop;    /* Top 
fbd0: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
fbe0: 69 6e 73 65 72 74 69 6e 67 20 72 6f 77 73 20 2a  inserting rows *
fbf0: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
fc00: 53 65 6c 54 61 62 3b 20 20 20 20 20 2f 2a 20 41  SelTab;     /* A
fc10: 20 74 61 62 6c 65 20 74 68 61 74 20 64 65 73 63   table that desc
fc20: 72 69 62 65 73 20 74 68 65 20 53 45 4c 45 43 54  ribes the SELECT
fc30: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 20   results */..   
fc40: 20 20 20 72 65 67 59 69 65 6c 64 20 3d 20 2b 2b     regYield = ++
fc50: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
fc60: 20 20 20 20 72 65 67 52 65 63 20 3d 20 2b 2b 70      regRec = ++p
fc70: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
fc80: 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b     regRowid = ++
fc90: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
fca0: 20 20 20 20 61 73 73 65 72 74 28 70 50 61 72 73      assert(pPars
fcb0: 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20 20 20  e->nTab==1);.   
fcc0: 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
fcd0: 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  rt(pParse);.    
fce0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fcf0: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  Op3(v, OP_OpenWr
fd00: 69 74 65 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e  ite, 1, pParse->
fd10: 72 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20  regRoot, iDb);. 
fd20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fd30: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
fd40: 41 47 5f 50 32 49 53 52 45 47 29 3b 0a 20 20 20  AG_P2ISREG);.   
fd50: 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
fd60: 3d 20 32 3b 0a 20 20 20 20 20 20 61 64 64 72 54  = 2;.      addrT
fd70: 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
fd80: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
fd90: 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
fda0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
fdb0: 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
fdc0: 20 72 65 67 59 69 65 6c 64 2c 20 30 2c 20 61 64   regYield, 0, ad
fdd0: 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 73 71  drTop);.      sq
fde0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
fdf0: 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43  nit(&dest, SRT_C
fe00: 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
fe10: 6c 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ld);.      sqlit
fe20: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
fe30: 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29   pSelect, &dest)
fe40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fe50: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
fe60: 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  EndCoroutine, re
fe70: 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 73  gYield);.      s
fe80: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
fe90: 72 65 28 76 2c 20 61 64 64 72 54 6f 70 20 2d 20  re(v, addrTop - 
fea0: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  1);.      if( pP
feb0: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
fec0: 75 72 6e 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  urn;.      pSelT
fed0: 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
fee0: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
fef0: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a  arse, pSelect);.
ff00: 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61        if( pSelTa
ff10: 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  b==0 ) return;. 
ff20: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
ff30: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
ff40: 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54   p->nCol = pSelT
ff50: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->nCol;.      
ff60: 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->aCol = pSelTa
ff70: 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70  b->aCol;.      p
ff80: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30  SelTab->nCol = 0
ff90: 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d  ;.      pSelTab-
ffa0: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >aCol = 0;.     
ffb0: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
ffc0: 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29  ble(db, pSelTab)
ffd0: 3b 0a 20 20 20 20 20 20 61 64 64 72 49 6e 73 4c  ;.      addrInsL
ffe0: 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oop = sqlite3Vdb
fff0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
10000 65 6c 64 2c 20 64 65 73 74 2e 69 53 44 50 61 72  eld, dest.iSDPar
10010 6d 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  m);.      VdbeCo
10020 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
10030 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10040 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
10050 6f 72 64 2c 20 64 65 73 74 2e 69 53 64 73 74 2c  ord, dest.iSdst,
10060 20 64 65 73 74 2e 6e 53 64 73 74 2c 20 72 65 67   dest.nSdst, reg
10070 52 65 63 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Rec);.      sqli
10080 74 65 33 54 61 62 6c 65 41 66 66 69 6e 69 74 79  te3TableAffinity
10090 28 76 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20  (v, p, 0);.     
100a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
100b0 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
100c0 64 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 29 3b  d, 1, regRowid);
100d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
100e0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
100f0 6e 73 65 72 74 2c 20 31 2c 20 72 65 67 52 65 63  nsert, 1, regRec
10100 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
10110 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
10120 74 6f 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f 6f  to(v, addrInsLoo
10130 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
10140 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
10150 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20   addrInsLoop);. 
10160 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10170 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
10180 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 0a 20  se, 1);.    }.. 
10190 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
101a0 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
101b0 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 73 74  of the CREATE st
101c0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
101d0 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
101e0 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61      zStmt = crea
101f0 74 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20  teTableStmt(db, 
10200 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
10210 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64       Token *pEnd
10220 32 20 3d 20 74 61 62 4f 70 74 73 20 3f 20 26 70  2 = tabOpts ? &p
10230 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
10240 6e 20 3a 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  n : pEnd;.      
10250 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 32 2d  n = (int)(pEnd2-
10260 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61  >z - pParse->sNa
10270 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20  meToken.z);.    
10280 20 20 69 66 28 20 70 45 6e 64 32 2d 3e 7a 5b 30    if( pEnd2->z[0
10290 5d 21 3d 27 3b 27 20 29 20 6e 20 2b 3d 20 70 45  ]!=';' ) n += pE
102a0 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 7a 53  nd2->n;.      zS
102b0 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
102c0 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20  intf(db, .      
102d0 20 20 20 20 22 43 52 45 41 54 45 20 25 73 20 25      "CREATE %s %
102e0 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c  .*s", zType2, n,
102f0 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
10300 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a 20  ken.z.      );. 
10310 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73     }..    /* A s
10320 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f  lot for the reco
10330 72 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  rd has already b
10340 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  een allocated in
10350 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c   the .    ** SQL
10360 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
10370 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20  .  We just need 
10380 74 6f 20 75 70 64 61 74 65 20 74 68 61 74 20 73  to update that s
10390 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20  lot with all.   
103a0 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   ** the informat
103b0 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63  ion we've collec
103c0 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
103d0 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
103e0 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
103f0 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 22   "UPDATE %Q.%s "
10400 0a 20 20 20 20 20 20 20 20 20 22 53 45 54 20 74  .         "SET t
10410 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25  ype='%s', name=%
10420 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20  Q, tbl_name=%Q, 
10430 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73 71  rootpage=#%d, sq
10440 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22 57  l=%Q ".       "W
10450 48 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22 2c  HERE rowid=#%d",
10460 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
10470 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
10480 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20  A_TABLE(iDb),.  
10490 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20      zType,.     
104a0 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
104b0 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
104c0 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
104d0 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20  ,.      zStmt,. 
104e0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67       pParse->reg
104f0 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20 20  Rowid.    );.   
10500 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
10510 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73  b, zStmt);.    s
10520 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
10530 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
10540 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10550 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
10560 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  ENT.    /* Check
10570 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65   to see if we ne
10580 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ed to create an 
10590 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
105a0 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a  table for.    **
105b0 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f   keeping track o
105c0 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
105d0 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  keys..    */.   
105e0 20 69 66 28 20 70 2d 3e 74 61 62 46 6c 61 67 73   if( p->tabFlags
105f0 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
10600 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 44 62 20  ent ){.      Db 
10610 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
10620 69 44 62 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  iDb];.      asse
10630 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
10640 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
10650 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20  Db, 0) );.      
10660 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
10670 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a  ->pSeqTab==0 ){.
10680 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e          sqlite3N
10690 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
106a0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43 52  e,.          "CR
106b0 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71  EATE TABLE %Q.sq
106c0 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61  lite_sequence(na
106d0 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20  me,seq)",.      
106e0 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20      pDb->zName. 
106f0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
10700 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
10710 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65      /* Reparse e
10720 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64  verything to upd
10730 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
10740 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
10750 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
10760 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d  dbeAddParseSchem
10770 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20  aOp(v, iDb,.    
10780 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
10790 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e  rintf(db, "tbl_n
107a0 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70  ame='%q' AND typ
107b0 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 20 70  e!='trigger'", p
107c0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a  ->zName));.  }..
107d0 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61  .  /* Add the ta
107e0 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65  ble to the in-me
107f0 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
10800 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62  ion of the datab
10810 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ase..  */.  if( 
10820 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
10830 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64  .    Table *pOld
10840 3b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53  ;.    Schema *pS
10850 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65  chema = p->pSche
10860 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ma;.    assert( 
10870 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
10880 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
10890 30 29 20 29 3b 0a 20 20 20 20 70 4f 6c 64 20 3d  0) );.    pOld =
108a0 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
108b0 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c  rt(&pSchema->tbl
108c0 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  Hash, p->zName, 
108d0 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  p);.    if( pOld
108e0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
108f0 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a  ( p==pOld );  /*
10900 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
10910 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20  e failed inside 
10920 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a  HashInsert() */.
10930 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
10940 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
10950 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
10960 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77      pParse->pNew
10970 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64  Table = 0;.    d
10980 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
10990 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
109a0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
109b0 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c  E_OMIT_ALTERTABL
109c0 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70 53  E.    if( !p->pS
109d0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63  elect ){.      c
109e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
109f0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
10a00 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f  )pParse->sNameTo
10a10 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74  ken.z;.      int
10a20 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61 73   nName;.      as
10a30 73 65 72 74 28 20 21 70 53 65 6c 65 63 74 20 26  sert( !pSelect &
10a40 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e 64 20  & pCons && pEnd 
10a50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
10a60 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  ns->z==0 ){.    
10a70 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64      pCons = pEnd
10a80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10a90 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28 28 63  nName = (int)((c
10aa0 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6e  onst char *)pCon
10ab0 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20  s->z - zName);. 
10ac0 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66       p->addColOf
10ad0 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71 6c 69  fset = 13 + sqli
10ae0 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28 7a  te3Utf8CharLen(z
10af0 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
10b00 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
10b10 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10b20 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
10b30 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
10b40 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  s this routine i
10b50 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74  n order to creat
10b60 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a  e a new VIEW.*/.
10b70 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
10b80 74 65 56 69 65 77 28 0a 20 20 50 61 72 73 65 20  teView(.  Parse 
10b90 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
10ba0 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
10bb0 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
10bc0 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54  pBegin,     /* T
10bd0 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20  he CREATE token 
10be0 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 65 20  that begins the 
10bf0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
10c00 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
10c10 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74    /* The token t
10c20 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  hat holds the na
10c30 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a  me of the view *
10c40 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
10c50 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f  2,     /* The to
10c60 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ken that holds t
10c70 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
10c80 69 65 77 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  iew */.  ExprLis
10c90 74 20 2a 70 43 4e 61 6d 65 73 2c 20 2f 2a 20 4f  t *pCNames, /* O
10ca0 70 74 69 6f 6e 61 6c 20 6c 69 73 74 20 6f 66 20  ptional list of 
10cb0 76 69 65 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  view column name
10cc0 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  s */.  Select *p
10cd0 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53  Select,   /* A S
10ce0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
10cf0 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
10d00 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f   the new view */
10d10 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20  .  int isTemp,  
10d20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f        /* TRUE fo
10d30 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69  r a TEMPORARY vi
10d40 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72  ew */.  int noEr
10d50 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75  r          /* Su
10d60 70 70 72 65 73 73 20 65 72 72 6f 72 20 6d 65 73  ppress error mes
10d70 73 61 67 65 73 20 69 66 20 56 49 45 57 20 61 6c  sages if VIEW al
10d80 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
10d90 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
10da0 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20   int n;.  const 
10db0 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e  char *z;.  Token
10dc0 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72   sEnd;.  DbFixer
10dd0 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a   sFix;.  Token *
10de0 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pName = 0;.  int
10df0 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 20   iDb;.  sqlite3 
10e00 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
10e10 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
10e20 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 73  >nVar>0 ){.    s
10e30 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
10e40 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65 74 65  Parse, "paramete
10e50 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77  rs are not allow
10e60 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b 0a 20  ed in views");. 
10e70 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76     goto create_v
10e80 69 65 77 5f 66 61 69 6c 3b 0a 20 20 7d 0a 20 20  iew_fail;.  }.  
10e90 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
10ea0 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
10eb0 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70  , pName2, isTemp
10ec0 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a  , 1, 0, noErr);.
10ed0 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
10ee0 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
10ef0 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
10f00 45 72 72 20 29 20 67 6f 74 6f 20 63 72 65 61 74  Err ) goto creat
10f10 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20 73  e_view_fail;.  s
10f20 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
10f30 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
10f40 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
10f50 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  );.  iDb = sqlit
10f60 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
10f70 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b  db, p->pSchema);
10f80 0a 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  .  sqlite3FixIni
10f90 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
10fa0 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e   iDb, "view", pN
10fb0 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ame);.  if( sqli
10fc0 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46  te3FixSelect(&sF
10fd0 69 78 2c 20 70 53 65 6c 65 63 74 29 20 29 20 67  ix, pSelect) ) g
10fe0 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f  oto create_view_
10ff0 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  fail;..  /* Make
11000 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
11010 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74 61  ntire SELECT sta
11020 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
11030 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
11040 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72  ** This will for
11050 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e  ce all the Expr.
11060 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74  token.z values t
11070 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
11080 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  .  ** allocated 
11090 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e  rather than poin
110a0 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73  t to the input s
110b0 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65  tring - which me
110c0 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ans that.  ** th
110d0 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20  ey will persist 
110e0 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e  after the curren
110f0 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  t sqlite3_exec()
11100 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20   call returns.. 
11110 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74   */.  p->pSelect
11120 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
11130 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c  Dup(db, pSelect,
11140 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
11150 3b 0a 20 20 70 2d 3e 70 43 68 65 63 6b 20 3d 20  ;.  p->pCheck = 
11160 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
11170 75 70 28 64 62 2c 20 70 43 4e 61 6d 65 73 2c 20  up(db, pCNames, 
11180 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b  EXPRDUP_REDUCE);
11190 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
111a0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 63  cFailed ) goto c
111b0 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b  reate_view_fail;
111c0 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
111d0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45  e end of the CRE
111e0 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65  ATE VIEW stateme
111f0 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70  nt.  Make sEnd p
11200 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65  oint to.  ** the
11210 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e   end..  */.  sEn
11220 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73  d = pParse->sLas
11230 74 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74  tToken;.  assert
11240 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 29  ( sEnd.z[0]!=0 )
11250 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30  ;.  if( sEnd.z[0
11260 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45  ]!=';' ){.    sE
11270 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a  nd.z += sEnd.n;.
11280 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30    }.  sEnd.n = 0
11290 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28 73 45  ;.  n = (int)(sE
112a0 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a  nd.z - pBegin->z
112b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30  );.  assert( n>0
112c0 20 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e   );.  z = pBegin
112d0 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 73 71  ->z;.  while( sq
112e0 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 6e  lite3Isspace(z[n
112f0 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  -1]) ){ n--; }. 
11300 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31   sEnd.z = &z[n-1
11310 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b  ];.  sEnd.n = 1;
11320 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74  ..  /* Use sqlit
11330 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20  e3EndTable() to 
11340 61 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20  add the view to 
11350 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
11360 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  R table */.  sql
11370 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61  ite3EndTable(pPa
11380 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30  rse, 0, &sEnd, 0
11390 2c 20 30 29 3b 0a 0a 63 72 65 61 74 65 5f 76 69  , 0);..create_vi
113a0 65 77 5f 66 61 69 6c 3a 0a 20 20 73 71 6c 69 74  ew_fail:.  sqlit
113b0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
113c0 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 73  b, pSelect);.  s
113d0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
113e0 6c 65 74 65 28 64 62 2c 20 70 43 4e 61 6d 65 73  lete(db, pCNames
113f0 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23  );.  return;.}.#
11400 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
11410 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69  OMIT_VIEW */..#i
11420 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
11430 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
11440 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
11450 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
11460 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62  E)./*.** The Tab
11470 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61  le structure pTa
11480 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ble is really a 
11490 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74  VIEW.  Fill in t
114a0 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74  he names of.** t
114b0 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
114c0 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54  e view in the pT
114d0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20  able structure. 
114e0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
114f0 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e  er.** of errors.
11500 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73    If an error is
11510 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65   seen leave an e
11520 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
11530 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
11540 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
11550 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
11560 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
11570 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
11580 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61  .  Table *pSelTa
11590 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74  b;   /* A fake t
115a0 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20  able from which 
115b0 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75 6c  we get the resul
115c0 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63  t set */.  Selec
115d0 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20  t *pSel;     /* 
115e0 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  Copy of the SELE
115f0 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  CT that implemen
11600 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  ts the view */. 
11610 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20   int nErr = 0;  
11620 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11630 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72  errors encounter
11640 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  ed */.  int n;  
11650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
11660 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74  porarily holds t
11670 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72  he number of cur
11680 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f  sors assigned */
11690 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
116a0 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a   pParse->db;  /*
116b0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
116c0 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20  tion for malloc 
116d0 65 72 72 6f 72 73 20 2a 2f 0a 20 20 73 71 6c 69  errors */.  sqli
116e0 74 65 33 5f 78 61 75 74 68 20 78 41 75 74 68 3b  te3_xauth xAuth;
116f0 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20         /* Saved 
11700 78 41 75 74 68 20 70 6f 69 6e 74 65 72 20 2a 2f  xAuth pointer */
11710 0a 20 20 75 38 20 62 45 6e 61 62 6c 65 64 4c 41  .  u8 bEnabledLA
11720 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
11730 20 53 61 76 65 64 20 64 62 2d 3e 6c 6f 6f 6b 61   Saved db->looka
11740 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 73 74  side.bEnabled st
11750 61 74 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ate */..  assert
11760 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66  ( pTable );..#if
11770 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11780 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
11790 69 66 28 20 73 71 6c 69 74 65 33 56 74 61 62 43  if( sqlite3VtabC
117a0 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61 72 73  allConnect(pPars
117b0 65 2c 20 70 54 61 62 6c 65 29 20 29 7b 0a 20 20  e, pTable) ){.  
117c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
117d0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
117e0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c   IsVirtual(pTabl
117f0 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  e) ) return 0;.#
11800 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
11810 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
11820 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20    /* A positive 
11830 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63  nCol means the c
11840 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72  olumns names for
11850 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a 20   this view are. 
11860 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77   ** already know
11870 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  n..  */.  if( pT
11880 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72  able->nCol>0 ) r
11890 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41  eturn 0;..  /* A
118a0 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69   negative nCol i
118b0 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b  s a special mark
118c0 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  er meaning that 
118d0 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  we are currently
118e0 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20  .  ** trying to 
118f0 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75  compute the colu
11900 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65  mn names.  If we
11910 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74   enter this rout
11920 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20  ine with.  ** a 
11930 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69  negative nCol, i
11940 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d  t means two or m
11950 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61  ore views form a
11960 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73   loop, like this
11970 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
11980 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20  CREATE VIEW one 
11990 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
119a0 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43   two;.  **     C
119b0 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20 41  REATE VIEW two A
119c0 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
119d0 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  one;.  **.  ** A
119e0 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 65 72 72  ctually, the err
119f0 6f 72 20 61 62 6f 76 65 20 69 73 20 6e 6f 77 20  or above is now 
11a00 63 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20  caught prior to 
11a10 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 70 6f  reaching this po
11a20 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68  int..  ** But th
11a30 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
11a40 20 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f 72 74   is still import
11a50 61 6e 74 20 61 73 20 69 74 20 64 6f 65 73 20 63  ant as it does c
11a60 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e 20 74  ome up.  ** in t
11a70 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
11a80 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  ** .  **     CRE
11a90 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e 65  ATE TABLE main.e
11aa0 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20 20 20  x1(a);.  **     
11ab0 43 52 45 41 54 45 20 54 45 4d 50 20 56 49 45 57  CREATE TEMP VIEW
11ac0 20 65 78 31 20 41 53 20 53 45 4c 45 43 54 20 61   ex1 AS SELECT a
11ad0 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a 20   FROM ex1;.  ** 
11ae0 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
11af0 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f  M temp.ex1;.  */
11b00 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e  .  if( pTable->n
11b10 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  Col<0 ){.    sql
11b20 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11b30 72 73 65 2c 20 22 76 69 65 77 20 25 73 20 69 73  rse, "view %s is
11b40 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69   circularly defi
11b50 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  ned", pTable->zN
11b60 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
11b70 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   1;.  }.  assert
11b80 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d  ( pTable->nCol>=
11b90 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  0 );..  /* If we
11ba0 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
11bb0 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20  t means we need 
11bc0 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74  to compute the t
11bd0 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a  able names..  **
11be0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63   Note that the c
11bf0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65  all to sqlite3Re
11c00 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
11c10 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e  ) will expand an
11c20 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65  y.  ** "*" eleme
11c30 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  nts in the resul
11c40 74 73 20 73 65 74 20 6f 66 20 74 68 65 20 76 69  ts set of the vi
11c50 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73 69  ew and will assi
11c60 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20  gn cursors.  ** 
11c70 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20  to the elements 
11c80 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
11c90 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20 6e  se.  But we do n
11ca0 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20 63 68  ot want these ch
11cb0 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65  anges.  ** to be
11cc0 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20   permanent.  So 
11cd0 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20  the computation 
11ce0 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70  is done on a cop
11cf0 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a  y of the SELECT.
11d00 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
11d10 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
11d20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  view..  */.  ass
11d30 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65  ert( pTable->pSe
11d40 6c 65 63 74 20 29 3b 0a 20 20 62 45 6e 61 62 6c  lect );.  bEnabl
11d50 65 64 4c 41 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61  edLA = db->looka
11d60 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 3b 0a 20  side.bEnabled;. 
11d70 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 70 43 68   if( pTable->pCh
11d80 65 63 6b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6c  eck ){.    db->l
11d90 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
11da0 64 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  d = 0;.    sqlit
11db0 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  e3ColumnsFromExp
11dc0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 54  rList(pParse, pT
11dd0 61 62 6c 65 2d 3e 70 43 68 65 63 6b 2c 20 0a 20  able->pCheck, . 
11de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
11e00 54 61 62 6c 65 2d 3e 6e 43 6f 6c 2c 20 26 70 54  Table->nCol, &pT
11e10 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d  able->aCol);.  }
11e20 65 6c 73 65 7b 0a 20 20 20 20 70 53 65 6c 20 3d  else{.    pSel =
11e30 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
11e40 70 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53  p(db, pTable->pS
11e50 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69  elect, 0);.    i
11e60 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 20  f( pSel ){.     
11e70 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61   n = pParse->nTa
11e80 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
11e90 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
11ea0 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53 65  sors(pParse, pSe
11eb0 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20  l->pSrc);.      
11ec0 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d  pTable->nCol = -
11ed0 31 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f  1;.      db->loo
11ee0 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20  kaside.bEnabled 
11ef0 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
11f00 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
11f10 5a 41 54 49 4f 4e 0a 20 20 20 20 20 20 78 41 75  ZATION.      xAu
11f20 74 68 20 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a  th = db->xAuth;.
11f30 20 20 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20        db->xAuth 
11f40 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  = 0;.      pSelT
11f50 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
11f60 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
11f70 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20  arse, pSel);.   
11f80 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78     db->xAuth = x
11f90 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Auth;.#else.    
11fa0 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
11fb0 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
11fc0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
11fd0 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  l);.#endif.     
11fe0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
11ff0 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  n;.      if( pSe
12000 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  lTab ){.        
12010 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
12020 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
12030 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
12040 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
12050 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d  .        pTable-
12060 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >aCol = pSelTab-
12070 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70  >aCol;.        p
12080 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30  SelTab->nCol = 0
12090 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61  ;.        pSelTa
120a0 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
120b0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65       sqlite3Dele
120c0 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c  teTable(db, pSel
120d0 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 61 73  Tab);.        as
120e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
120f0 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
12100 20 30 2c 20 70 54 61 62 6c 65 2d 3e 70 53 63 68   0, pTable->pSch
12110 65 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 7d 65  ema) );.      }e
12120 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61  lse{.        pTa
12130 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  ble->nCol = 0;. 
12140 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20         nErr++;. 
12150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
12160 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
12170 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  (db, pSel);.    
12180 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 6e  } else {.      n
12190 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  Err++;.    }.  }
121a0 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  .  db->lookaside
121b0 2e 62 45 6e 61 62 6c 65 64 20 3d 20 62 45 6e 61  .bEnabled = bEna
121c0 62 6c 65 64 4c 41 3b 0a 20 20 70 54 61 62 6c 65  bledLA;.  pTable
121d0 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d  ->pSchema->schem
121e0 61 46 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72  aFlags |= DB_Unr
121f0 65 73 65 74 56 69 65 77 73 3b 0a 23 65 6e 64 69  esetViews;.#endi
12200 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
12210 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72  _VIEW */.  retur
12220 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64  n nErr;  .}.#end
12230 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
12240 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
12250 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
12260 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
12270 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64  TABLE) */..#ifnd
12280 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
12290 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  IEW./*.** Clear 
122a0 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
122b0 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57   from every VIEW
122c0 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78   in database idx
122d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
122e0 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
122f0 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  All(sqlite3 *db,
12300 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73   int idx){.  Has
12310 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65  hElem *i;.  asse
12320 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
12330 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
12340 64 78 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20  dx, 0) );.  if( 
12350 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64  !DbHasProperty(d
12360 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73  b, idx, DB_Unres
12370 65 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72  etViews) ) retur
12380 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  n;.  for(i=sqlit
12390 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
123a0 61 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61  aDb[idx].pSchema
123b0 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d  ->tblHash); i;i=
123c0 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
123d0 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  )){.    Table *p
123e0 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
123f0 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28  Data(i);.    if(
12400 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
12410 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
12420 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
12430 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
12440 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30    pTab->aCol = 0
12450 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43  ;.      pTab->nC
12460 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ol = 0;.    }.  
12470 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65  }.  DbClearPrope
12480 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
12490 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d  UnresetViews);.}
124a0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
124b0 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
124c0 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f  ll(A,B).#endif /
124d0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
124e0 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  EW */../*.** Thi
124f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
12500 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44 42 45  lled by the VDBE
12510 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69   to adjust the i
12520 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a  nternal schema.*
12530 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65  * used by SQLite
12540 20 77 68 65 6e 20 74 68 65 20 62 74 72 65 65 20   when the btree 
12550 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61  layer moves a ta
12560 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54  ble root page. T
12570 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20  he.** root-page 
12580 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  of a table or in
12590 64 65 78 20 69 6e 20 64 61 74 61 62 61 73 65 20  dex in database 
125a0 69 44 62 20 68 61 73 20 63 68 61 6e 67 65 64 20  iDb has changed 
125b0 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f  from iFrom.** to
125c0 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b   iTo..**.** Tick
125d0 65 74 20 23 31 37 32 38 3a 20 20 54 68 65 20 73  et #1728:  The s
125e0 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68  ymbol table migh
125f0 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20  t still contain 
12600 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f  information.** o
12610 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20  n tables and/or 
12620 69 6e 64 69 63 65 73 20 74 68 61 74 20 61 72 65  indices that are
12630 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20   the process of 
12640 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a  being deleted..*
12650 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c  * If you are unl
12660 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f  ucky, one of tho
12670 73 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63  se deleted indic
12680 65 73 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67  es or tables mig
12690 68 74 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73  ht.** have the s
126a0 61 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d  ame rootpage num
126b0 62 65 72 20 61 73 20 74 68 65 20 72 65 61 6c 20  ber as the real 
126c0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
126d0 68 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20  hat is.** being 
126e0 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61  moved.  So we ca
126f0 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68  nnot stop search
12700 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 66 69  ing after the fi
12710 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65  rst match .** be
12720 63 61 75 73 65 20 74 68 65 20 66 69 72 73 74 20  cause the first 
12730 6d 61 74 63 68 20 6d 69 67 68 74 20 62 65 20 66  match might be f
12740 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65  or one of the de
12750 6c 65 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a  leted indices.**
12760 20 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e   or tables and n
12770 6f 74 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64  ot the table/ind
12780 65 78 20 74 68 61 74 20 69 73 20 61 63 74 75 61  ex that is actua
12790 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e  lly being moved.
127a0 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74  .** We must cont
127b0 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74  inue looping unt
127c0 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e  il all tables an
127d0 64 20 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a  d indices with.*
127e0 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f  * rootpage==iFro
127f0 6d 20 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76  m have been conv
12800 65 72 74 65 64 20 74 6f 20 68 61 76 65 20 61 20  erted to have a 
12810 72 6f 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a  rootpage of iTo.
12820 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  ** in order to b
12830 65 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 77  e certain that w
12840 65 20 67 6f 74 20 74 68 65 20 72 69 67 68 74 20  e got the right 
12850 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  one..*/.#ifndef 
12860 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
12870 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69  VACUUM.void sqli
12880 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64  te3RootPageMoved
12890 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
128a0 74 20 69 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d  t iDb, int iFrom
128b0 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61  , int iTo){.  Ha
128c0 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20  shElem *pElem;. 
128d0 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 20 20   Hash *pHash;.  
128e0 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65  Db *pDb;..  asse
128f0 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
12900 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
12910 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 44 62 20  Db, 0) );.  pDb 
12920 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
12930 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d  .  pHash = &pDb-
12940 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
12950 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  h;.  for(pElem=s
12960 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70  qliteHashFirst(p
12970 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
12980 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
12990 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
129a0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
129b0 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
129c0 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  em);.    if( pTa
129d0 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29  b->tnum==iFrom )
129e0 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e  {.      pTab->tn
129f0 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a  um = iTo;.    }.
12a00 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70    }.  pHash = &p
12a10 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db->pSchema->idx
12a20 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65  Hash;.  for(pEle
12a30 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
12a40 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b  t(pHash); pElem;
12a50 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
12a60 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
12a70 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
12a80 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
12a90 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20  pElem);.    if( 
12aa0 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f  pIdx->tnum==iFro
12ab0 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  m ){.      pIdx-
12ac0 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20  >tnum = iTo;.   
12ad0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
12ae0 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64  ./*.** Write cod
12af0 65 20 74 6f 20 65 72 61 73 65 20 74 68 65 20 74  e to erase the t
12b00 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
12b10 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20  age iTable from 
12b20 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a  database iDb..**
12b30 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65   Also write code
12b40 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73   to modify the s
12b50 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
12b60 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20  le and internal 
12b70 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72  schema.** if a r
12b80 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74  oot-page of anot
12b90 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76  her table is mov
12ba0 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 2d  ed by the btree-
12bb0 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20  layer whilst.** 
12bc0 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28  erasing iTable (
12bd0 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
12be0 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63  with an auto-vac
12bf0 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a  uum database)..*
12c00 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  / .static void d
12c10 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50  estroyRootPage(P
12c20 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
12c30 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44  t iTable, int iD
12c40 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
12c50 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
12c60 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 31  Parse);.  int r1
12c70 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
12c80 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
12c90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12ca0 33 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c  3(v, OP_Destroy,
12cb0 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 69 44 62   iTable, r1, iDb
12cc0 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61 79 41  );.  sqlite3MayA
12cd0 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 23 69  bort(pParse);.#i
12ce0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12cf0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
12d00 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 73 74 6f  * OP_Destroy sto
12d10 72 65 73 20 61 6e 20 69 6e 20 69 6e 74 65 67 65  res an in intege
12d20 72 20 72 31 2e 20 49 66 20 74 68 69 73 20 69 6e  r r1. If this in
12d30 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f  teger.  ** is no
12d40 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20  n-zero, then it 
12d50 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
12d60 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74 61 62   number of a tab
12d70 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a  le moved to.  **
12d80 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c 65   location iTable
12d90 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
12da0 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20 74 68  code modifies th
12db0 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
12dc0 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65  table to.  ** re
12dd0 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a  flect this..  **
12de0 0a 20 20 2a 2a 20 54 68 65 20 22 23 4e 4e 4e 22  .  ** The "#NNN"
12df0 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20 61   in the SQL is a
12e00 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e   special constan
12e10 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68 61  t that means wha
12e20 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a  tever value.  **
12e30 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72 20   is in register 
12e40 4e 4e 4e 2e 20 20 53 65 65 20 67 72 61 6d 6d 61  NNN.  See gramma
12e50 72 20 72 75 6c 65 73 20 61 73 73 6f 63 69 61 74  r rules associat
12e60 65 64 20 77 69 74 68 20 74 68 65 20 54 4b 5f 52  ed with the TK_R
12e70 45 47 49 53 54 45 52 0a 20 20 2a 2a 20 74 6f 6b  EGISTER.  ** tok
12e80 65 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  en for additiona
12e90 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20  l information.. 
12ea0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73   */.  sqlite3Nes
12eb0 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
12ec0 20 0a 20 20 20 20 20 22 55 50 44 41 54 45 20 25   .     "UPDATE %
12ed0 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70 61 67  Q.%s SET rootpag
12ee0 65 3d 25 64 20 57 48 45 52 45 20 23 25 64 20 41  e=%d WHERE #%d A
12ef0 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 22  ND rootpage=#%d"
12f00 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  ,.     pParse->d
12f10 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
12f20 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
12f30 69 44 62 29 2c 20 69 54 61 62 6c 65 2c 20 72 31  iDb), iTable, r1
12f40 2c 20 72 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20  , r1);.#endif.  
12f50 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
12f60 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
12f70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  );.}../*.** Writ
12f80 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65  e VDBE code to e
12f90 72 61 73 65 20 74 61 62 6c 65 20 70 54 61 62 20  rase table pTab 
12fa0 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74  and all associat
12fb0 65 64 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69  ed indices on di
12fc0 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75  sk..** Code to u
12fd0 70 64 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  pdate the sqlite
12fe0 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20 61  _master tables a
12ff0 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  nd internal sche
13000 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a  ma definitions.*
13010 2a 20 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74  * in case a root
13020 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20  -page belonging 
13030 74 6f 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65  to another table
13040 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65   is moved by the
13050 20 62 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20   btree layer.** 
13060 69 73 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74  is also added (t
13070 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77  his can happen w
13080 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ith an auto-vacu
13090 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  um database)..*/
130a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73  .static void des
130b0 74 72 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20  troyTable(Parse 
130c0 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
130d0 70 54 61 62 29 7b 0a 23 69 66 64 65 66 20 53 51  pTab){.#ifdef SQ
130e0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
130f0 43 55 55 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49  CUUM.  Index *pI
13100 64 78 3b 0a 20 20 69 6e 74 20 69 44 62 20 3d 20  dx;.  int iDb = 
13110 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
13120 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
13130 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
13140 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61  .  destroyRootPa
13150 67 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  ge(pParse, pTab-
13160 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 66  >tnum, iDb);.  f
13170 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
13180 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
13190 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
131a0 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61     destroyRootPa
131b0 67 65 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d  ge(pParse, pIdx-
131c0 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d  >tnum, iDb);.  }
131d0 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74  .#else.  /* If t
131e0 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
131f0 62 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  be auto-vacuum c
13200 61 70 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54  apable (if SQLIT
13210 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
13220 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65  M.  ** is not de
13230 66 69 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20  fined), then it 
13240 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
13250 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20  call OP_Destroy 
13260 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c  on the.  ** tabl
13270 65 20 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74  e and index root
13280 2d 70 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c  -pages in order,
13290 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74   starting with t
132a0 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a  he numerically .
132b0 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f    ** largest roo
132c0 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54  t-page number. T
132d0 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20 74  his guarantees t
132e0 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hat none of the 
132f0 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20  root-pages.  ** 
13300 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  to be destroyed 
13310 69 73 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20  is relocated by 
13320 61 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65  an earlier OP_De
13330 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74  stroy. i.e. if t
13340 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  he.  ** followin
13350 67 20 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20  g were coded:.  
13360 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72  **.  ** OP_Destr
13370 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a  oy 4 0.  ** ....
13380 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    ** OP_Destroy 
13390 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e  5 0.  **.  ** an
133a0 64 20 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61  d root page 5 ha
133b0 70 70 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65  ppened to be the
133c0 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
133d0 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  ge number in the
133e0 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20  .  ** database, 
133f0 74 68 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35  then root page 5
13400 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20   would be moved 
13410 74 6f 20 70 61 67 65 20 34 20 62 79 20 74 68 65  to page 4 by the
13420 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72   .  ** "OP_Destr
13430 6f 79 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20  oy 4 0" opcode. 
13440 54 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 22  The subsequent "
13450 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20  OP_Destroy 5 0" 
13460 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61  would hit.  ** a
13470 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e   free-list page.
13480 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  .  */.  int iTab
13490 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20   = pTab->tnum;. 
134a0 20 69 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20   int iDestroyed 
134b0 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31  = 0;..  while( 1
134c0 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
134d0 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61  Idx;.    int iLa
134e0 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20  rgest = 0;..    
134f0 69 66 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d  if( iDestroyed==
13500 30 20 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72  0 || iTab<iDestr
13510 6f 79 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c  oyed ){.      iL
13520 61 72 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20  argest = iTab;. 
13530 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64     }.    for(pId
13540 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
13550 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
13560 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
13570 6e 74 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e  nt iIdx = pIdx->
13580 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65  tnum;.      asse
13590 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d  rt( pIdx->pSchem
135a0 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
135b0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   );.      if( (i
135c0 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20  Destroyed==0 || 
135d0 28 69 49 64 78 3c 69 44 65 73 74 72 6f 79 65 64  (iIdx<iDestroyed
135e0 29 29 20 26 26 20 69 49 64 78 3e 69 4c 61 72 67  )) && iIdx>iLarg
135f0 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  est ){.        i
13600 4c 61 72 67 65 73 74 20 3d 20 69 49 64 78 3b 0a  Largest = iIdx;.
13610 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13620 20 20 69 66 28 20 69 4c 61 72 67 65 73 74 3d 3d    if( iLargest==
13630 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
13640 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  n;.    }else{.  
13650 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
13660 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
13670 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
13680 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
13690 20 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62       assert( iDb
136a0 3e 3d 30 20 26 26 20 69 44 62 3c 70 50 61 72 73  >=0 && iDb<pPars
136b0 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  e->db->nDb );.  
136c0 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
136d0 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72  age(pParse, iLar
136e0 67 65 73 74 2c 20 69 44 62 29 3b 0a 20 20 20 20  gest, iDb);.    
136f0 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69    iDestroyed = i
13700 4c 61 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20  Largest;.    }. 
13710 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
13720 2a 2a 20 52 65 6d 6f 76 65 20 65 6e 74 72 69 65  ** Remove entrie
13730 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74  s from the sqlit
13740 65 5f 73 74 61 74 4e 20 74 61 62 6c 65 73 20 28  e_statN tables (
13750 66 6f 72 20 4e 20 69 6e 20 28 31 2c 32 2c 33 29  for N in (1,2,3)
13760 29 0a 2a 2a 20 61 66 74 65 72 20 61 20 44 52 4f  ).** after a DRO
13770 50 20 49 4e 44 45 58 20 6f 72 20 44 52 4f 50 20  P INDEX or DROP 
13780 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TABLE command..*
13790 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
137a0 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61  lite3ClearStatTa
137b0 62 6c 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  bles(.  Parse *p
137c0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
137d0 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
137e0 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntext */.  int i
137f0 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
13800 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
13810 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 6f  e number */.  co
13820 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c  nst char *zType,
13830 20 20 20 20 20 2f 2a 20 22 69 64 78 22 20 6f 72       /* "idx" or
13840 20 22 74 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73   "tbl" */.  cons
13850 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20  t char *zName   
13860 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 69 6e     /* Name of in
13870 64 65 78 20 6f 72 20 74 61 62 6c 65 20 2a 2f 0a  dex or table */.
13880 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  ){.  int i;.  co
13890 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
138a0 65 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  e = pParse->db->
138b0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
138c0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 34 3b    for(i=1; i<=4;
138d0 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
138e0 7a 54 61 62 5b 32 34 5d 3b 0a 20 20 20 20 73 71  zTab[24];.    sq
138f0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
13900 69 7a 65 6f 66 28 7a 54 61 62 29 2c 7a 54 61 62  izeof(zTab),zTab
13910 2c 22 73 71 6c 69 74 65 5f 73 74 61 74 25 64 22  ,"sqlite_stat%d"
13920 2c 69 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ,i);.    if( sql
13930 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50  ite3FindTable(pP
13940 61 72 73 65 2d 3e 64 62 2c 20 7a 54 61 62 2c 20  arse->db, zTab, 
13950 7a 44 62 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  zDbName) ){.    
13960 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
13970 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
13980 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
13990 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 25 73  M %Q.%s WHERE %s
139a0 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 7a 44  =%Q",.        zD
139b0 62 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 7a 54 79  bName, zTab, zTy
139c0 70 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20  pe, zName.      
139d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
139e0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
139f0 6f 64 65 20 74 6f 20 64 72 6f 70 20 61 20 74 61  ode to drop a ta
13a00 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
13a10 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c  ite3CodeDropTabl
13a20 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
13a30 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e   Table *pTab, in
13a40 74 20 69 44 62 2c 20 69 6e 74 20 69 73 56 69 65  t iDb, int isVie
13a50 77 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  w){.  Vdbe *v;. 
13a60 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13a70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 54 72 69  Parse->db;.  Tri
13a80 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a  gger *pTrigger;.
13a90 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
13aa0 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 76 20  >aDb[iDb];..  v 
13ab0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
13ac0 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
13ad0 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71  rt( v!=0 );.  sq
13ae0 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
13af0 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
13b00 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64   1, iDb);..#ifnd
13b10 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
13b20 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
13b30 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
13b40 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
13b50 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
13b60 5f 56 42 65 67 69 6e 29 3b 0a 20 20 7d 0a 23 65  _VBegin);.  }.#e
13b70 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20  ndif..  /* Drop 
13b80 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73 73  all triggers ass
13b90 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
13ba0 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
13bb0 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 2a 2a 20  pped. Code.  ** 
13bc0 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  is generated to 
13bd0 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66  remove entries f
13be0 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  rom sqlite_maste
13bf0 72 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73 71  r and/or.  ** sq
13c00 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
13c10 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20   if required..  
13c20 2a 2f 0a 20 20 70 54 72 69 67 67 65 72 20 3d 20  */.  pTrigger = 
13c30 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 4c 69  sqlite3TriggerLi
13c40 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  st(pParse, pTab)
13c50 3b 0a 20 20 77 68 69 6c 65 28 20 70 54 72 69 67  ;.  while( pTrig
13c60 67 65 72 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ger ){.    asser
13c70 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63  t( pTrigger->pSc
13c80 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
13c90 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ema || .        
13ca0 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d  pTrigger->pSchem
13cb0 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  a==db->aDb[1].pS
13cc0 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c  chema );.    sql
13cd0 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 50  ite3DropTriggerP
13ce0 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69 67  tr(pParse, pTrig
13cf0 67 65 72 29 3b 0a 20 20 20 20 70 54 72 69 67 67  ger);.    pTrigg
13d00 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70  er = pTrigger->p
13d10 4e 65 78 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  Next;.  }..#ifnd
13d20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
13d30 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f  UTOINCREMENT.  /
13d40 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74  * Remove any ent
13d50 72 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69  ries of the sqli
13d60 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
13d70 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
13d80 68 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65  h.  ** the table
13d90 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20   being dropped. 
13da0 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66  This is done bef
13db0 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20 69 73  ore the table is
13dc0 20 64 72 6f 70 70 65 64 0a 20 20 2a 2a 20 61 74   dropped.  ** at
13dd0 20 74 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c   the btree level
13de0 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 71  , in case the sq
13df0 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
13e00 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 2a  ble needs to.  *
13e10 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75  * move as a resu
13e20 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28  lt of the drop (
13e30 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75  can happen in au
13e40 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e  to-vacuum mode).
13e50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
13e60 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
13e70 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b  Autoincrement ){
13e80 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
13e90 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
13ea0 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
13eb0 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71  OM %Q.sqlite_seq
13ec0 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d 65  uence WHERE name
13ed0 3d 25 51 22 2c 0a 20 20 20 20 20 20 70 44 62 2d  =%Q",.      pDb-
13ee0 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e  >zName, pTab->zN
13ef0 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23  ame.    );.  }.#
13f00 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70  endif..  /* Drop
13f10 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54   all SQLITE_MAST
13f20 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64  ER table and ind
13f30 65 78 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ex entries that 
13f40 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20 2a  refer to the.  *
13f50 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f  * table. The pro
13f60 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20  gram name loops 
13f70 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74  through the mast
13f80 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c  er table and del
13f90 65 74 65 73 0a 20 20 2a 2a 20 65 76 65 72 79 20  etes.  ** every 
13fa0 72 6f 77 20 74 68 61 74 20 72 65 66 65 72 73 20  row that refers 
13fb0 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68  to a table of th
13fc0 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74  e same name as t
13fd0 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a  he one being.  *
13fe0 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67  * dropped. Trigg
13ff0 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20  ers are handled 
14000 73 65 70 61 72 61 74 65 6c 79 20 62 65 63 61 75  separately becau
14010 73 65 20 61 20 74 72 69 67 67 65 72 20 63 61 6e  se a trigger can
14020 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64   be.  ** created
14030 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74   in the temp dat
14040 61 62 61 73 65 20 74 68 61 74 20 72 65 66 65 72  abase that refer
14050 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20  s to a table in 
14060 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 64 61 74  another.  ** dat
14070 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  abase..  */.  sq
14080 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
14090 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
140a0 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
140b0 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d  %s WHERE tbl_nam
140c0 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27  e=%Q and type!='
140d0 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20  trigger'",.     
140e0 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48   pDb->zName, SCH
140f0 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20  EMA_TABLE(iDb), 
14100 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
14110 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20 21  if( !isView && !
14120 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
14130 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 54 61  ){.    destroyTa
14140 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
14150 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d  );.  }..  /* Rem
14160 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 65 6e  ove the table en
14170 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65 27  try from SQLite'
14180 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  s internal schem
14190 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20 2a  a and modify.  *
141a0 2a 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  * the schema coo
141b0 6b 69 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  kie..  */.  if( 
141c0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
141d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
141e0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56  beAddOp4(v, OP_V
141f0 44 65 73 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c  Destroy, iDb, 0,
14200 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   0, pTab->zName,
14210 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
14220 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
14230 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69 44  OP_DropTable, iD
14240 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  b, 0, 0, pTab->z
14250 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Name, 0);.  sqli
14260 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
14270 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
14280 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
14290 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a  ll(db, iDb);.}..
142a0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
142b0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
142c0 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61  do the work of a
142d0 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74   DROP TABLE stat
142e0 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20  ement..** pName 
142f0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
14300 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64  he table to be d
14310 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  ropped..*/.void 
14320 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65  sqlite3DropTable
14330 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
14340 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20  SrcList *pName, 
14350 69 6e 74 20 69 73 56 69 65 77 2c 20 69 6e 74 20  int isView, int 
14360 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c 65 20  noErr){.  Table 
14370 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20 2a 76  *pTab;.  Vdbe *v
14380 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
14390 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
143a0 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20  int iDb;..  if( 
143b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
143c0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
143d0 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
143e0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  }.  assert( pPar
143f0 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20  se->nErr==0 );. 
14400 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e   assert( pName->
14410 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28  nSrc==1 );.  if(
14420 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65   sqlite3ReadSche
14430 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74  ma(pParse) ) got
14440 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
14450 65 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29  e;.  if( noErr )
14460 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72   db->suppressErr
14470 2b 2b 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  ++;.  pTab = sql
14480 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
14490 74 65 6d 28 70 50 61 72 73 65 2c 20 69 73 56 69  tem(pParse, isVi
144a0 65 77 2c 20 26 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ew, &pName->a[0]
144b0 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29  );.  if( noErr )
144c0 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72   db->suppressErr
144d0 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  --;..  if( pTab=
144e0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f  =0 ){.    if( no
144f0 45 72 72 20 29 20 73 71 6c 69 74 65 33 43 6f 64  Err ) sqlite3Cod
14500 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65  eVerifyNamedSche
14510 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  ma(pParse, pName
14520 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
14530 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
14540 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
14550 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
14560 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
14570 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
14580 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
14590 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
145a0 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54  b );..  /* If pT
145b0 61 62 20 69 73 20 61 20 76 69 72 74 75 61 6c 20  ab is a virtual 
145c0 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77  table, call View
145d0 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29  GetColumnNames()
145e0 20 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20   to ensure.  ** 
145f0 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  it is initialize
14600 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73  d..  */.  if( Is
14610 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26  Virtual(pTab) &&
14620 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
14630 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
14640 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20  e, pTab) ){.    
14650 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
14660 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  able;.  }.#ifnde
14670 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
14680 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
14690 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
146a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
146b0 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c  ab = SCHEMA_TABL
146c0 45 28 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73  E(iDb);.    cons
146d0 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
146e0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
146f0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
14700 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20 20 20   *zArg2 = 0;.   
14710 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
14720 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
14730 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
14740 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20  b, 0, zDb)){.   
14750 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
14760 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
14770 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b     if( isView ){
14780 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
14790 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
147a0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  1 ){.        cod
147b0 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
147c0 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  TEMP_VIEW;.     
147d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
147e0 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
147f0 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  OP_VIEW;.      }
14800 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14810 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
14820 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  E.    }else if( 
14830 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
14840 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 20 3d 20  ){.      code = 
14850 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42  SQLITE_DROP_VTAB
14860 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72 67 32 20  LE;.      zArg2 
14870 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  = sqlite3GetVTab
14880 6c 65 28 64 62 2c 20 70 54 61 62 29 2d 3e 70 4d  le(db, pTab)->pM
14890 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69  od->zName;.#endi
148a0 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
148b0 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
148c0 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
148d0 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
148e0 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
148f0 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65  _TABLE;.      }e
14900 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
14910 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
14920 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20  TABLE;.      }. 
14930 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
14940 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
14950 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62  arse, code, pTab
14960 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20  ->zName, zArg2, 
14970 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
14980 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
14990 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  le;.    }.    if
149a0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
149b0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
149c0 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e  E_DELETE, pTab->
149d0 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29  zName, 0, zDb) )
149e0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
149f0 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
14a00 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
14a10 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
14a20 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65  ICmp(pTab->zName
14a30 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d  , "sqlite_", 7)=
14a40 3d 30 20 0a 20 20 20 20 26 26 20 73 71 6c 69 74  =0 .    && sqlit
14a50 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d  e3StrNICmp(pTab-
14a60 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
14a70 73 74 61 74 22 2c 20 31 31 29 21 3d 30 20 29 7b  stat", 11)!=0 ){
14a80 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
14a90 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
14aa0 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62  ble %s may not b
14ab0 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62  e dropped", pTab
14ac0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
14ad0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
14ae0 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  le;.  }..#ifndef
14af0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
14b00 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 44 52  W.  /* Ensure DR
14b10 4f 50 20 54 41 42 4c 45 20 69 73 20 6e 6f 74 20  OP TABLE is not 
14b20 75 73 65 64 20 6f 6e 20 61 20 76 69 65 77 2c 20  used on a view, 
14b30 61 6e 64 20 44 52 4f 50 20 56 49 45 57 20 69 73  and DROP VIEW is
14b40 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f   not used.  ** o
14b50 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  n a table..  */.
14b60 20 20 69 66 28 20 69 73 56 69 65 77 20 26 26 20    if( isView && 
14b70 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
14b80 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
14b90 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
14ba0 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20  "use DROP TABLE 
14bb0 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20  to delete table 
14bc0 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
14bd0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
14be0 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
14bf0 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26  .  if( !isView &
14c00 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  & pTab->pSelect 
14c10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
14c20 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
14c30 75 73 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f  use DROP VIEW to
14c40 20 64 65 6c 65 74 65 20 76 69 65 77 20 25 73 22   delete view %s"
14c50 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
14c60 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
14c70 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65  op_table;.  }.#e
14c80 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
14c90 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f  ate code to remo
14ca0 76 65 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  ve the table fro
14cb0 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
14cc0 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e  le.  ** on disk.
14cd0 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
14ce0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
14cf0 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
14d00 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
14d10 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
14d20 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20  arse, 1, iDb);. 
14d30 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53     sqlite3ClearS
14d40 74 61 74 54 61 62 6c 65 73 28 70 50 61 72 73 65  tatTables(pParse
14d50 2c 20 69 44 62 2c 20 22 74 62 6c 22 2c 20 70 54  , iDb, "tbl", pT
14d60 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
14d70 73 71 6c 69 74 65 33 46 6b 44 72 6f 70 54 61 62  sqlite3FkDropTab
14d80 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  le(pParse, pName
14d90 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c  , pTab);.    sql
14da0 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c  ite3CodeDropTabl
14db0 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
14dc0 69 44 62 2c 20 69 73 56 69 65 77 29 3b 0a 20 20  iDb, isView);.  
14dd0 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  }..exit_drop_tab
14de0 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63  le:.  sqlite3Src
14df0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
14e00 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
14e10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
14e20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
14e30 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b   a new foreign k
14e40 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a  ey on the table.
14e50 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  ** currently und
14e60 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
14e70 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72    pFromCol deter
14e80 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75  mines which colu
14e90 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75  mns.** in the cu
14ea0 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e  rrent table poin
14eb0 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e  t to the foreign
14ec0 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43   key.  If pFromC
14ed0 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f  ol==0 then.** co
14ee0 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f  nnect the key to
14ef0 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
14f00 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20   inserted.  pTo 
14f10 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a  is the name of.*
14f20 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65  * the table refe
14f30 72 72 65 64 20 74 6f 20 28 61 2e 6b 2e 61 20 74  rred to (a.k.a t
14f40 68 65 20 22 70 61 72 65 6e 74 22 20 74 61 62 6c  he "parent" tabl
14f50 65 29 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61  e).  pToCol is a
14f60 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 74 61 62 6c   list.** of tabl
14f70 65 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74  es in the parent
14f80 20 70 54 6f 20 74 61 62 6c 65 2e 20 20 66 6c 61   pTo table.  fla
14f90 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  gs contains all.
14fa0 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ** information a
14fb0 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63  bout the conflic
14fc0 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
14fd0 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66 69 65  orithms specifie
14fe0 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44  d.** in the ON D
14ff0 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45  ELETE, ON UPDATE
15000 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63   and ON INSERT c
15010 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  lauses..**.** An
15020 20 46 4b 65 79 20 73 74 72 75 63 74 75 72 65 20   FKey structure 
15030 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 61  is created and a
15040 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  dded to the tabl
15050 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75  e currently.** u
15060 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
15070 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d  n in the pParse-
15080 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64  >pNewTable field
15090 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65  ..**.** The fore
150a0 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66  ign key is set f
150b0 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f  or IMMEDIATE pro
150c0 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73  cessing.  A subs
150d0 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74  equent call.** t
150e0 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f  o sqlite3DeferFo
150f0 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74  reignKey() might
15100 20 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20   change this to 
15110 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69  DEFERRED..*/.voi
15120 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  d sqlite3CreateF
15130 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72  oreignKey(.  Par
15140 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
15150 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
15160 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
15170 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f  st *pFromCol,  /
15180 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69  * Columns in thi
15190 73 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69  s table that poi
151a0 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c  nt to other tabl
151b0 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  e */.  Token *pT
151c0 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  o,          /* N
151d0 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72  ame of the other
151e0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72   table */.  Expr
151f0 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20  List *pToCol,   
15200 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
15210 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
15220 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
15230 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
15240 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
15250 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29  algorithms. */.)
15260 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
15270 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69  = pParse->db;.#i
15280 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15290 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
152a0 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b  FKey *pFKey = 0;
152b0 0a 20 20 46 4b 65 79 20 2a 70 4e 65 78 74 54 6f  .  FKey *pNextTo
152c0 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70  ;.  Table *p = p
152d0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
152e0 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
152f0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43   int i;.  int nC
15300 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a  ol;.  char *z;..
15310 20 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30    assert( pTo!=0
15320 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c   );.  if( p==0 |
15330 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41  | IN_DECLARE_VTA
15340 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  B ) goto fk_end;
15350 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d  .  if( pFromCol=
15360 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43  =0 ){.    int iC
15370 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  ol = p->nCol-1;.
15380 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 69 43      if( NEVER(iC
15390 6f 6c 3c 30 29 20 29 20 67 6f 74 6f 20 66 6b 5f  ol<0) ) goto fk_
153a0 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f  end;.    if( pTo
153b0 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
153c0 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20  Expr!=1 ){.     
153d0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
153e0 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67  (pParse, "foreig
153f0 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20  n key on %s".   
15400 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72        " should r
15410 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e  eference only on
15420 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c  e column of tabl
15430 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20  e %T",.         
15440 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  p->aCol[iCol].zN
15450 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20  ame, pTo);.     
15460 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
15470 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31    }.    nCol = 1
15480 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  ;.  }else if( pT
15490 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
154a0 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d  nExpr!=pFromCol-
154b0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71  >nExpr ){.    sq
154c0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
154d0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e  arse,.        "n
154e0 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
154f0 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
15500 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
15510 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20  he number of ". 
15520 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20         "columns 
15530 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  in the reference
15540 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67  d table");.    g
15550 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65  oto fk_end;.  }e
15560 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  lse{.    nCol = 
15570 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b  pFromCol->nExpr;
15580 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73  .  }.  nByte = s
15590 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20  izeof(*pFKey) + 
155a0 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28  (nCol-1)*sizeof(
155b0 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20  pFKey->aCol[0]) 
155c0 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20  + pTo->n + 1;.  
155d0 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
155e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f    for(i=0; i<pTo
155f0 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  Col->nExpr; i++)
15600 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d  {.      nByte +=
15610 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
15620 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
15630 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a  ame) + 1;.    }.
15640 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71    }.  pFKey = sq
15650 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
15660 6f 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20  o(db, nByte );. 
15670 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b   if( pFKey==0 ){
15680 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  .    goto fk_end
15690 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70  ;.  }.  pFKey->p
156a0 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65  From = p;.  pFKe
156b0 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70  y->pNextFrom = p
156c0 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28  ->pFKey;.  z = (
156d0 63 68 61 72 2a 29 26 70 46 4b 65 79 2d 3e 61 43  char*)&pFKey->aC
156e0 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65  ol[nCol];.  pFKe
156f0 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65  y->zTo = z;.  me
15700 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20  mcpy(z, pTo->z, 
15710 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f  pTo->n);.  z[pTo
15720 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  ->n] = 0;.  sqli
15730 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20  te3Dequote(z);. 
15740 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a   z += pTo->n+1;.
15750 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20    pFKey->nCol = 
15760 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f  nCol;.  if( pFro
15770 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70  mCol==0 ){.    p
15780 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46  FKey->aCol[0].iF
15790 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  rom = p->nCol-1;
157a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
157b0 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
157c0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  ++){.      int j
157d0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
157e0 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29   j<p->nCol; j++)
157f0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
15800 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e  lite3StrICmp(p->
15810 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70  aCol[j].zName, p
15820 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
15830 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
15840 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c       pFKey->aCol
15850 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20  [i].iFrom = j;. 
15860 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
15870 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15880 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70  }.      if( j>=p
15890 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
158a0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
158b0 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
158c0 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f       "unknown co
158d0 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66  lumn \"%s\" in f
158e0 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
158f0 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20  ition", .       
15900 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69     pFromCol->a[i
15910 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
15920 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
15930 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
15940 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b  .  if( pToCol ){
15950 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
15960 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
15970 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
15980 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c  3Strlen30(pToCol
15990 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
159a0 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c       pFKey->aCol
159b0 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20  [i].zCol = z;.  
159c0 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54      memcpy(z, pT
159d0 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
159e0 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d  , n);.      z[n]
159f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d   = 0;.      z +=
15a00 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   n+1;.    }.  }.
15a10 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72    pFKey->isDefer
15a20 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79  red = 0;.  pFKey
15a30 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 20 3d 20 28  ->aAction[0] = (
15a40 75 38 29 28 66 6c 61 67 73 20 26 20 30 78 66 66  u8)(flags & 0xff
15a50 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  );            /*
15a60 20 4f 4e 20 44 45 4c 45 54 45 20 61 63 74 69 6f   ON DELETE actio
15a70 6e 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 61 41  n */.  pFKey->aA
15a80 63 74 69 6f 6e 5b 31 5d 20 3d 20 28 75 38 29 28  ction[1] = (u8)(
15a90 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20  (flags >> 8 ) & 
15aa0 30 78 66 66 29 3b 20 20 20 20 2f 2a 20 4f 4e 20  0xff);    /* ON 
15ab0 55 50 44 41 54 45 20 61 63 74 69 6f 6e 20 2a 2f  UPDATE action */
15ac0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
15ad0 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
15ae0 6c 64 28 64 62 2c 20 30 2c 20 70 2d 3e 70 53 63  ld(db, 0, p->pSc
15af0 68 65 6d 61 29 20 29 3b 0a 20 20 70 4e 65 78 74  hema) );.  pNext
15b00 54 6f 20 3d 20 28 46 4b 65 79 20 2a 29 73 71 6c  To = (FKey *)sql
15b10 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
15b20 70 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6b 65 79  p->pSchema->fkey
15b30 48 61 73 68 2c 20 0a 20 20 20 20 20 20 70 46 4b  Hash, .      pFK
15b40 65 79 2d 3e 7a 54 6f 2c 20 28 76 6f 69 64 20 2a  ey->zTo, (void *
15b50 29 70 46 4b 65 79 0a 20 20 29 3b 0a 20 20 69 66  )pFKey.  );.  if
15b60 28 20 70 4e 65 78 74 54 6f 3d 3d 70 46 4b 65 79  ( pNextTo==pFKey
15b70 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c   ){.    db->mall
15b80 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
15b90 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
15ba0 20 7d 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f   }.  if( pNextTo
15bb0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
15bc0 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f  pNextTo->pPrevTo
15bd0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 4b 65 79  ==0 );.    pFKey
15be0 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 4e 65 78  ->pNextTo = pNex
15bf0 74 54 6f 3b 0a 20 20 20 20 70 4e 65 78 74 54 6f  tTo;.    pNextTo
15c00 2d 3e 70 50 72 65 76 54 6f 20 3d 20 70 46 4b 65  ->pPrevTo = pFKe
15c10 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e  y;.  }..  /* Lin
15c20 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  k the foreign ke
15c30 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61  y to the table a
15c40 73 20 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e  s the last step.
15c50 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79  .  */.  p->pFKey
15c60 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65   = pFKey;.  pFKe
15c70 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a  y = 0;..fk_end:.
15c80 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
15c90 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65 6e 64  db, pFKey);.#end
15ca0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
15cb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
15cc0 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c  GN_KEY) */.  sql
15cd0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
15ce0 74 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f 6c 29  te(db, pFromCol)
15cf0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
15d00 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54  istDelete(db, pT
15d10 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  oCol);.}../*.** 
15d20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
15d30 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49  called when an I
15d40 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
15d50 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  TE or INITIALLY 
15d60 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75  DEFERRED.** clau
15d70 73 65 20 69 73 20 73 65 65 6e 20 61 73 20 70 61  se is seen as pa
15d80 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20  rt of a foreign 
15d90 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20  key definition. 
15da0 20 54 68 65 20 69 73 44 65 66 65 72 72 65 64 0a   The isDeferred.
15db0 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
15dc0 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  1 for INITIALLY 
15dd0 44 45 46 45 52 52 45 44 20 61 6e 64 20 30 20 66  DEFERRED and 0 f
15de0 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  or INITIALLY IMM
15df0 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62  EDIATE..** The b
15e00 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d  ehavior of the m
15e10 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65  ost recently cre
15e20 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  ated foreign key
15e30 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20   is adjusted.** 
15e40 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a  accordingly..*/.
15e50 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 65  void sqlite3Defe
15e60 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73  rForeignKey(Pars
15e70 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
15e80 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69 66 6e  sDeferred){.#ifn
15e90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15ea0 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61  FOREIGN_KEY.  Ta
15eb0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65  ble *pTab;.  FKe
15ec0 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20  y *pFKey;.  if( 
15ed0 28 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  (pTab = pParse->
15ee0 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c  pNewTable)==0 ||
15ef0 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e   (pFKey = pTab->
15f00 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75  pFKey)==0 ) retu
15f10 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  rn;.  assert( is
15f20 44 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c 20 69  Deferred==0 || i
15f30 73 44 65 66 65 72 72 65 64 3d 3d 31 20 29 3b 20  sDeferred==1 ); 
15f40 2f 2a 20 45 56 3a 20 52 2d 33 30 33 32 33 2d 32  /* EV: R-30323-2
15f50 31 39 31 37 20 2a 2f 0a 20 20 70 46 4b 65 79 2d  1917 */.  pFKey-
15f60 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 28 75  >isDeferred = (u
15f70 38 29 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65  8)isDeferred;.#e
15f80 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ndif.}../*.** Ge
15f90 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
15fa0 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20   will erase and 
15fb0 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49  refill index *pI
15fc0 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  dx.  This is.** 
15fd0 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69  used to initiali
15fe0 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74  ze a newly creat
15ff0 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72  ed index or to r
16000 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20  ecompute the.** 
16010 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e  content of an in
16020 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20  dex in response 
16030 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d  to a REINDEX com
16040 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d  mand..**.** if m
16050 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f  emRootPage is no
16060 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d  t negative, it m
16070 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e  eans that the in
16080 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20  dex is newly.** 
16090 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 72 65  created.  The re
160a0 67 69 73 74 65 72 20 73 70 65 63 69 66 69 65 64  gister specified
160b0 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20   by memRootPage 
160c0 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20  contains the.** 
160d0 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
160e0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
160f0 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69  If memRootPage i
16100 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  s negative, then
16110 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c  .** the index al
16120 72 65 61 64 79 20 65 78 69 73 74 73 20 61 6e 64  ready exists and
16130 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72 65 64   must be cleared
16140 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65   before being re
16150 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68  filled and.** th
16160 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
16170 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  er of the index 
16180 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49  is taken from pI
16190 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73  ndex->tnum..*/.s
161a0 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
161b0 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61  e3RefillIndex(Pa
161c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64  rse *pParse, Ind
161d0 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20  ex *pIndex, int 
161e0 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20  memRootPage){.  
161f0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
16200 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f  ndex->pTable;  /
16210 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68 61 74  * The table that
16220 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   is indexed */. 
16230 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72   int iTab = pPar
16240 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
16250 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20  /* Btree cursor 
16260 75 73 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f  used for pTab */
16270 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50  .  int iIdx = pP
16280 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
16290 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f    /* Btree curso
162a0 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65  r used for pInde
162b0 78 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74  x */.  int iSort
162c0 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
162d0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
162e0 6f 70 65 6e 65 64 20 62 79 20 4f 70 65 6e 53 6f  opened by OpenSo
162f0 72 74 65 72 20 28 69 66 20 69 6e 20 75 73 65 29  rter (if in use)
16300 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b   */.  int addr1;
16310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16320 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
16330 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a  of top of loop *
16340 2f 0a 20 20 69 6e 74 20 61 64 64 72 32 3b 20 20  /.  int addr2;  
16350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16360 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 74 6f     /* Address to
16370 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20 6e 65 78   jump to for nex
16380 74 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  t iteration */. 
16390 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20   int tnum;      
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163b0 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
163c0 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  index */.  int i
163d0 50 61 72 74 49 64 78 4c 61 62 65 6c 3b 20 20 20  PartIdxLabel;   
163e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
163f0 70 20 74 6f 20 74 68 69 73 20 6c 61 62 65 6c 20  p to this label 
16400 74 6f 20 73 6b 69 70 20 61 20 72 6f 77 20 2a 2f  to skip a row */
16410 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
16420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16430 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
16440 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72  de into this vir
16450 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a  tual machine */.
16460 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b    KeyInfo *pKey;
16470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16480 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20   /* KeyInfo for 
16490 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72  index */.  int r
164a0 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20  egRecord;       
164b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
164c0 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73  ister holding as
164d0 73 65 6d 62 6c 65 64 20 69 6e 64 65 78 20 72 65  sembled index re
164e0 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  cord */.  sqlite
164f0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
16500 64 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  db;      /* The 
16510 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
16520 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ion */.  int iDb
16530 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
16540 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  ToIndex(db, pInd
16550 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23  ex->pSchema);..#
16560 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16570 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
16580 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
16590 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
165a0 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20  SQLITE_REINDEX, 
165b0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
165c0 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  ,.      db->aDb[
165d0 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a  iDb].zName ) ){.
165e0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
165f0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71  #endif..  /* Req
16600 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63  uire a write-loc
16610 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  k on the table t
16620 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f  o perform this o
16630 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  peration */.  sq
16640 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
16650 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
16660 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d  ->tnum, 1, pTab-
16670 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20  >zName);..  v = 
16680 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
16690 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
166a0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
166b0 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d  f( memRootPage>=
166c0 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20  0 ){.    tnum = 
166d0 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d  memRootPage;.  }
166e0 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d  else{.    tnum =
166f0 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20   pIndex->tnum;. 
16700 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69   }.  pKey = sqli
16710 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65  te3KeyInfoOfInde
16720 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
16730 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  );..  /* Open th
16740 65 20 73 6f 72 74 65 72 20 63 75 72 73 6f 72 20  e sorter cursor 
16750 69 66 20 77 65 20 61 72 65 20 74 6f 20 75 73 65  if we are to use
16760 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 53 6f 72 74   one. */.  iSort
16770 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  er = pParse->nTa
16780 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  b++;.  sqlite3Vd
16790 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
167a0 6f 72 74 65 72 4f 70 65 6e 2c 20 69 53 6f 72 74  orterOpen, iSort
167b0 65 72 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 6e  er, 0, pIndex->n
167c0 4b 65 79 43 6f 6c 2c 20 28 63 68 61 72 2a 29 0a  KeyCol, (char*).
167d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167e0 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e      sqlite3KeyIn
167f0 66 6f 52 65 66 28 70 4b 65 79 29 2c 20 50 34 5f  foRef(pKey), P4_
16800 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20  KEYINFO);..  /* 
16810 4f 70 65 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  Open the table. 
16820 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
16830 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62   rows of the tab
16840 6c 65 2c 20 69 6e 73 65 72 74 69 6e 67 20 69 6e  le, inserting in
16850 64 65 78 0a 20 20 2a 2a 20 72 65 63 6f 72 64 73  dex.  ** records
16860 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72   into the sorter
16870 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4f 70  . */.  sqlite3Op
16880 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
16890 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c  iTab, iDb, pTab,
168a0 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
168b0 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
168c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
168d0 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30  _Rewind, iTab, 0
168e0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
168f0 76 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20  v);.  regRecord 
16900 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
16910 52 65 67 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  Reg(pParse);..  
16920 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
16930 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 70  ndexKey(pParse,p
16940 49 6e 64 65 78 2c 69 54 61 62 2c 72 65 67 52 65  Index,iTab,regRe
16950 63 6f 72 64 2c 30 2c 26 69 50 61 72 74 49 64 78  cord,0,&iPartIdx
16960 4c 61 62 65 6c 2c 30 2c 30 29 3b 0a 20 20 73 71  Label,0,0);.  sq
16970 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16980 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65  v, OP_SorterInse
16990 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67  rt, iSorter, reg
169a0 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
169b0 65 33 52 65 73 6f 6c 76 65 50 61 72 74 49 64 78  e3ResolvePartIdx
169c0 4c 61 62 65 6c 28 70 50 61 72 73 65 2c 20 69 50  Label(pParse, iP
169d0 61 72 74 49 64 78 4c 61 62 65 6c 29 3b 0a 20 20  artIdxLabel);.  
169e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
169f0 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54  2(v, OP_Next, iT
16a00 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 20 56 64  ab, addr1+1); Vd
16a10 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
16a20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
16a30 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
16a40 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67    if( memRootPag
16a50 65 3c 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  e<0 ) sqlite3Vdb
16a60 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
16a70 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b  ear, tnum, iDb);
16a80 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16a90 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  dOp4(v, OP_OpenW
16aa0 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d  rite, iIdx, tnum
16ab0 2c 20 69 44 62 2c 20 0a 20 20 20 20 20 20 20 20  , iDb, .        
16ac0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
16ad0 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59  r *)pKey, P4_KEY
16ae0 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33  INFO);.  sqlite3
16af0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
16b00 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52 7c 28  OPFLAG_BULKCSR|(
16b10 28 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 29  (memRootPage>=0)
16b20 3f 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47 3a  ?OPFLAG_P2ISREG:
16b30 30 29 29 3b 0a 0a 20 20 61 64 64 72 31 20 3d 20  0));..  addr1 = 
16b40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16b50 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f  2(v, OP_SorterSo
16b60 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 30 29 3b  rt, iSorter, 0);
16b70 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
16b80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
16b90 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !=0 || db->mallo
16ba0 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
16bb0 65 2d 3e 6e 45 72 72 20 29 3b 0a 20 20 69 66 28  e->nErr );.  if(
16bc0 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
16bd0 49 6e 64 65 78 29 20 26 26 20 70 4b 65 79 21 3d  Index) && pKey!=
16be0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 32 20  0 ){.    int j2 
16bf0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
16c00 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 33 3b  rentAddr(v) + 3;
16c10 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16c20 47 6f 74 6f 28 76 2c 20 6a 32 29 3b 0a 20 20 20  Goto(v, j2);.   
16c30 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33   addr2 = sqlite3
16c40 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
16c50 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
16c60 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
16c70 4f 50 5f 53 6f 72 74 65 72 43 6f 6d 70 61 72 65  OP_SorterCompare
16c80 2c 20 69 53 6f 72 74 65 72 2c 20 6a 32 2c 20 72  , iSorter, j2, r
16c90 65 67 52 65 63 6f 72 64 2c 0a 20 20 20 20 20 20  egRecord,.      
16ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cb0 20 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43     pIndex->nKeyC
16cc0 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ol); VdbeCoverag
16cd0 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
16ce0 33 55 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e  3UniqueConstrain
16cf0 74 28 70 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f  t(pParse, OE_Abo
16d00 72 74 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d  rt, pIndex);.  }
16d10 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 32 20  else{.    addr2 
16d20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
16d30 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 7d  rentAddr(v);.  }
16d40 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16d50 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp3(v, OP_Sorte
16d60 72 44 61 74 61 2c 20 69 53 6f 72 74 65 72 2c 20  rData, iSorter, 
16d70 72 65 67 52 65 63 6f 72 64 2c 20 69 49 64 78 29  regRecord, iIdx)
16d80 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
16d90 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4c 61 73 74  ddOp3(v, OP_Last
16da0 2c 20 69 49 64 78 2c 20 30 2c 20 2d 31 29 3b 0a  , iIdx, 0, -1);.
16db0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16dc0 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op3(v, OP_IdxIns
16dd0 65 72 74 2c 20 69 49 64 78 2c 20 72 65 67 52 65  ert, iIdx, regRe
16de0 63 6f 72 64 2c 20 30 29 3b 0a 20 20 73 71 6c 69  cord, 0);.  sqli
16df0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
16e00 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
16e10 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69  KRESULT);.  sqli
16e20 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
16e30 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
16e40 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ord);.  sqlite3V
16e50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16e60 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 53 6f 72  SorterNext, iSor
16e70 74 65 72 2c 20 61 64 64 72 32 29 3b 20 56 64 62  ter, addr2); Vdb
16e80 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
16e90 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
16ea0 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a  ere(v, addr1);..
16eb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16ec0 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
16ed0 20 69 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65   iTab);.  sqlite
16ee0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
16ef0 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 29 3b 0a  P_Close, iIdx);.
16f00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16f10 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
16f20 20 69 53 6f 72 74 65 72 29 3b 0a 7d 0a 0a 2f 2a   iSorter);.}../*
16f30 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 68 65 61  .** Allocate hea
16f40 70 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  p space to hold 
16f50 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  an Index object 
16f60 77 69 74 68 20 6e 43 6f 6c 20 63 6f 6c 75 6d 6e  with nCol column
16f70 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 61 73  s..**.** Increas
16f80 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  e the allocation
16f90 20 73 69 7a 65 20 74 6f 20 70 72 6f 76 69 64 65   size to provide
16fa0 20 61 6e 20 65 78 74 72 61 20 6e 45 78 74 72 61   an extra nExtra
16fb0 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 38 2d 62   bytes.** of 8-b
16fc0 79 74 65 20 61 6c 69 67 6e 65 64 20 73 70 61 63  yte aligned spac
16fd0 65 20 61 66 74 65 72 20 74 68 65 20 49 6e 64 65  e after the Inde
16fe0 78 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74  x object and ret
16ff0 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72  urn a.** pointer
17000 20 74 6f 20 74 68 69 73 20 65 78 74 72 61 20 73   to this extra s
17010 70 61 63 65 20 69 6e 20 2a 70 70 45 78 74 72 61  pace in *ppExtra
17020 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69  ..*/.Index *sqli
17030 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78  te3AllocateIndex
17040 4f 62 6a 65 63 74 28 0a 20 20 73 71 6c 69 74 65  Object(.  sqlite
17050 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f  3 *db,         /
17060 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
17070 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 31 36 20 6e  ction */.  i16 n
17080 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
17090 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
170a0 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
170b0 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  e index */.  int
170c0 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
170d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
170e0 79 74 65 73 20 6f 66 20 65 78 74 72 61 20 73 70  ytes of extra sp
170f0 61 63 65 20 74 6f 20 61 6c 6c 6f 63 20 2a 2f 0a  ace to alloc */.
17100 20 20 63 68 61 72 20 2a 2a 70 70 45 78 74 72 61    char **ppExtra
17110 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
17120 72 20 74 6f 20 74 68 65 20 22 65 78 74 72 61 22  r to the "extra"
17130 20 73 70 61 63 65 20 2a 2f 0a 29 7b 0a 20 20 49   space */.){.  I
17140 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20 20  ndex *p;        
17150 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
17160 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f   index object */
17170 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
17180 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
17190 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 49 6e   of space for In
171a0 64 65 78 20 6f 62 6a 65 63 74 20 2b 20 61 72 72  dex object + arr
171b0 61 79 73 20 2a 2f 0a 0a 20 20 6e 42 79 74 65 20  ays */..  nByte 
171c0 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
171d0 49 6e 64 65 78 29 29 20 2b 20 20 20 20 20 20 20  Index)) +       
171e0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
171f0 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20 20  structure  */.  
17200 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73          ROUND8(s
17210 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f  izeof(char*)*nCo
17220 6c 29 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20  l) +         /* 
17230 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20  Index.azColl    
17240 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52 4f   */.          RO
17250 55 4e 44 38 28 73 69 7a 65 6f 66 28 4c 6f 67 45  UND8(sizeof(LogE
17260 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20 20  st)*(nCol+1) +  
17270 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f     /* Index.aiRo
17280 77 4c 6f 67 45 73 74 20 20 20 2a 2f 0a 20 20 20  wLogEst   */.   
17290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
172a0 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 20 2b  zeof(i16)*nCol +
172b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
172c0 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20  ndex.aiColumn   
172d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
172e0 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e      sizeof(u8)*n
172f0 43 6f 6c 29 3b 20 20 20 20 20 20 20 20 20 20 20  Col);           
17300 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74    /* Index.aSort
17310 4f 72 64 65 72 20 2a 2f 0a 20 20 70 20 3d 20 73  Order */.  p = s
17320 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
17330 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 2b 20 6e  ro(db, nByte + n
17340 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70 20  Extra);.  if( p 
17350 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 45 78  ){.    char *pEx
17360 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70 29  tra = ((char*)p)
17370 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 49  +ROUND8(sizeof(I
17380 6e 64 65 78 29 29 3b 0a 20 20 20 20 70 2d 3e 61  ndex));.    p->a
17390 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29  zColl = (char**)
173a0 70 45 78 74 72 61 3b 20 20 20 20 20 20 20 70 45  pExtra;       pE
173b0 78 74 72 61 20 2b 3d 20 52 4f 55 4e 44 38 28 73  xtra += ROUND8(s
173c0 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f  izeof(char*)*nCo
173d0 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 69 52 6f 77  l);.    p->aiRow
173e0 4c 6f 67 45 73 74 20 3d 20 28 4c 6f 67 45 73 74  LogEst = (LogEst
173f0 2a 29 70 45 78 74 72 61 3b 20 70 45 78 74 72 61  *)pExtra; pExtra
17400 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73   += sizeof(LogEs
17410 74 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20  t)*(nCol+1);.   
17420 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28   p->aiColumn = (
17430 69 31 36 2a 29 70 45 78 74 72 61 3b 20 20 20 20  i16*)pExtra;    
17440 20 20 20 70 45 78 74 72 61 20 2b 3d 20 73 69 7a     pExtra += siz
17450 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 3b 0a 20  eof(i16)*nCol;. 
17460 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72     p->aSortOrder
17470 20 3d 20 28 75 38 2a 29 70 45 78 74 72 61 3b 0a   = (u8*)pExtra;.
17480 20 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d      p->nColumn =
17490 20 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 6e 4b   nCol;.    p->nK
174a0 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2d 20 31  eyCol = nCol - 1
174b0 3b 0a 20 20 20 20 2a 70 70 45 78 74 72 61 20 3d  ;.    *ppExtra =
174c0 20 28 28 63 68 61 72 2a 29 70 29 20 2b 20 6e 42   ((char*)p) + nB
174d0 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  yte;.  }.  retur
174e0 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  n p;.}../*.** Cr
174f0 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78  eate a new index
17500 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c   for an SQL tabl
17510 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65  e.  pName1.pName
17520 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  2 is the name of
17530 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61   the index .** a
17540 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74  nd pTblList is t
17550 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
17560 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
17570 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74  be indexed.  Bot
17580 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55  h will .** be NU
17590 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79  LL for a primary
175a0 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78   key or an index
175b0 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64   that is created
175c0 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a   to satisfy a.**
175d0 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
175e0 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61  nt.  If pTable a
175f0 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55  nd pIndex are NU
17600 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e  LL, use pParse->
17610 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20  pNewTable.** as 
17620 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
17630 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65  indexed.  pParse
17640 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61  ->pNewTable is a
17650 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a   table that is.*
17660 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  * currently bein
17670 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  g constructed by
17680 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
17690 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
176a0 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74   pList is a list
176b0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
176c0 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73  e indexed.  pLis
176d0 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  t will be NULL i
176e0 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70  f this.** is a p
176f0 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e  rimary key or un
17700 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20  ique-constraint 
17710 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
17720 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a  nt column added.
17730 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ** to the table 
17740 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
17750 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a  construction.  .
17760 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 64  **.** If the ind
17770 65 78 20 69 73 20 63 72 65 61 74 65 64 20 73 75  ex is created su
17780 63 63 65 73 73 66 75 6c 6c 79 2c 20 72 65 74 75  ccessfully, retu
17790 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
177a0 74 68 65 20 6e 65 77 20 49 6e 64 65 78 0a 2a 2a  the new Index.**
177b0 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 69 73   structure. This
177c0 20 69 73 20 75 73 65 64 20 62 79 20 73 71 6c 69   is used by sqli
177d0 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79  te3AddPrimaryKey
177e0 28 29 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 69  () to mark the i
177f0 6e 64 65 78 0a 2a 2a 20 61 73 20 74 68 65 20 74  ndex.** as the t
17800 61 62 6c 65 73 20 70 72 69 6d 61 72 79 20 6b 65  ables primary ke
17810 79 20 28 49 6e 64 65 78 2e 69 64 78 54 79 70 65  y (Index.idxType
17820 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  ==SQLITE_IDXTYPE
17830 5f 50 52 49 4d 41 52 59 4b 45 59 29 0a 2a 2f 0a  _PRIMARYKEY).*/.
17840 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 43 72  Index *sqlite3Cr
17850 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72  eateIndex(.  Par
17860 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
17870 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  /* All informati
17880 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61  on about this pa
17890 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  rse */.  Token *
178a0 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46  pName1,     /* F
178b0 69 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64  irst part of ind
178c0 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20  ex name. May be 
178d0 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
178e0 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20  *pName2,     /* 
178f0 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69  Second part of i
17900 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62  ndex name. May b
17910 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c  e NULL */.  SrcL
17920 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f  ist *pTblName, /
17930 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78  * Table to index
17940 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e  . Use pParse->pN
17950 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a  ewTable if 0 */.
17960 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
17970 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f  t,   /* A list o
17980 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
17990 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
179a0 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20   onError,       
179b0 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f  /* OE_Abort, OE_
179c0 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61  Ignore, OE_Repla
179d0 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a  ce, or OE_None *
179e0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72  /.  Token *pStar
179f0 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52  t,     /* The CR
17a00 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20  EATE token that 
17a10 62 65 67 69 6e 73 20 74 68 69 73 20 73 74 61 74  begins this stat
17a20 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20  ement */.  Expr 
17a30 2a 70 50 49 57 68 65 72 65 2c 20 20 20 20 2f 2a  *pPIWhere,    /*
17a40 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f   WHERE clause fo
17a50 72 20 70 61 72 74 69 61 6c 20 69 6e 64 69 63 65  r partial indice
17a60 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f  s */.  int sortO
17a70 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72  rder,     /* Sor
17a80 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69 6d 61  t order of prima
17a90 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c 69 73  ry key when pLis
17aa0 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  t==NULL */.  int
17ab0 20 69 66 4e 6f 74 45 78 69 73 74 20 20 20 20 20   ifNotExist     
17ac0 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20 69 66  /* Omit error if
17ad0 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65   index already e
17ae0 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 49 6e  xists */.){.  In
17af0 64 65 78 20 2a 70 52 65 74 20 3d 20 30 3b 20 20  dex *pRet = 0;  
17b00 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
17b10 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 54 61 62   return */.  Tab
17b20 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20  le *pTab = 0;   
17b30 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
17b40 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e   indexed */.  In
17b50 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b  dex *pIndex = 0;
17b60 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
17b70 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f  to be created */
17b80 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
17b90 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20   0;     /* Name 
17ba0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  of the index */.
17bb0 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20    int nName;    
17bc0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
17bd0 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69   of characters i
17be0 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  n zName */.  int
17bf0 20 69 2c 20 6a 3b 0a 20 20 44 62 46 69 78 65 72   i, j;.  DbFixer
17c00 20 73 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a   sFix;        /*
17c10 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64   For assigning d
17c20 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f  atabase names to
17c30 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74   pTable */.  int
17c40 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20   sortOrderMask; 
17c50 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20    /* 1 to honor 
17c60 44 45 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20  DESC in index.  
17c70 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a  0 to ignore. */.
17c80 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
17c90 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62  pParse->db;.  Db
17ca0 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
17cb0 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66     /* The specif
17cc0 69 63 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  ic table contain
17cd0 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65 64 20  ing the indexed 
17ce0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
17cf0 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
17d00 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
17d10 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
17d20 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
17d30 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
17d40 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55  ame = 0;    /* U
17d50 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
17d60 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  of the index to 
17d70 63 72 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75  create */.  stru
17d80 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
17d90 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20   *pListItem; /* 
17da0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
17db0 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20   pList */.  int 
17dc0 6e 45 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20  nExtra = 0;     
17dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17de0 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  Space allocated 
17df0 66 6f 72 20 7a 45 78 74 72 61 5b 5d 20 2a 2f 0a  for zExtra[] */.
17e00 20 20 69 6e 74 20 6e 45 78 74 72 61 43 6f 6c 3b    int nExtraCol;
17e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17e30 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 6e 65  extra columns ne
17e40 65 64 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  eded */.  char *
17e50 7a 45 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20  zExtra = 0;     
17e60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
17e70 74 72 61 20 73 70 61 63 65 20 61 66 74 65 72 20  tra space after 
17e80 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
17e90 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b   */.  Index *pPk
17ea0 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 50 52   = 0;      /* PR
17eb0 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20  IMARY KEY index 
17ec0 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  for WITHOUT ROWI
17ed0 44 20 74 61 62 6c 65 73 20 2a 2f 0a 0a 20 20 69  D tables */..  i
17ee0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
17ef0 6c 65 64 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52  led || IN_DECLAR
17f00 45 5f 56 54 41 42 20 7c 7c 20 70 50 61 72 73 65  E_VTAB || pParse
17f10 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20  ->nErr>0 ){.    
17f20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
17f30 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66  _index;.  }.  if
17f40 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
17f50 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
17f60 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f  Parse) ){.    go
17f70 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
17f80 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  ndex;.  }..  /*.
17f90 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61    ** Find the ta
17fa0 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
17fb0 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75  e indexed.  Retu
17fc0 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20  rn early if not 
17fd0 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  found..  */.  if
17fe0 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
17ff0 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
18000 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20   two-part index 
18010 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  name to determin
18020 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  e the database .
18030 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68      ** to search
18040 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20   for the table. 
18050 27 46 69 78 27 20 74 68 65 20 74 61 62 6c 65 20  'Fix' the table 
18060 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a  name to this db.
18070 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f      ** before lo
18080 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61 62  oking up the tab
18090 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  le..    */.    a
180a0 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26  ssert( pName1 &&
180b0 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69   pName2 );.    i
180c0 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
180d0 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
180e0 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
180f0 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  &pName);.    if(
18100 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78   iDb<0 ) goto ex
18110 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18120 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
18130 6d 65 20 26 26 20 70 4e 61 6d 65 2d 3e 7a 20 29  me && pName->z )
18140 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
18150 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20  E_OMIT_TEMPDB.  
18160 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65    /* If the inde
18170 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61  x name was unqua
18180 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66  lified, check if
18190 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
181a0 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c  * is a temp tabl
181b0 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68  e. If so, set th
181c0 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e  e database to 1.
181d0 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a   Do not do this.
181e0 20 20 20 20 2a 2a 20 69 66 20 69 6e 69 74 69 61      ** if initia
181f0 6c 69 73 69 6e 67 20 61 20 64 61 74 61 62 61 73  lising a databas
18200 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f  e schema..    */
18210 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
18220 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20  it.busy ){.     
18230 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53   pTab = sqlite3S
18240 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61  rcListLookup(pPa
18250 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a  rse, pTblName);.
18260 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32        if( pName2
18270 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26  ->n==0 && pTab &
18280 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d  & pTab->pSchema=
18290 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68  =db->aDb[1].pSch
182a0 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ema ){.        i
182b0 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  Db = 1;.      }.
182c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
182d0 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74    sqlite3FixInit
182e0 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20  (&sFix, pParse, 
182f0 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e  iDb, "index", pN
18300 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73 71  ame);.    if( sq
18310 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28  lite3FixSrcList(
18320 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29  &sFix, pTblName)
18330 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63   ){.      /* Bec
18340 61 75 73 65 20 74 68 65 20 70 61 72 73 65 72 20  ause the parser 
18350 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e  constructs pTblN
18360 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  ame from a singl
18370 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20  e identifier,.  
18380 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69      ** sqlite3Fi
18390 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76  xSrcList can nev
183a0 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20  er fail. */.    
183b0 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20    assert(0);.   
183c0 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71   }.    pTab = sq
183d0 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
183e0 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20  Item(pParse, 0, 
183f0 26 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 29  &pTblName->a[0])
18400 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
18410 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
18420 30 20 7c 7c 20 70 54 61 62 3d 3d 30 20 29 3b 0a  0 || pTab==0 );.
18430 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
18440 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
18450 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66  te_index;.    if
18460 28 20 69 44 62 3d 3d 31 20 26 26 20 64 62 2d 3e  ( iDb==1 && db->
18470 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
18480 21 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  !=pTab->pSchema 
18490 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
184a0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
184b0 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 63 61   .           "ca
184c0 6e 6e 6f 74 20 63 72 65 61 74 65 20 61 20 54 45  nnot create a TE
184d0 4d 50 20 69 6e 64 65 78 20 6f 6e 20 6e 6f 6e 2d  MP index on non-
184e0 54 45 4d 50 20 74 61 62 6c 65 20 5c 22 25 73 5c  TEMP table \"%s\
184f0 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  "",.           p
18500 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
18510 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
18520 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
18530 0a 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77  .    if( !HasRow
18540 69 64 28 70 54 61 62 29 20 29 20 70 50 6b 20 3d  id(pTab) ) pPk =
18550 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
18560 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
18570 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
18580 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a  rt( pName==0 );.
18590 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61      assert( pSta
185a0 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61  rt==0 );.    pTa
185b0 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
185c0 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 21  Table;.    if( !
185d0 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74  pTab ) goto exit
185e0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
185f0 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
18600 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
18610 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
18620 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26 64  ;.  }.  pDb = &d
18630 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20  b->aDb[iDb];..  
18640 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
18650 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
18660 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a  rse->nErr==0 );.
18670 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
18680 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d  NICmp(pTab->zNam
18690 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29  e, "sqlite_", 7)
186a0 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 64  ==0 .       && d
186b0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 0a  b->init.busy==0.
186c0 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  #if SQLITE_USER_
186d0 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20  AUTHENTICATION. 
186e0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
186f0 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 70 54  UserAuthTable(pT
18700 61 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 0a 23 65  ab->zName)==0.#e
18710 6e 64 69 66 0a 20 20 20 20 20 20 20 26 26 20 73  ndif.       && s
18720 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 26  qlite3StrNICmp(&
18730 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22  pTab->zName[7],"
18740 61 6c 74 65 72 74 61 62 5f 22 2c 39 29 21 3d 30  altertab_",9)!=0
18750 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
18760 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
18770 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f  "table %s may no
18780 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70  t be indexed", p
18790 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
187a0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
187b0 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66  e_index;.  }.#if
187c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
187d0 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54 61 62  _VIEW.  if( pTab
187e0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
187f0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
18800 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 73 20  (pParse, "views 
18810 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
18820 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ed");.    goto e
18830 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18840 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ;.  }.#endif.#if
18850 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18860 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
18870 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
18880 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ab) ){.    sqlit
18890 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
188a0 65 2c 20 22 76 69 72 74 75 61 6c 20 74 61 62 6c  e, "virtual tabl
188b0 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  es may not be in
188c0 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74  dexed");.    got
188d0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
188e0 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  dex;.  }.#endif.
188f0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
18900 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
18910 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72  index.  Make sur
18920 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61  e there is not a
18930 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20  lready another. 
18940 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
18950 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  le with the same
18960 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20   name.  .  **.  
18970 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49  ** Exception:  I
18980 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  f we are reading
18990 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65   the names of pe
189a0 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20  rmanent indices 
189b0 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71  from the.  ** sq
189c0 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
189d0 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20  e (because some 
189e0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68  other process ch
189f0 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61  anged the schema
18a00 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f  ) and.  ** one o
18a10 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  f the index name
18a20 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20  s collides with 
18a30 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65  the name of a te
18a40 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
18a50 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65  .  ** index, the
18a60 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e  n we will contin
18a70 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ue to process th
18a80 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20  is index..  **. 
18a90 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20   ** If pName==0 
18aa0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
18ab0 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e   are.  ** dealin
18ac0 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79  g with a primary
18ad0 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63   key or UNIQUE c
18ae0 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68  onstraint.  We h
18af0 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75  ave to invent ou
18b00 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e  r.  ** own name.
18b10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d  .  */.  if( pNam
18b20 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  e ){.    zName =
18b30 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
18b40 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
18b50 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
18b60 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
18b70 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
18b80 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e   assert( pName->
18b90 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  z!=0 );.    if( 
18ba0 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
18bb0 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
18bc0 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29  e(pParse, zName)
18bd0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
18be0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18bf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18c00 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
18c10 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
18c20 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
18c30 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b   zName, 0)!=0 ){
18c40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18c50 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
18c60 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
18c70 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64  dy a table named
18c80 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
18c90 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
18ca0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18cb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
18cc0 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49  if( sqlite3FindI
18cd0 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
18ce0 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  pDb->zName)!=0 )
18cf0 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 66 4e  {.      if( !ifN
18d00 6f 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20  otExist ){.     
18d10 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
18d20 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65  sg(pParse, "inde
18d30 78 20 25 73 20 61 6c 72 65 61 64 79 20 65 78 69  x %s already exi
18d40 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  sts", zName);.  
18d50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18d60 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e     assert( !db->
18d70 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20  init.busy );.   
18d80 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
18d90 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
18da0 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
18db0 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78   }.      goto ex
18dc0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18dd0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
18de0 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49      int n;.    I
18df0 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20  ndex *pLoop;.   
18e00 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d   for(pLoop=pTab-
18e10 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c  >pIndex, n=1; pL
18e20 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
18e30 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a  ->pNext, n++){}.
18e40 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
18e50 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
18e60 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78  sqlite_autoindex
18e70 5f 25 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a  _%s_%d", pTab->z
18e80 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66  Name, n);.    if
18e90 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
18ea0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
18eb0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
18ec0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
18ed0 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74  k for authorizat
18ee0 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e  ion to create an
18ef0 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66   index..  */.#if
18f00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18f10 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
18f20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
18f30 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 4e  r *zDb = pDb->zN
18f40 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ame;.    if( sql
18f50 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
18f60 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53  arse, SQLITE_INS
18f70 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ERT, SCHEMA_TABL
18f80 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20  E(iDb), 0, zDb) 
18f90 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
18fa0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18fb0 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53  .    }.    i = S
18fc0 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44  QLITE_CREATE_IND
18fd0 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49  EX;.    if( !OMI
18fe0 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
18ff0 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f  =1 ) i = SQLITE_
19000 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45  CREATE_TEMP_INDE
19010 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  X;.    if( sqlit
19020 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
19030 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54  se, i, zName, pT
19040 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20  ab->zName, zDb) 
19050 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
19060 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19070 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
19080 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74  f..  /* If pList
19090 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ==0, it means th
190a0 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
190b0 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20  alled to make a 
190c0 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79  primary.  ** key
190d0 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74   out of the last
190e0 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f   column added to
190f0 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72   the table under
19100 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20   construction.. 
19110 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20   ** So create a 
19120 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d  fake list to sim
19130 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f  ulate this..  */
19140 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
19150 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 70 72 65  ){.    Token pre
19160 76 43 6f 6c 3b 0a 20 20 20 20 70 72 65 76 43 6f  vCol;.    prevCo
19170 6c 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  l.z = pTab->aCol
19180 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a  [pTab->nCol-1].z
19190 4e 61 6d 65 3b 0a 20 20 20 20 70 72 65 76 43 6f  Name;.    prevCo
191a0 6c 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  l.n = sqlite3Str
191b0 6c 65 6e 33 30 28 70 72 65 76 43 6f 6c 2e 7a 29  len30(prevCol.z)
191c0 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  ;.    pList = sq
191d0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
191e0 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 0a 20  end(pParse, 0,. 
191f0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
19200 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
19210 2c 20 54 4b 5f 49 44 2c 20 26 70 72 65 76 43 6f  , TK_ID, &prevCo
19220 6c 2c 20 30 29 29 3b 0a 20 20 20 20 69 66 28 20  l, 0));.    if( 
19230 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  pList==0 ) goto 
19240 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
19250 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  x;.    assert( p
19260 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  List->nExpr==1 )
19270 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
19280 72 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65  rListSetSortOrde
19290 72 28 70 4c 69 73 74 2c 20 73 6f 72 74 4f 72 64  r(pList, sortOrd
192a0 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
192b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
192c0 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 70 50 61  tCheckLength(pPa
192d0 72 73 65 2c 20 70 4c 69 73 74 2c 20 22 69 6e 64  rse, pList, "ind
192e0 65 78 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ex");.  }..  /* 
192f0 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
19300 61 6e 79 20 62 79 74 65 73 20 6f 66 20 73 70 61  any bytes of spa
19310 63 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ce are required 
19320 74 6f 20 73 74 6f 72 65 20 65 78 70 6c 69 63 69  to store explici
19330 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69 66 69  tly.  ** specifi
19340 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
19350 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a  uence names..  *
19360 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
19370 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
19380 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
19390 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  pr = pList->a[i]
193a0 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  .pExpr;.    asse
193b0 72 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a  rt( pExpr!=0 );.
193c0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
193d0 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b  p==TK_COLLATE ){
193e0 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b 3d  .      nExtra +=
193f0 20 28 31 20 2b 20 73 71 6c 69 74 65 33 53 74 72   (1 + sqlite3Str
19400 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a  len30(pExpr->u.z
19410 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 20  Token));.    }. 
19420 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41   }..  /* .  ** A
19430 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65  llocate the inde
19440 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20  x structure. .  
19450 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c  */.  nName = sql
19460 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
19470 6d 65 29 3b 0a 20 20 6e 45 78 74 72 61 43 6f 6c  me);.  nExtraCol
19480 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e 4b   = pPk ? pPk->nK
19490 65 79 43 6f 6c 20 3a 20 31 3b 0a 20 20 70 49 6e  eyCol : 1;.  pIn
194a0 64 65 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c  dex = sqlite3All
194b0 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74  ocateIndexObject
194c0 28 64 62 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70  (db, pList->nExp
194d0 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c 2c 0a 20  r + nExtraCol,. 
194e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19500 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 6e 45 78       nName + nEx
19510 74 72 61 20 2b 20 31 2c 20 26 7a 45 78 74 72 61  tra + 1, &zExtra
19520 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
19530 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
19540 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
19550 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61  e_index;.  }.  a
19560 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
19570 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64  E_ALIGNMENT(pInd
19580 65 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 29  ex->aiRowLogEst)
19590 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   );.  assert( EI
195a0 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
195b0 4e 54 28 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c  NT(pIndex->azCol
195c0 6c 29 20 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  l) );.  pIndex->
195d0 7a 4e 61 6d 65 20 3d 20 7a 45 78 74 72 61 3b 0a  zName = zExtra;.
195e0 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 4e 61 6d    zExtra += nNam
195f0 65 20 2b 20 31 3b 0a 20 20 6d 65 6d 63 70 79 28  e + 1;.  memcpy(
19600 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  pIndex->zName, z
19610 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a  Name, nName+1);.
19620 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
19630 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65   = pTab;.  pInde
19640 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38  x->onError = (u8
19650 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64  )onError;.  pInd
19660 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  ex->uniqNotNull 
19670 3d 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  = onError!=OE_No
19680 6e 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 64  ne;.  pIndex->id
19690 78 54 79 70 65 20 3d 20 70 4e 61 6d 65 20 3f 20  xType = pName ? 
196a0 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41  SQLITE_IDXTYPE_A
196b0 50 50 44 45 46 20 3a 20 53 51 4c 49 54 45 5f 49  PPDEF : SQLITE_I
196c0 44 58 54 59 50 45 5f 55 4e 49 51 55 45 3b 0a 20  DXTYPE_UNIQUE;. 
196d0 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
196e0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
196f0 70 53 63 68 65 6d 61 3b 0a 20 20 70 49 6e 64 65  pSchema;.  pInde
19700 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 70 4c 69  x->nKeyCol = pLi
19710 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28  st->nExpr;.  if(
19720 20 70 50 49 57 68 65 72 65 20 29 7b 0a 20 20 20   pPIWhere ){.   
19730 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53   sqlite3ResolveS
19740 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61  elfReference(pPa
19750 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 50 61  rse, pTab, NC_Pa
19760 72 74 49 64 78 2c 20 70 50 49 57 68 65 72 65 2c  rtIdx, pPIWhere,
19770 20 30 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d   0);.    pIndex-
19780 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 20 3d  >pPartIdxWhere =
19790 20 70 50 49 57 68 65 72 65 3b 0a 20 20 20 20 70   pPIWhere;.    p
197a0 50 49 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d  PIWhere = 0;.  }
197b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
197c0 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
197d0 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
197e0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
197f0 73 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c 64  see if we should
19800 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71 75   honor DESC requ
19810 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f  ests on index co
19820 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28  lumns.  */.  if(
19830 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66   pDb->pSchema->f
19840 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b  ile_format>=4 ){
19850 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61  .    sortOrderMa
19860 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f  sk = -1;   /* Ho
19870 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65  nor DESC */.  }e
19880 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64  lse{.    sortOrd
19890 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f  erMask = 0;    /
198a0 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f  * Ignore DESC */
198b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79  .  }..  /* Analy
198c0 7a 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65  ze the list of e
198d0 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
198e0 66 6f 72 6d 20 74 68 65 20 74 65 72 6d 73 20 6f  form the terms o
198f0 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 0a  f the index and.
19900 20 20 2a 2a 20 72 65 70 6f 72 74 20 61 6e 79 20    ** report any 
19910 65 72 72 6f 72 73 2e 20 20 49 6e 20 74 68 65 20  errors.  In the 
19920 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
19930 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
19940 20 69 73 20 65 78 61 63 74 6c 79 0a 20 20 2a 2a   is exactly.  **
19950 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c   a table column,
19960 20 73 74 6f 72 65 20 74 68 61 74 20 63 6f 6c 75   store that colu
19970 6d 6e 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d  mn in aiColumn[]
19980 2e 20 20 46 6f 72 20 67 65 6e 65 72 61 6c 20 65  .  For general e
19990 78 70 72 65 73 73 69 6f 6e 73 2c 0a 20 20 2a 2a  xpressions,.  **
199a0 20 70 6f 70 75 6c 61 74 65 20 70 49 6e 64 65 78   populate pIndex
199b0 2d 3e 61 43 6f 6c 45 78 70 72 20 61 6e 64 20 73  ->aColExpr and s
199c0 74 6f 72 65 20 58 4e 5f 45 58 50 52 20 28 2d 32  tore XN_EXPR (-2
199d0 29 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e  ) in aiColumn[].
199e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a  .  **.  ** TODO:
199f0 20 49 73 73 75 65 20 61 20 77 61 72 6e 69 6e 67   Issue a warning
19a00 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   if two or more 
19a10 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
19a20 6e 64 65 78 20 61 72 65 20 69 64 65 6e 74 69 63  ndex are identic
19a30 61 6c 2e 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49  al..  ** TODO: I
19a40 73 73 75 65 20 61 20 77 61 72 6e 69 6e 67 20 69  ssue a warning i
19a50 66 20 74 68 65 20 74 61 62 6c 65 20 70 72 69 6d  f the table prim
19a60 61 72 79 20 6b 65 79 20 69 73 20 75 73 65 64 20  ary key is used 
19a70 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20  as part of the. 
19a80 20 2a 2a 20 69 6e 64 65 78 20 6b 65 79 2e 0a 20   ** index key.. 
19a90 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
19aa0 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  ListItem=pList->
19ab0 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  a; i<pList->nExp
19ac0 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65  r; i++, pListIte
19ad0 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
19ae0 70 43 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  pCExpr;         
19af0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
19b00 69 2d 74 68 20 69 6e 64 65 78 20 65 78 70 72 65  i-th index expre
19b10 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  ssion */.    int
19b20 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72   requestedSortOr
19b30 64 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  der;        /* A
19b40 53 43 20 6f 72 20 44 45 53 43 20 6f 6e 20 74 68  SC or DESC on th
19b50 65 20 69 2d 74 68 20 65 78 70 72 65 73 73 69 6f  e i-th expressio
19b60 6e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  n */.    char *z
19b70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
19b80 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
19b90 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
19ba0 6d 65 20 2a 2f 0a 0a 20 20 20 20 73 71 6c 69 74  me */..    sqlit
19bb0 65 33 53 74 72 69 6e 67 54 6f 49 64 28 70 4c 69  e3StringToId(pLi
19bc0 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a  stItem->pExpr);.
19bd0 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c      sqlite3Resol
19be0 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28  veSelfReference(
19bf0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43  pParse, pTab, NC
19c00 5f 49 64 78 45 78 70 72 2c 20 70 4c 69 73 74 49  _IdxExpr, pListI
19c10 74 65 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a  tem->pExpr, 0);.
19c20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
19c30 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74  nErr ) goto exit
19c40 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
19c50 20 20 20 70 43 45 78 70 72 20 3d 20 73 71 6c 69     pCExpr = sqli
19c60 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
19c70 74 65 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45  te(pListItem->pE
19c80 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43  xpr);.    if( pC
19c90 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
19ca0 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  UMN ){.      if(
19cb0 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70   pTab==pParse->p
19cc0 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  NewTable ){.    
19cd0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
19ce0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65 78 70  Msg(pParse, "exp
19cf0 72 65 73 73 69 6f 6e 73 20 70 72 6f 68 69 62 69  ressions prohibi
19d00 74 65 64 20 69 6e 20 50 52 49 4d 41 52 59 20 4b  ted in PRIMARY K
19d10 45 59 20 61 6e 64 20 22 0a 20 20 20 20 20 20 20  EY and ".       
19d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d30 20 20 20 20 20 20 20 20 20 22 55 4e 49 51 55 45           "UNIQUE
19d40 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a   constraints");.
19d50 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
19d60 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
19d70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
19d80 28 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78  ( pIndex->aColEx
19d90 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  pr==0 ){.       
19da0 20 45 78 70 72 4c 69 73 74 20 2a 70 43 6f 70 79   ExprList *pCopy
19db0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
19dc0 73 74 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2c  stDup(db, pList,
19dd0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e   0);.        pIn
19de0 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20 3d 20  dex->aColExpr = 
19df0 70 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 69  pCopy;.        i
19e00 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
19e10 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
19e20 20 20 61 73 73 65 72 74 28 20 70 43 6f 70 79 21    assert( pCopy!
19e30 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
19e40 70 4c 69 73 74 49 74 65 6d 20 3d 20 26 70 43 6f  pListItem = &pCo
19e50 70 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  py->a[i];.      
19e60 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
19e70 20 20 6a 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20    j = XN_EXPR;. 
19e80 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43       pIndex->aiC
19e90 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 45 58  olumn[i] = XN_EX
19ea0 50 52 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  PR;.      pIndex
19eb0 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20  ->uniqNotNull = 
19ec0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
19ed0 20 20 20 20 6a 20 3d 20 70 43 45 78 70 72 2d 3e      j = pCExpr->
19ee0 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 61  iColumn;.      a
19ef0 73 73 65 72 74 28 20 6a 3c 3d 30 78 37 66 66 66  ssert( j<=0x7fff
19f00 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3c   );.      if( j<
19f10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d  0 ){.        j =
19f20 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
19f30 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
19f40 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e  ab->aCol[j].notN
19f50 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ull==0 ){.      
19f60 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f    pIndex->uniqNo
19f70 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  tNull = 0;.     
19f80 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d   }.      pIndex-
19f90 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 28  >aiColumn[i] = (
19fa0 69 31 36 29 6a 3b 0a 20 20 20 20 7d 0a 20 20 20  i16)j;.    }.   
19fb0 20 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20   zColl = 0;.    
19fc0 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  if( pListItem->p
19fd0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
19fe0 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 6e  LATE ){.      in
19ff0 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7a  t nColl;.      z
1a000 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74 65 6d  Coll = pListItem
1a010 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ->pExpr->u.zToke
1a020 6e 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20 3d  n;.      nColl =
1a030 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1a040 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20 20  (zColl) + 1;.   
1a050 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72     assert( nExtr
1a060 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20 20  a>=nColl );.    
1a070 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c    memcpy(zExtra,
1a080 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a   zColl, nColl);.
1a090 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45        zColl = zE
1a0a0 78 74 72 61 3b 0a 20 20 20 20 20 20 7a 45 78 74  xtra;.      zExt
1a0b0 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20  ra += nColl;.   
1a0c0 20 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43 6f     nExtra -= nCo
1a0d0 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ll;.    }else if
1a0e0 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( j>=0 ){.      
1a0f0 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43  zColl = pTab->aC
1a100 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[j].zColl;.   
1a110 20 7d 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c   }.    if( !zCol
1a120 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20 22 42 49 4e  l ) zColl = "BIN
1a130 41 52 59 22 3b 0a 20 20 20 20 69 66 28 20 21 64  ARY";.    if( !d
1a140 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
1a150 21 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f  !sqlite3LocateCo
1a160 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43  llSeq(pParse, zC
1a170 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  oll) ){.      go
1a180 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1a190 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
1a1a0 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
1a1b0 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72  ] = zColl;.    r
1a1c0 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
1a1d0 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73  r = pListItem->s
1a1e0 6f 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74 4f  ortOrder & sortO
1a1f0 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49  rderMask;.    pI
1a200 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
1a210 5b 69 5d 20 3d 20 28 75 38 29 72 65 71 75 65 73  [i] = (u8)reques
1a220 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  tedSortOrder;.  
1a230 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74  }..  /* Append t
1a240 68 65 20 74 61 62 6c 65 20 6b 65 79 20 74 6f 20  he table key to 
1a250 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
1a260 6e 64 65 78 2e 20 20 46 6f 72 20 57 49 54 48 4f  ndex.  For WITHO
1a270 55 54 20 52 4f 57 49 44 0a 20 20 2a 2a 20 74 61  UT ROWID.  ** ta
1a280 62 6c 65 73 20 28 77 68 65 6e 20 70 50 6b 21 3d  bles (when pPk!=
1a290 30 29 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20  0) this will be 
1a2a0 74 68 65 20 64 65 63 6c 61 72 65 64 20 50 52 49  the declared PRI
1a2b0 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72 0a 20  MARY KEY.  For. 
1a2c0 20 2a 2a 20 6e 6f 72 6d 61 6c 20 74 61 62 6c 65   ** normal table
1a2d0 73 20 28 77 68 65 6e 20 70 50 6b 3d 3d 30 29 20  s (when pPk==0) 
1a2e0 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65  this will be the
1a2f0 20 72 6f 77 69 64 2e 0a 20 20 2a 2f 0a 20 20 69   rowid..  */.  i
1a300 66 28 20 70 50 6b 20 29 7b 0a 20 20 20 20 66 6f  f( pPk ){.    fo
1a310 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b  r(j=0; j<pPk->nK
1a320 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  eyCol; j++){.   
1a330 20 20 20 69 6e 74 20 78 20 3d 20 70 50 6b 2d 3e     int x = pPk->
1a340 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
1a350 20 20 20 61 73 73 65 72 74 28 20 78 3e 3d 30 20     assert( x>=0 
1a360 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 61 73  );.      if( has
1a370 43 6f 6c 75 6d 6e 28 70 49 6e 64 65 78 2d 3e 61  Column(pIndex->a
1a380 69 43 6f 6c 75 6d 6e 2c 20 70 49 6e 64 65 78 2d  iColumn, pIndex-
1a390 3e 6e 4b 65 79 43 6f 6c 2c 20 78 29 20 29 7b 0a  >nKeyCol, x) ){.
1a3a0 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1a3b0 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20 20 20 20  nColumn--; .    
1a3c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a3d0 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
1a3e0 6e 5b 69 5d 20 3d 20 78 3b 0a 20 20 20 20 20 20  n[i] = x;.      
1a3f0 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c    pIndex->azColl
1a400 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c  [i] = pPk->azCol
1a410 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 49  l[j];.        pI
1a420 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
1a430 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 53 6f 72 74  [i] = pPk->aSort
1a440 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20  Order[j];.      
1a450 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    i++;.      }. 
1a460 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1a470 20 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c   i==pIndex->nCol
1a480 75 6d 6e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  umn );.  }else{.
1a490 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
1a4a0 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 52 4f 57  lumn[i] = XN_ROW
1a4b0 49 44 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  ID;.    pIndex->
1a4c0 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 22 42 49 4e  azColl[i] = "BIN
1a4d0 41 52 59 22 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ARY";.  }.  sqli
1a4e0 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74  te3DefaultRowEst
1a4f0 28 70 49 6e 64 65 78 29 3b 0a 20 20 69 66 28 20  (pIndex);.  if( 
1a500 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
1a510 65 3d 3d 30 20 29 20 65 73 74 69 6d 61 74 65 49  e==0 ) estimateI
1a520 6e 64 65 78 57 69 64 74 68 28 70 49 6e 64 65 78  ndexWidth(pIndex
1a530 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  );..  if( pTab==
1a540 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
1a550 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  e ){.    /* This
1a560 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65   routine has bee
1a570 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  n called to crea
1a580 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  te an automatic 
1a590 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a  index as a.    *
1a5a0 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52  * result of a PR
1a5b0 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
1a5c0 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20  QUE clause on a 
1a5d0 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f  column definitio
1a5e0 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50  n, or.    ** a P
1a5f0 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
1a600 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c  IQUE clause foll
1a610 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e  owing the column
1a620 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20   definitions..  
1a630 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66    ** i.e. one of
1a640 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1a650 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78  CREATE TABLE t(x
1a660 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29   PRIMARY KEY, y)
1a670 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20  ;.    ** CREATE 
1a680 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e  TABLE t(x, y, UN
1a690 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20  IQUE(x, y));.   
1a6a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65   **.    ** Eithe
1a6b0 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20  r way, check to 
1a6c0 73 65 65 20 69 66 20 74 68 65 20 74 61 62 6c 65  see if the table
1a6d0 20 61 6c 72 65 61 64 79 20 68 61 73 20 73 75 63   already has suc
1a6e0 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20  h an index. If. 
1a6f0 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20     ** so, don't 
1a700 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67 20  bother creating 
1a710 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f  this one. This o
1a720 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20  nly applies to. 
1a730 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61     ** automatica
1a740 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 69  lly created indi
1a750 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64  ces. Users can d
1a760 6f 20 61 73 20 74 68 65 79 20 77 69 73 68 20 77  o as they wish w
1a770 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69  ith.    ** expli
1a780 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20  cit indices..   
1a790 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 77 6f 20 55   **.    ** Two U
1a7a0 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59  NIQUE or PRIMARY
1a7b0 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73   KEY constraints
1a7c0 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
1a7d0 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 2a  equivalent.    *
1a7e0 2a 20 28 61 6e 64 20 74 68 75 73 20 73 75 70 70  * (and thus supp
1a7f0 72 65 73 73 69 6e 67 20 74 68 65 20 73 65 63 6f  ressing the seco
1a800 6e 64 20 6f 6e 65 29 20 65 76 65 6e 20 69 66 20  nd one) even if 
1a810 74 68 65 79 20 68 61 76 65 20 64 69 66 66 65 72  they have differ
1a820 65 6e 74 0a 20 20 20 20 2a 2a 20 73 6f 72 74 20  ent.    ** sort 
1a830 6f 72 64 65 72 73 2e 0a 20 20 20 20 2a 2a 0a 20  orders..    **. 
1a840 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 61     ** If there a
1a850 72 65 20 64 69 66 66 65 72 65 6e 74 20 63 6f 6c  re different col
1a860 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
1a870 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6c 75 6d   or if the colum
1a880 6e 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  ns of.    ** the
1a890 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 63 63 75   constraint occu
1a8a0 72 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 6f  r in different o
1a8b0 72 64 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20  rders, then the 
1a8c0 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a  constraints are.
1a8d0 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65      ** considere
1a8e0 64 20 64 69 73 74 69 6e 63 74 20 61 6e 64 20 62  d distinct and b
1a8f0 6f 74 68 20 72 65 73 75 6c 74 20 69 6e 20 73 65  oth result in se
1a900 70 61 72 61 74 65 20 69 6e 64 69 63 65 73 2e 0a  parate indices..
1a910 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78      */.    Index
1a920 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28   *pIdx;.    for(
1a930 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
1a940 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
1a950 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
1a960 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61    int k;.      a
1a970 73 73 65 72 74 28 20 49 73 55 6e 69 71 75 65 49  ssert( IsUniqueI
1a980 6e 64 65 78 28 70 49 64 78 29 20 29 3b 0a 20 20  ndex(pIdx) );.  
1a990 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
1a9a0 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54  ->idxType!=SQLIT
1a9b0 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46  E_IDXTYPE_APPDEF
1a9c0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1a9d0 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28  ( IsUniqueIndex(
1a9e0 70 49 6e 64 65 78 29 20 29 3b 0a 0a 20 20 20 20  pIndex) );..    
1a9f0 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79    if( pIdx->nKey
1aa00 43 6f 6c 21 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65  Col!=pIndex->nKe
1aa10 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  yCol ) continue;
1aa20 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  .      for(k=0; 
1aa30 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  k<pIdx->nKeyCol;
1aa40 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   k++){.        c
1aa50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 3b 0a 20  onst char *z1;. 
1aa60 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
1aa70 72 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 61  r *z2;.        a
1aa80 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43  ssert( pIdx->aiC
1aa90 6f 6c 75 6d 6e 5b 6b 5d 3e 3d 30 20 29 3b 0a 20  olumn[k]>=0 );. 
1aaa0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
1aab0 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49  >aiColumn[k]!=pI
1aac0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  ndex->aiColumn[k
1aad0 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
1aae0 20 20 20 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a     z1 = pIdx->az
1aaf0 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20  Coll[k];.       
1ab00 20 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a   z2 = pIndex->az
1ab10 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20  Coll[k];.       
1ab20 20 69 66 28 20 7a 31 21 3d 7a 32 20 26 26 20 73   if( z1!=z2 && s
1ab30 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31  qlite3StrICmp(z1
1ab40 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20  , z2) ) break;. 
1ab50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1ab60 20 6b 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   k==pIdx->nKeyCo
1ab70 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  l ){.        if(
1ab80 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
1ab90 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
1aba0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1abb0 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  This constraint 
1abc0 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65  creates the same
1abd0 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76   index as a prev
1abe0 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ious.          *
1abf0 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65  * constraint spe
1ac00 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65  cified somewhere
1ac10 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54   in the CREATE T
1ac20 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
1ac30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77            ** How
1ac40 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46  ever the ON CONF
1ac50 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65  LICT clauses are
1ac60 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62   different. If b
1ac70 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20  oth this .      
1ac80 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
1ac90 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f  t and the previo
1aca0 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  us equivalent co
1acb0 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78  nstraint have ex
1acc0 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20  plicit.         
1acd0 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20   ** ON CONFLICT 
1ace0 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20  clauses this is 
1acf0 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77  an error. Otherw
1ad00 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20  ise, use the.   
1ad10 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63         ** explic
1ad20 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62  itly specified b
1ad30 65 68 61 76 69 6f 72 20 66 6f 72 20 74 68 65 20  ehavior for the 
1ad40 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20  index..         
1ad50 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
1ad60 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  ( !(pIdx->onErro
1ad70 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c  r==OE_Default ||
1ad80 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
1ad90 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b  ==OE_Default) ){
1ada0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1adb0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1adc0 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
1add0 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69        "conflicti
1ade0 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  ng ON CONFLICT c
1adf0 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65 64  lauses specified
1ae00 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ", 0);.         
1ae10 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
1ae20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d   pIdx->onError==
1ae30 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  OE_Default ){.  
1ae40 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
1ae50 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78  onError = pIndex
1ae60 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20  ->onError;.     
1ae70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1ae80 0a 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20  .        pRet = 
1ae90 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 67 6f  pIdx;.        go
1aea0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1aeb0 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
1aec0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69    }.  }..  /* Li
1aed0 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78  nk the new Index
1aee0 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74   structure to it
1aef0 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74  s table and to t
1af00 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e  he other.  ** in
1af10 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1af20 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20   structures. .  
1af30 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
1af40 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a  rse->nErr==0 );.
1af50 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
1af60 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  usy ){.    Index
1af70 20 2a 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28   *p;.    assert(
1af80 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
1af90 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
1afa0 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20  Index->pSchema) 
1afb0 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  );.    p = sqlit
1afc0 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 49  e3HashInsert(&pI
1afd0 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69  ndex->pSchema->i
1afe0 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20  dxHash, .       
1aff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b000 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
1b010 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69  , pIndex);.    i
1b020 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73  f( p ){.      as
1b030 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20  sert( p==pIndex 
1b040 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75  );  /* Malloc mu
1b050 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a  st have failed *
1b060 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c  /.      db->mall
1b070 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
1b080 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1b090 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1b0a0 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  }.    db->flags 
1b0b0 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
1b0c0 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69 66 28  Changes;.    if(
1b0d0 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
1b0e0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e        pIndex->tn
1b0f0 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
1b100 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d  wTnum;.    }.  }
1b110 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1b120 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 43 52  s the initial CR
1b130 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
1b140 6d 65 6e 74 20 28 6f 72 20 43 52 45 41 54 45 20  ment (or CREATE 
1b150 54 41 42 4c 45 20 69 66 20 74 68 65 0a 20 20 2a  TABLE if the.  *
1b160 2a 20 69 6e 64 65 78 20 69 73 20 61 6e 20 69 6d  * index is an im
1b170 70 6c 69 65 64 20 69 6e 64 65 78 20 66 6f 72 20  plied index for 
1b180 61 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d  a UNIQUE or PRIM
1b190 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
1b1a0 6e 74 29 20 74 68 65 6e 0a 20 20 2a 2a 20 65 6d  nt) then.  ** em
1b1b0 69 74 20 63 6f 64 65 20 74 6f 20 61 6c 6c 6f 63  it code to alloc
1b1c0 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 72 6f  ate the index ro
1b1d0 6f 74 70 61 67 65 20 6f 6e 20 64 69 73 6b 20 61  otpage on disk a
1b1e0 6e 64 20 6d 61 6b 65 20 61 6e 20 65 6e 74 72 79  nd make an entry
1b1f0 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 69 6e   for.  ** the in
1b200 64 65 78 20 69 6e 20 74 68 65 20 73 71 6c 69 74  dex in the sqlit
1b210 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e_master table a
1b220 6e 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  nd populate the 
1b230 69 6e 64 65 78 20 77 69 74 68 0a 20 20 2a 2a 20  index with.  ** 
1b240 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74 2c 20 64  content.  But, d
1b250 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 69 66  o not do this if
1b260 20 77 65 20 61 72 65 20 73 69 6d 70 6c 79 20 72   we are simply r
1b270 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74  eading the sqlit
1b280 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61  e_master.  ** ta
1b290 62 6c 65 20 74 6f 20 70 61 72 73 65 20 74 68 65  ble to parse the
1b2a0 20 73 63 68 65 6d 61 2c 20 6f 72 20 69 66 20 74   schema, or if t
1b2b0 68 69 73 20 69 6e 64 65 78 20 69 73 20 74 68 65  his index is the
1b2c0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
1b2d0 65 78 0a 20 20 2a 2a 20 6f 66 20 61 20 57 49 54  ex.  ** of a WIT
1b2e0 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
1b2f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
1b300 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  TblName==0 it me
1b310 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69  ans this index i
1b320 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61  s generated as a
1b330 6e 20 69 6d 70 6c 69 65 64 20 50 52 49 4d 41 52  n implied PRIMAR
1b340 59 20 4b 45 59 0a 20 20 2a 2a 20 6f 72 20 55 4e  Y KEY.  ** or UN
1b350 49 51 55 45 20 69 6e 64 65 78 20 69 6e 20 61 20  IQUE index in a 
1b360 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
1b370 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74  tement.  Since t
1b380 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61  he table.  ** ha
1b390 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61  s just been crea
1b3a0 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ted, it contains
1b3b0 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65   no data and the
1b3c0 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a   index initializ
1b3d0 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20  ation.  ** step 
1b3e0 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a  can be skipped..
1b3f0 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20    */.  else if( 
1b400 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c  HasRowid(pTab) |
1b410 7c 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  | pTblName!=0 ){
1b420 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
1b430 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
1b440 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b     int iMem = ++
1b450 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20  pParse->nMem;.. 
1b460 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
1b470 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1b480 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f     if( v==0 ) go
1b490 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1b4a0 6e 64 65 78 3b 0a 0a 20 20 20 20 73 71 6c 69 74  ndex;..    sqlit
1b4b0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
1b4c0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
1b4d0 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 43   iDb);..    /* C
1b4e0 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61  reate the rootpa
1b4f0 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ge for the index
1b500 20 75 73 69 6e 67 20 43 72 65 61 74 65 49 6e 64   using CreateInd
1b510 65 78 2e 20 42 75 74 20 62 65 66 6f 72 65 0a 20  ex. But before. 
1b520 20 20 20 2a 2a 20 64 6f 69 6e 67 20 73 6f 2c 20     ** doing so, 
1b530 63 6f 64 65 20 61 20 4e 6f 6f 70 20 69 6e 73 74  code a Noop inst
1b540 72 75 63 74 69 6f 6e 20 61 6e 64 20 73 74 6f 72  ruction and stor
1b550 65 20 69 74 73 20 61 64 64 72 65 73 73 20 69 6e  e its address in
1b560 20 0a 20 20 20 20 2a 2a 20 49 6e 64 65 78 2e 74   .    ** Index.t
1b570 6e 75 6d 2e 20 54 68 69 73 20 69 73 20 72 65 71  num. This is req
1b580 75 69 72 65 64 20 69 6e 20 63 61 73 65 20 74 68  uired in case th
1b590 69 73 20 69 6e 64 65 78 20 69 73 20 61 63 74 75  is index is actu
1b5a0 61 6c 6c 79 20 61 20 0a 20 20 20 20 2a 2a 20 50  ally a .    ** P
1b5b0 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 74  RIMARY KEY and t
1b5c0 68 65 20 74 61 62 6c 65 20 69 73 20 61 63 74 75  he table is actu
1b5d0 61 6c 6c 79 20 61 20 57 49 54 48 4f 55 54 20 52  ally a WITHOUT R
1b5e0 4f 57 49 44 20 74 61 62 6c 65 2e 20 49 6e 20 0a  OWID table. In .
1b5f0 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65      ** that case
1b600 20 74 68 65 20 63 6f 6e 76 65 72 74 54 6f 57 69   the convertToWi
1b610 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28  thoutRowidTable(
1b620 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  ) routine will r
1b630 65 70 6c 61 63 65 0a 20 20 20 20 2a 2a 20 74 68  eplace.    ** th
1b640 65 20 4e 6f 6f 70 20 77 69 74 68 20 61 20 47 6f  e Noop with a Go
1b650 74 6f 20 74 6f 20 6a 75 6d 70 20 6f 76 65 72 20  to to jump over 
1b660 74 68 65 20 56 44 42 45 20 63 6f 64 65 20 67 65  the VDBE code ge
1b670 6e 65 72 61 74 65 64 20 62 65 6c 6f 77 2e 20 2a  nerated below. *
1b680 2f 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e  /.    pIndex->tn
1b690 75 6d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  um = sqlite3Vdbe
1b6a0 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f  AddOp0(v, OP_Noo
1b6b0 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  p);.    sqlite3V
1b6c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b6d0 43 72 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62  CreateIndex, iDb
1b6e0 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  , iMem);..    /*
1b6f0 20 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70   Gather the comp
1b700 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
1b710 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
1b720 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20  atement into.   
1b730 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61   ** the zStmt va
1b740 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20  riable.    */.  
1b750 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a    if( pStart ){.
1b760 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69        int n = (i
1b770 6e 74 29 28 70 50 61 72 73 65 2d 3e 73 4c 61 73  nt)(pParse->sLas
1b780 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e 61 6d 65  tToken.z - pName
1b790 2d 3e 7a 29 20 2b 20 70 50 61 72 73 65 2d 3e 73  ->z) + pParse->s
1b7a0 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20 20  LastToken.n;.   
1b7b0 20 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e 7a 5b     if( pName->z[
1b7c0 6e 2d 31 5d 3d 3d 27 3b 27 20 29 20 6e 2d 2d 3b  n-1]==';' ) n--;
1b7d0 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65  .      /* A name
1b7e0 64 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20  d index with an 
1b7f0 65 78 70 6c 69 63 69 74 20 43 52 45 41 54 45 20  explicit CREATE 
1b800 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
1b810 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  */.      zStmt =
1b820 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1b830 64 62 2c 20 22 43 52 45 41 54 45 25 73 20 49 4e  db, "CREATE%s IN
1b840 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20  DEX %.*s",.     
1b850 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e     onError==OE_N
1b860 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49  one ? "" : " UNI
1b870 51 55 45 22 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e  QUE", n, pName->
1b880 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  z);.    }else{. 
1b890 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d       /* An autom
1b8a0 61 74 69 63 20 69 6e 64 65 78 20 63 72 65 61 74  atic index creat
1b8b0 65 64 20 62 79 20 61 20 50 52 49 4d 41 52 59 20  ed by a PRIMARY 
1b8c0 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f  KEY or UNIQUE co
1b8d0 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
1b8e0 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c    /* zStmt = sql
1b8f0 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b  ite3MPrintf("");
1b900 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   */.      zStmt 
1b910 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
1b920 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20  /* Add an entry 
1b930 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  in sqlite_master
1b940 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78 0a   for this index.
1b950 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
1b960 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
1b970 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22  arse, .        "
1b980 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25  INSERT INTO %Q.%
1b990 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27  s VALUES('index'
1b9a0 2c 25 51 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22  ,%Q,%Q,#%d,%Q);"
1b9b0 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ,.        db->aD
1b9c0 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
1b9d0 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
1b9e0 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
1b9f0 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
1ba00 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
1ba10 20 20 20 20 20 69 4d 65 6d 2c 0a 20 20 20 20 20       iMem,.     
1ba20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a     zStmt.    );.
1ba30 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1ba40 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20  e(db, zStmt);.. 
1ba50 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69     /* Fill the i
1ba60 6e 64 65 78 20 77 69 74 68 20 64 61 74 61 20 61  ndex with data a
1ba70 6e 64 20 72 65 70 61 72 73 65 20 74 68 65 20 73  nd reparse the s
1ba80 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f  chema. Code an O
1ba90 50 5f 45 78 70 69 72 65 0a 20 20 20 20 2a 2a 20  P_Expire.    ** 
1baa0 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  to invalidate al
1bab0 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73  l pre-compiled s
1bac0 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a  tatements..    *
1bad0 2f 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61  /.    if( pTblNa
1bae0 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  me ){.      sqli
1baf0 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
1bb00 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69  Parse, pIndex, i
1bb10 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Mem);.      sqli
1bb20 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
1bb30 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
1bb40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1bb50 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28  ddParseSchemaOp(
1bb60 76 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20  v, iDb,.        
1bb70 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1bb80 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27 20 41  db, "name='%q' A
1bb90 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22  ND type='index'"
1bba0 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29  , pIndex->zName)
1bbb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1bbc0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
1bbd0 5f 45 78 70 69 72 65 2c 20 30 29 3b 0a 20 20 20  _Expire, 0);.   
1bbe0 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56   }..    sqlite3V
1bbf0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
1bc00 49 6e 64 65 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20  Index->tnum);.  
1bc10 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64  }..  /* When add
1bc20 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ing an index to 
1bc30 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69  the list of indi
1bc40 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c  ces for a table,
1bc50 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20   make.  ** sure 
1bc60 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65  all indices labe
1bc70 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63  led OE_Replace c
1bc80 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68  ome after all th
1bc90 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a  ose labeled.  **
1bca0 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69   OE_Ignore.  Thi
1bcb0 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66  s is necessary f
1bcc0 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 63  or the correct c
1bcd0 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b 0a  onstraint check.
1bce0 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
1bcf0 28 69 6e 20 73 71 6c 69 74 65 33 47 65 6e 65 72  (in sqlite3Gener
1bd00 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65  ateConstraintChe
1bd10 63 6b 73 28 29 29 20 61 73 20 70 61 72 74 20 6f  cks()) as part o
1bd20 66 0a 20 20 2a 2a 20 55 50 44 41 54 45 20 61 6e  f.  ** UPDATE an
1bd30 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  d INSERT stateme
1bd40 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66  nts.  .  */.  if
1bd50 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
1bd60 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29  || pTblName==0 )
1bd70 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f  {.    if( onErro
1bd80 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c  r!=OE_Replace ||
1bd90 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30   pTab->pIndex==0
1bda0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61  .         || pTa
1bdb0 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  b->pIndex->onErr
1bdc0 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b  or==OE_Replace){
1bdd0 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
1bde0 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e  Next = pTab->pIn
1bdf0 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  dex;.      pTab-
1be00 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
1be10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1be20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72     Index *pOther
1be30 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
1be40 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f  .      while( pO
1be50 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70  ther->pNext && p
1be60 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e  Other->pNext->on
1be70 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
1be80 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74  e ){.        pOt
1be90 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  her = pOther->pN
1bea0 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
1beb0 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
1bec0 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74   = pOther->pNext
1bed0 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e  ;.      pOther->
1bee0 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a  pNext = pIndex;.
1bef0 20 20 20 20 7d 0a 20 20 20 20 70 52 65 74 20 3d      }.    pRet =
1bf00 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 49 6e   pIndex;.    pIn
1bf10 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  dex = 0;.  }..  
1bf20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f  /* Clean up befo
1bf30 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78  re exiting */.ex
1bf40 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a  it_create_index:
1bf50 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 20  .  if( pIndex ) 
1bf60 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49  freeIndex(db, pI
1bf70 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  ndex);.  sqlite3
1bf80 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
1bf90 50 49 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69  PIWhere);.  sqli
1bfa0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
1bfb0 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
1bfc0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
1bfd0 6c 65 74 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d  lete(db, pTblNam
1bfe0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
1bff0 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
1c000 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
1c010 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65  ../*.** Fill the
1c020 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b   Index.aiRowEst[
1c030 5d 20 61 72 72 61 79 20 77 69 74 68 20 64 65 66  ] array with def
1c040 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ault information
1c050 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a   - information.*
1c060 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77 68 65  * to be used whe
1c070 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75  n we have not ru
1c080 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f  n the ANALYZE co
1c090 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52  mmand..**.** aiR
1c0a0 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70  owEst[0] is supp
1c0b0 6f 73 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  osed to contain 
1c0c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
1c0d0 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e  ements in the in
1c0e0 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65  dex..** Since we
1c0f0 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75   do not know, gu
1c100 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20  ess 1 million.  
1c110 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61  aiRowEst[1] is a
1c120 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
1c130 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72  e.** number of r
1c140 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
1c150 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
1c160 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65  particular value
1c170 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   of the.** first
1c180 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
1c190 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b  ndex.  aiRowEst[
1c1a0 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  2] is an estimat
1c1b0 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a  e of the number.
1c1c0 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  ** of rows that 
1c1d0 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63  match any partic
1c1e0 75 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ular combination
1c1f0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 32 20   of the first 2 
1c200 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68  columns.** of th
1c210 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f  e index.  And so
1c220 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74   forth.  It must
1c230 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 63   always be the c
1c240 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20  ase that.*.**   
1c250 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74          aiRowEst
1c260 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d  [N]<=aiRowEst[N-
1c270 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  1].**           
1c280 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a  aiRowEst[N]>=1.*
1c290 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20  *.** Apart from 
1c2a0 74 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69  that, we have li
1c2b0 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65  ttle to go on be
1c2c0 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20  sides intuition 
1c2d0 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52  as to.** how aiR
1c2e0 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62  owEst[] should b
1c2f0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20  e initialized.  
1c300 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65  The numbers gene
1c310 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72  rated here.** ar
1c320 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63  e based on typic
1c330 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20  al values found 
1c340 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65  in actual indice
1c350 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1c360 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28  e3DefaultRowEst(
1c370 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
1c380 2f 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /*              
1c390 20 20 31 30 2c 20 20 39 2c 20 20 38 2c 20 20 37    10,  9,  8,  7
1c3a0 2c 20 20 36 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  ,  6 */.  LogEst
1c3b0 20 61 56 61 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20   aVal[] = { 33, 
1c3c0 33 32 2c 20 33 30 2c 20 32 38 2c 20 32 36 20 7d  32, 30, 28, 26 }
1c3d0 3b 0a 20 20 4c 6f 67 45 73 74 20 2a 61 20 3d 20  ;.  LogEst *a = 
1c3e0 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  pIdx->aiRowLogEs
1c3f0 74 3b 0a 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d  t;.  int nCopy =
1c400 20 4d 49 4e 28 41 72 72 61 79 53 69 7a 65 28 61   MIN(ArraySize(a
1c410 56 61 6c 29 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  Val), pIdx->nKey
1c420 43 6f 6c 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Col);.  int i;..
1c430 20 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72    /* Set the fir
1c440 73 74 20 65 6e 74 72 79 20 28 6e 75 6d 62 65 72  st entry (number
1c450 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
1c460 69 6e 64 65 78 29 20 74 6f 20 74 68 65 20 65 73  index) to the es
1c470 74 69 6d 61 74 65 64 20 0a 20 20 2a 2a 20 6e 75  timated .  ** nu
1c480 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
1c490 74 68 65 20 74 61 62 6c 65 2e 20 4f 72 20 31 30  the table. Or 10
1c4a0 2c 20 69 66 20 74 68 65 20 65 73 74 69 6d 61 74  , if the estimat
1c4b0 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ed number of row
1c4c0 73 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 74  s .  ** in the t
1c4d0 61 62 6c 65 20 69 73 20 6c 65 73 73 20 74 68 61  able is less tha
1c4e0 6e 20 74 68 61 74 2e 20 20 2a 2f 0a 20 20 61 5b  n that.  */.  a[
1c4f0 30 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  0] = pIdx->pTabl
1c500 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20  e->nRowLogEst;. 
1c510 20 69 66 28 20 61 5b 30 5d 3c 33 33 20 29 20 61   if( a[0]<33 ) a
1c520 5b 30 5d 20 3d 20 33 33 3b 20 20 20 20 20 20 20  [0] = 33;       
1c530 20 61 73 73 65 72 74 28 20 33 33 3d 3d 73 71 6c   assert( 33==sql
1c540 69 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20 29  ite3LogEst(10) )
1c550 3b 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65  ;..  /* Estimate
1c560 20 74 68 61 74 20 61 5b 31 5d 20 69 73 20 31 30   that a[1] is 10
1c570 2c 20 61 5b 32 5d 20 69 73 20 39 2c 20 61 5b 33  , a[2] is 9, a[3
1c580 5d 20 69 73 20 38 2c 20 61 5b 34 5d 20 69 73 20  ] is 8, a[4] is 
1c590 37 2c 20 61 5b 35 5d 20 69 73 0a 20 20 2a 2a 20  7, a[5] is.  ** 
1c5a0 36 20 61 6e 64 20 65 61 63 68 20 73 75 62 73 65  6 and each subse
1c5b0 71 75 65 6e 74 20 76 61 6c 75 65 20 28 69 66 20  quent value (if 
1c5c0 61 6e 79 29 20 69 73 20 35 2e 20 20 2a 2f 0a 20  any) is 5.  */. 
1c5d0 20 6d 65 6d 63 70 79 28 26 61 5b 31 5d 2c 20 61   memcpy(&a[1], a
1c5e0 56 61 6c 2c 20 6e 43 6f 70 79 2a 73 69 7a 65 6f  Val, nCopy*sizeo
1c5f0 66 28 4c 6f 67 45 73 74 29 29 3b 0a 20 20 66 6f  f(LogEst));.  fo
1c600 72 28 69 3d 6e 43 6f 70 79 2b 31 3b 20 69 3c 3d  r(i=nCopy+1; i<=
1c610 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69  pIdx->nKeyCol; i
1c620 2b 2b 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20  ++){.    a[i] = 
1c630 32 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  23;             
1c640 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 32         assert( 2
1c650 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  3==sqlite3LogEst
1c660 28 35 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  (5) );.  }..  as
1c670 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33  sert( 0==sqlite3
1c680 4c 6f 67 45 73 74 28 31 29 20 29 3b 0a 20 20 69  LogEst(1) );.  i
1c690 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78  f( IsUniqueIndex
1c6a0 28 70 49 64 78 29 20 29 20 61 5b 70 49 64 78 2d  (pIdx) ) a[pIdx-
1c6b0 3e 6e 4b 65 79 43 6f 6c 5d 20 3d 20 30 3b 0a 7d  >nKeyCol] = 0;.}
1c6c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1c6d0 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61  tine will drop a
1c6e0 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64  n existing named
1c6f0 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f   index.  This ro
1c700 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  utine.** impleme
1c710 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44  nts the DROP IND
1c720 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  EX statement..*/
1c730 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
1c740 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  pIndex(Parse *pP
1c750 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
1c760 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45 78 69 73  Name, int ifExis
1c770 74 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ts){.  Index *pI
1c780 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ndex;.  Vdbe *v;
1c790 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1c7a0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
1c7b0 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73 73 65 72  nt iDb;..  asser
1c7c0 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  t( pParse->nErr=
1c7d0 3d 30 20 29 3b 20 20 20 2f 2a 20 4e 65 76 65 72  =0 );   /* Never
1c7e0 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 72 69   called with pri
1c7f0 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  or errors */.  i
1c800 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
1c810 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
1c820 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1c830 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1c840 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
1c850 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
1c860 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
1c870 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
1c880 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1c890 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70  p_index;.  }.  p
1c8a0 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46  Index = sqlite3F
1c8b0 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61  indIndex(db, pNa
1c8c0 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  me->a[0].zName, 
1c8d0 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
1c8e0 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49  abase);.  if( pI
1c8f0 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ndex==0 ){.    i
1c900 66 28 20 21 69 66 45 78 69 73 74 73 20 29 7b 0a  f( !ifExists ){.
1c910 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1c920 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
1c930 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53  o such index: %S
1c940 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  ", pName, 0);.  
1c950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1c960 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1c970 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72  NamedSchema(pPar
1c980 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  se, pName->a[0].
1c990 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
1c9a0 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68  }.    pParse->ch
1c9b0 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
1c9c0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1c9d0 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  p_index;.  }.  i
1c9e0 66 28 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79  f( pIndex->idxTy
1c9f0 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59  pe!=SQLITE_IDXTY
1ca00 50 45 5f 41 50 50 44 45 46 20 29 7b 0a 20 20 20  PE_APPDEF ){.   
1ca10 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1ca20 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20  (pParse, "index 
1ca30 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1ca40 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22  UNIQUE ".      "
1ca50 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
1ca60 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74  onstraint cannot
1ca70 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29   be dropped", 0)
1ca80 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
1ca90 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
1caa0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
1cab0 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
1cac0 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
1cad0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
1cae0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
1caf0 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
1cb00 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
1cb10 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54  ROP_INDEX;.    T
1cb20 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
1cb30 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20  dex->pTable;.   
1cb40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1cb50 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
1cb60 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  zName;.    const
1cb70 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43   char *zTab = SC
1cb80 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b  HEMA_TABLE(iDb);
1cb90 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1cba0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1cbb0 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
1cbc0 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29   zTab, 0, zDb) )
1cbd0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
1cbe0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1cbf0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49    }.    if( !OMI
1cc00 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 20  T_TEMPDB && iDb 
1cc10 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  ) code = SQLITE_
1cc20 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  DROP_TEMP_INDEX;
1cc30 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1cc40 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1cc50 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e  , code, pIndex->
1cc60 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
1cc70 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
1cc80 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
1cc90 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
1cca0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
1ccb0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1ccc0 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78  remove the index
1ccd0 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61   and from the ma
1cce0 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ster table */.  
1ccf0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1cd00 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1cd10 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
1cd20 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
1cd30 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
1cd40 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
1cd50 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
1cd60 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45  arse,.       "DE
1cd70 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
1cd80 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 20 41 4e  WHERE name=%Q AN
1cd90 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c  D type='index'",
1cda0 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  .       db->aDb[
1cdb0 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
1cdc0 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70  MA_TABLE(iDb), p
1cdd0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20  Index->zName.   
1cde0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   );.    sqlite3C
1cdf0 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70  learStatTables(p
1ce00 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 64 78  Parse, iDb, "idx
1ce10 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ", pIndex->zName
1ce20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
1ce30 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
1ce40 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73  e, iDb);.    des
1ce50 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
1ce60 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75  rse, pIndex->tnu
1ce70 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  m, iDb);.    sql
1ce80 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1ce90 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20  , OP_DropIndex, 
1cea0 69 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65  iDb, 0, 0, pInde
1ceb0 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  x->zName, 0);.  
1cec0 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  }..exit_drop_ind
1ced0 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63  ex:.  sqlite3Src
1cee0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1cef0 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
1cf00 70 41 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e  pArray is a poin
1cf10 74 65 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20  ter to an array 
1cf20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 45 61 63 68  of objects. Each
1cf30 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a   object in the.*
1cf40 2a 20 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74  * array is szEnt
1cf50 72 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ry bytes in size
1cf60 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75  . This routine u
1cf70 73 65 73 20 73 71 6c 69 74 65 33 44 62 52 65 61  ses sqlite3DbRea
1cf80 6c 6c 6f 63 28 29 0a 2a 2a 20 74 6f 20 65 78 74  lloc().** to ext
1cf90 65 6e 64 20 74 68 65 20 61 72 72 61 79 20 73 6f  end the array so
1cfa0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73   that there is s
1cfb0 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20 6f  pace for a new o
1cfc0 62 6a 65 63 74 20 61 74 20 74 68 65 20 65 6e 64  bject at the end
1cfd0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
1cfe0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1cff0 6c 6c 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 63  lled, *pnEntry c
1d000 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 75 72 72  ontains the curr
1d010 65 6e 74 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74  ent size of.** t
1d020 68 65 20 61 72 72 61 79 20 28 69 6e 20 65 6e 74  he array (in ent
1d030 72 69 65 73 20 2d 20 73 6f 20 74 68 65 20 61 6c  ries - so the al
1d040 6c 6f 63 61 74 69 6f 6e 20 69 73 20 28 28 2a 70  location is ((*p
1d050 6e 45 6e 74 72 79 29 20 2a 20 73 7a 45 6e 74 72  nEntry) * szEntr
1d060 79 29 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20 74  y) bytes.** in t
1d070 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  otal)..**.** If 
1d080 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 69 73  the realloc() is
1d090 20 73 75 63 63 65 73 73 66 75 6c 20 28 69 2e 65   successful (i.e
1d0a0 2e 20 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64  . if no OOM cond
1d0b0 69 74 69 6f 6e 20 6f 63 63 75 72 73 29 2c 20 74  ition occurs), t
1d0c0 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 6c 6c 6f  he.** space allo
1d0d0 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 6e 65  cated for the ne
1d0e0 77 20 6f 62 6a 65 63 74 20 69 73 20 7a 65 72 6f  w object is zero
1d0f0 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 75 70 64  ed, *pnEntry upd
1d100 61 74 65 64 20 74 6f 0a 2a 2a 20 72 65 66 6c 65  ated to.** refle
1d110 63 74 20 74 68 65 20 6e 65 77 20 73 69 7a 65 20  ct the new size 
1d120 6f 66 20 74 68 65 20 61 72 72 61 79 20 61 6e 64  of the array and
1d130 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1d140 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
1d150 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 2a 70  .** returned. *p
1d160 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  Idx is set to th
1d170 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
1d180 65 77 20 61 72 72 61 79 20 65 6e 74 72 79 20 69  ew array entry i
1d190 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
1d1a0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
1d1b0 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 66   the realloc() f
1d1c0 61 69 6c 73 2c 20 2a 70 49 64 78 20 69 73 20 73  ails, *pIdx is s
1d1d0 65 74 20 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74  et to -1, *pnEnt
1d1e0 72 79 20 72 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e  ry remains.** un
1d1f0 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 63 6f  changed and a co
1d200 70 79 20 6f 66 20 70 41 72 72 61 79 20 72 65 74  py of pArray ret
1d210 75 72 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  urned..*/.void *
1d220 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
1d230 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20  cate(.  sqlite3 
1d240 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e  *db,      /* Con
1d250 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66  nection to notif
1d260 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  y of malloc fail
1d270 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  ures */.  void *
1d280 70 41 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41  pArray,     /* A
1d290 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e  rray of objects.
1d2a0 20 20 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c    Might be reall
1d2b0 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ocated */.  int 
1d2c0 73 7a 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a  szEntry,      /*
1d2d0 20 53 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62   Size of each ob
1d2e0 6a 65 63 74 20 69 6e 20 74 68 65 20 61 72 72 61  ject in the arra
1d2f0 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e  y */.  int *pnEn
1d300 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62  try,     /* Numb
1d310 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 63 75  er of objects cu
1d320 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a  rrently in use *
1d330 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78 20 20 20  /.  int *pIdx   
1d340 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
1d350 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 6e 65  he index of a ne
1d360 77 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29  w slot here */.)
1d370 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  {.  char *z;.  i
1d380 6e 74 20 6e 20 3d 20 2a 70 6e 45 6e 74 72 79 3b  nt n = *pnEntry;
1d390 0a 20 20 69 66 28 20 28 6e 20 26 20 28 6e 2d 31  .  if( (n & (n-1
1d3a0 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))==0 ){.    int
1d3b0 20 73 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f 20 31   sz = (n==0) ? 1
1d3c0 20 3a 20 32 2a 6e 3b 0a 20 20 20 20 76 6f 69 64   : 2*n;.    void
1d3d0 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
1d3e0 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41  DbRealloc(db, pA
1d3f0 72 72 61 79 2c 20 73 7a 2a 73 7a 45 6e 74 72 79  rray, sz*szEntry
1d400 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
1d410 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64  =0 ){.      *pId
1d420 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  x = -1;.      re
1d430 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20 20 20  turn pArray;.   
1d440 20 7d 0a 20 20 20 20 70 41 72 72 61 79 20 3d 20   }.    pArray = 
1d450 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  pNew;.  }.  z = 
1d460 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b 0a 20  (char*)pArray;. 
1d470 20 6d 65 6d 73 65 74 28 26 7a 5b 6e 20 2a 20 73   memset(&z[n * s
1d480 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e  zEntry], 0, szEn
1d490 74 72 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  try);.  *pIdx = 
1d4a0 6e 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b  n;.  ++*pnEntry;
1d4b0 0a 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79  .  return pArray
1d4c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
1d4d0 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
1d4e0 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c  to the given IdL
1d4f0 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
1d500 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20  ew IdList if.** 
1d510 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41  need be..**.** A
1d520 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72   new IdList is r
1d530 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
1d540 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   if malloc() fai
1d550 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73  ls..*/.IdList *s
1d560 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
1d570 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nd(sqlite3 *db, 
1d580 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  IdList *pList, T
1d590 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
1d5a0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
1d5b0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
1d5c0 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
1d5d0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
1d5e0 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a  zeof(IdList) );.
1d5f0 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
1d600 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
1d610 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71  .  pList->a = sq
1d620 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
1d630 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20  te(.      db,.  
1d640 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20      pList->a,.  
1d650 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74      sizeof(pList
1d660 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 26  ->a[0]),.      &
1d670 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20  pList->nId,.    
1d680 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20    &i.  );.  if( 
1d690 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  i<0 ){.    sqlit
1d6a0 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
1d6b0 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72  b, pList);.    r
1d6c0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1d6d0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1d6e0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1d6f0 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b  omToken(db, pTok
1d700 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  en);.  return pL
1d710 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ist;.}../*.** De
1d720 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a  lete an IdList..
1d730 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49  */.void sqlite3I
1d740 64 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  dListDelete(sqli
1d750 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
1d760 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
1d770 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1d780 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
1d790 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
1d7a0 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  Id; i++){.    sq
1d7b0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1d7c0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1d7d0 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
1d7e0 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
1d7f0 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  t->a);.  sqlite3
1d800 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
1d810 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
1d820 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  rn the index in 
1d830 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65  pList of the ide
1d840 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49  ntifier named zI
1d850 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a  d.  Return -1.**
1d860 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
1d870 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c  /.int sqlite3IdL
1d880 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20  istIndex(IdList 
1d890 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68  *pList, const ch
1d8a0 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
1d8b0 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
1d8c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  ==0 ) return -1;
1d8d0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
1d8e0 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
1d8f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1d900 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
1d910 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  i].zName, zName)
1d920 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
1d930 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
1d940 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64  .}../*.** Expand
1d950 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63   the space alloc
1d960 61 74 65 64 20 66 6f 72 20 74 68 65 20 67 69 76  ated for the giv
1d970 65 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63  en SrcList objec
1d980 74 20 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67  t by.** creating
1d990 20 6e 45 78 74 72 61 20 6e 65 77 20 73 6c 6f 74   nExtra new slot
1d9a0 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 69  s beginning at i
1d9b0 53 74 61 72 74 2e 20 20 69 53 74 61 72 74 20 69  Start.  iStart i
1d9c0 73 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a  s zero based..**
1d9d0 20 4e 65 77 20 73 6c 6f 74 73 20 61 72 65 20 7a   New slots are z
1d9e0 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  eroed..**.** For
1d9f0 20 65 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73   example, suppos
1da00 65 20 61 20 53 72 63 4c 69 73 74 20 69 6e 69 74  e a SrcList init
1da10 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74  ially contains t
1da20 77 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e  wo entries: A,B.
1da30 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20 33 20  .** To append 3 
1da40 6e 65 77 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f  new entries onto
1da50 20 74 68 65 20 65 6e 64 2c 20 64 6f 20 74 68 69   the end, do thi
1da60 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69  s:.**.**    sqli
1da70 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
1da80 65 28 64 62 2c 20 70 53 72 63 6c 69 73 74 2c 20  e(db, pSrclist, 
1da90 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74  3, 2);.**.** Aft
1daa0 65 72 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76  er the call abov
1dab0 65 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61  e it would conta
1dac0 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20  in:  A, B, nil, 
1dad0 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20  nil, nil..** If 
1dae0 74 68 65 20 69 53 74 61 72 74 20 61 72 67 75 6d  the iStart argum
1daf0 65 6e 74 20 68 61 64 20 62 65 65 6e 20 31 20 69  ent had been 1 i
1db00 6e 73 74 65 61 64 20 6f 66 20 32 2c 20 74 68 65  nstead of 2, the
1db10 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  n the result.** 
1db20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 3a  would have been:
1db30 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e    A, nil, nil, n
1db40 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65 70 65  il, B.  To prepe
1db50 6e 64 20 74 68 65 20 6e 65 77 20 73 6c 6f 74 73  nd the new slots
1db60 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61 72 74 20  ,.** the iStart 
1db70 76 61 6c 75 65 20 77 6f 75 6c 64 20 62 65 20 30  value would be 0
1db80 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 74 68  .  The result th
1db90 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20  en would.** be: 
1dba0 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41  nil, nil, nil, A
1dbb0 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  , B..**.** If a 
1dbc0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1dbd0 6e 20 66 61 69 6c 73 20 74 68 65 20 53 72 63 4c  n fails the SrcL
1dbe0 69 73 74 20 69 73 20 75 6e 63 68 61 6e 67 65 64  ist is unchanged
1dbf0 2e 20 20 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61  .  The.** db->ma
1dc00 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
1dc10 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74  will be set to t
1dc20 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  rue..*/.SrcList 
1dc30 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45  *sqlite3SrcListE
1dc40 6e 6c 61 72 67 65 28 0a 20 20 73 71 6c 69 74 65  nlarge(.  sqlite
1dc50 33 20 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a 20  3 *db,       /* 
1dc60 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
1dc70 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66  ion to notify of
1dc80 20 4f 4f 4d 20 65 72 72 6f 72 73 20 2a 2f 0a 20   OOM errors */. 
1dc90 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
1dca0 20 20 20 20 2f 2a 20 54 68 65 20 53 72 63 4c 69      /* The SrcLi
1dcb0 73 74 20 74 6f 20 62 65 20 65 6e 6c 61 72 67 65  st to be enlarge
1dcc0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  d */.  int nExtr
1dcd0 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  a,        /* Num
1dce0 62 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73  ber of new slots
1dcf0 20 74 6f 20 61 64 64 20 74 6f 20 70 53 72 63 2d   to add to pSrc-
1dd00 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53  >a[] */.  int iS
1dd10 74 61 72 74 20 20 20 20 20 20 20 20 20 2f 2a 20  tart         /* 
1dd20 49 6e 64 65 78 20 69 6e 20 70 53 72 63 2d 3e 61  Index in pSrc->a
1dd30 5b 5d 20 6f 66 20 66 69 72 73 74 20 6e 65 77 20  [] of first new 
1dd40 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  slot */.){.  int
1dd50 20 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79   i;..  /* Sanity
1dd60 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c   checking on cal
1dd70 6c 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  ling parameters 
1dd80 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  */.  assert( iSt
1dd90 61 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  art>=0 );.  asse
1dda0 72 74 28 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b  rt( nExtra>=1 );
1ddb0 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21  .  assert( pSrc!
1ddc0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1ddd0 69 53 74 61 72 74 3c 3d 70 53 72 63 2d 3e 6e 53  iStart<=pSrc->nS
1dde0 72 63 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  rc );..  /* Allo
1ddf0 63 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  cate additional 
1de00 73 70 61 63 65 20 69 66 20 6e 65 65 64 65 64 20  space if needed 
1de10 2a 2f 0a 20 20 69 66 28 20 28 75 33 32 29 70 53  */.  if( (u32)pS
1de20 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3e  rc->nSrc+nExtra>
1de30 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  pSrc->nAlloc ){.
1de40 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65      SrcList *pNe
1de50 77 3b 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f  w;.    int nAllo
1de60 63 20 3d 20 70 53 72 63 2d 3e 6e 53 72 63 2b 6e  c = pSrc->nSrc+n
1de70 45 78 74 72 61 3b 0a 20 20 20 20 69 6e 74 20 6e  Extra;.    int n
1de80 47 6f 74 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  Got;.    pNew = 
1de90 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1dea0 28 64 62 2c 20 70 53 72 63 2c 0a 20 20 20 20 20  (db, pSrc,.     
1deb0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
1dec0 28 2a 70 53 72 63 29 20 2b 20 28 6e 41 6c 6c 6f  (*pSrc) + (nAllo
1ded0 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 53 72 63  c-1)*sizeof(pSrc
1dee0 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  ->a[0]) );.    i
1def0 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
1df00 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
1df10 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1df20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 53 72        return pSr
1df30 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  c;.    }.    pSr
1df40 63 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 6e 47  c = pNew;.    nG
1df50 6f 74 20 3d 20 28 73 71 6c 69 74 65 33 44 62 4d  ot = (sqlite3DbM
1df60 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e  allocSize(db, pN
1df70 65 77 29 20 2d 20 73 69 7a 65 6f 66 28 2a 70 53  ew) - sizeof(*pS
1df80 72 63 29 29 2f 73 69 7a 65 6f 66 28 70 53 72 63  rc))/sizeof(pSrc
1df90 2d 3e 61 5b 30 5d 29 2b 31 3b 0a 20 20 20 20 70  ->a[0])+1;.    p
1dfa0 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 47  Src->nAlloc = nG
1dfb0 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f  ot;.  }..  /* Mo
1dfc0 76 65 20 65 78 69 73 74 69 6e 67 20 73 6c 6f 74  ve existing slot
1dfd0 73 20 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65  s that come afte
1dfe0 72 20 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65  r the newly inse
1dff0 72 74 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20  rted slots.  ** 
1e000 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79 20 2a  out of the way *
1e010 2f 0a 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e  /.  for(i=pSrc->
1e020 6e 53 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72  nSrc-1; i>=iStar
1e030 74 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72  t; i--){.    pSr
1e040 63 2d 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d  c->a[i+nExtra] =
1e050 20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d   pSrc->a[i];.  }
1e060 0a 20 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d  .  pSrc->nSrc +=
1e070 20 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a   nExtra;..  /* Z
1e080 65 72 6f 20 74 68 65 20 6e 65 77 6c 79 20 61 6c  ero the newly al
1e090 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20 2a 2f  located slots */
1e0a0 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 72 63 2d  .  memset(&pSrc-
1e0b0 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 73  >a[iStart], 0, s
1e0c0 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d  izeof(pSrc->a[0]
1e0d0 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66 6f 72  )*nExtra);.  for
1e0e0 28 69 3d 69 53 74 61 72 74 3b 20 69 3c 69 53 74  (i=iStart; i<iSt
1e0f0 61 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b 2b 29  art+nExtra; i++)
1e100 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d  {.    pSrc->a[i]
1e110 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  .iCursor = -1;. 
1e120 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20   }..  /* Return 
1e130 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1e140 20 65 6e 6c 61 72 67 65 64 20 53 72 63 4c 69 73   enlarged SrcLis
1e150 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 53  t */.  return pS
1e160 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70  rc;.}.../*.** Ap
1e170 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65  pend a new table
1e180 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76   name to the giv
1e190 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65  en SrcList.  Cre
1e1a0 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73  ate a new SrcLis
1e1b0 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e  t if.** need be.
1e1c0 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73    A new entry is
1e1d0 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
1e1e0 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20  SrcList even if 
1e1f0 70 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a  pTable is NULL..
1e200 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73 74 20  **.** A SrcList 
1e210 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
1e220 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73  NULL if there is
1e230 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20   an OOM error.  
1e240 54 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  The returned.** 
1e250 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20 62 65  SrcList might be
1e260 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
1e270 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 77 61   SrcList that wa
1e280 73 20 69 6e 70 75 74 20 6f 72 20 69 74 20 6d 69  s input or it mi
1e290 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e 65 77 20  ght be.** a new 
1e2a0 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f 4f 4d 20  one.  If an OOM 
1e2b0 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72  error does occur
1e2c0 73 2c 20 74 68 65 6e 20 74 68 65 20 70 72 69 6f  s, then the prio
1e2d0 72 20 76 61 6c 75 65 20 6f 66 20 70 4c 69 73 74  r value of pList
1e2e0 0a 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 70 75  .** that is inpu
1e2f0 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  t to this routin
1e300 65 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  e is automatical
1e310 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ly freed..**.** 
1e320 49 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20  If pDatabase is 
1e330 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61  not null, it mea
1e340 6e 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  ns that the tabl
1e350 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61  e has an optiona
1e360 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61  l.** database na
1e370 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65  me prefix.  Like
1e380 20 74 68 69 73 3a 20 20 22 64 61 74 61 62 61 73   this:  "databas
1e390 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70  e.table".  The p
1e3a0 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e  Database.** poin
1e3b0 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ts to the table 
1e3c0 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61  name and the pTa
1e3d0 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ble points to th
1e3e0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e  e database name.
1e3f0 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e  .** The SrcList.
1e400 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20  a[].zName field 
1e410 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  is filled with t
1e420 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68  he table name wh
1e430 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d  ich might.** com
1e440 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69  e from pTable (i
1e450 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e  f pDatabase is N
1e460 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61  ULL) or from pDa
1e470 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63  tabase.  .** Src
1e480 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61  List.a[].zDataba
1e490 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  se is filled wit
1e4a0 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  h the database n
1e4b0 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c  ame from pTable,
1e4c0 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c  .** or with NULL
1e4d0 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20   if no database 
1e4e0 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  is specified..**
1e4f0 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
1e500 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65  ds, if call like
1e510 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1e520 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
1e530 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c  istAppend(D,A,B,
1e540 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42  0);.**.** Then B
1e550 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65   is a table name
1e560 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
1e570 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63  e name is unspec
1e580 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65  ified.  If calle
1e590 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a  d.** like this:.
1e5a0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
1e5b0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1e5c0 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a  nd(D,A,B,C);.**.
1e5d0 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68 65  ** Then C is the
1e5e0 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
1e5f0 42 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73  B is the databas
1e600 65 20 6e 61 6d 65 2e 20 20 49 66 20 43 20 69 73  e name.  If C is
1e610 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74 68 65 6e   defined.** then
1e620 20 73 6f 20 69 73 20 42 2e 20 20 49 6e 20 6f 74   so is B.  In ot
1e630 68 65 72 20 77 6f 72 64 73 2c 20 77 65 20 6e 65  her words, we ne
1e640 76 65 72 20 68 61 76 65 20 61 20 63 61 73 65 20  ver have a case 
1e650 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  where:.**.**    
1e660 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
1e670 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 30 2c  istAppend(D,A,0,
1e680 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70  C);.**.** Both p
1e690 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62  Table and pDatab
1e6a0 61 73 65 20 61 72 65 20 61 73 73 75 6d 65 64 20  ase are assumed 
1e6b0 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20 20 54  to be quoted.  T
1e6c0 68 65 79 20 61 72 65 20 64 65 71 75 6f 74 65 64  hey are dequoted
1e6d0 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65 69 6e 67  .** before being
1e6e0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 53 72   added to the Sr
1e6f0 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73  cList..*/.SrcLis
1e700 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
1e710 74 41 70 70 65 6e 64 28 0a 20 20 73 71 6c 69 74  tAppend(.  sqlit
1e720 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f  e3 *db,        /
1e730 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  * Connection to 
1e740 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63  notify of malloc
1e750 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 53   failures */.  S
1e760 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  rcList *pList,  
1e770 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20     /* Append to 
1e780 74 68 69 73 20 53 72 63 4c 69 73 74 2e 20 4e 55  this SrcList. NU
1e790 4c 4c 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  LL creates a new
1e7a0 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f   SrcList */.  To
1e7b0 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20  ken *pTable,    
1e7c0 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61 70    /* Table to ap
1e7d0 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  pend */.  Token 
1e7e0 2a 70 44 61 74 61 62 61 73 65 20 20 20 20 2f 2a  *pDatabase    /*
1e7f0 20 44 61 74 61 62 61 73 65 20 6f 66 20 74 68 65   Database of the
1e800 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73   table */.){.  s
1e810 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1e820 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73  em *pItem;.  ass
1e830 65 72 74 28 20 70 44 61 74 61 62 61 73 65 3d 3d  ert( pDatabase==
1e840 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d 30 20 29  0 || pTable!=0 )
1e850 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 76  ;  /* Cannot hav
1e860 65 20 43 20 77 69 74 68 6f 75 74 20 42 20 2a 2f  e C without B */
1e870 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1e880 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
1e890 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1e8a0 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 53 72  ro(db, sizeof(Sr
1e8b0 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  cList) );.    if
1e8c0 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
1e8d0 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
1e8e0 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20  ->nAlloc = 1;.  
1e8f0 7d 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  }.  pList = sqli
1e900 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
1e910 65 28 64 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20  e(db, pList, 1, 
1e920 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20  pList->nSrc);.  
1e930 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1e940 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
1e950 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1e960 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  (db, pList);.   
1e970 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1e980 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
1e990 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31  >a[pList->nSrc-1
1e9a0 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61  ];.  if( pDataba
1e9b0 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d  se && pDatabase-
1e9c0 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61  >z==0 ){.    pDa
1e9d0 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a  tabase = 0;.  }.
1e9e0 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
1e9f0 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  ){.    Token *pT
1ea00 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b  emp = pDatabase;
1ea10 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
1ea20 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61   pTable;.    pTa
1ea30 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d  ble = pTemp;.  }
1ea40 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  .  pItem->zName 
1ea50 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1ea60 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c  mToken(db, pTabl
1ea70 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61  e);.  pItem->zDa
1ea80 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33  tabase = sqlite3
1ea90 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1eaa0 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20  , pDatabase);.  
1eab0 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
1eac0 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56 64  ./*.** Assign Vd
1ead0 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78 20 6e  beCursor index n
1eae0 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20 74 61  umbers to all ta
1eaf0 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73  bles in a SrcLis
1eb00 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.*/.void sqlite
1eb10 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
1eb20 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61  rsors(Parse *pPa
1eb30 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c  rse, SrcList *pL
1eb40 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
1eb50 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1eb60 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61  item *pItem;.  a
1eb70 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 70  ssert(pList || p
1eb80 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1eb90 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
1eba0 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
1ebb0 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(i=0, pItem=pLi
1ebc0 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e  st->a; i<pList->
1ebd0 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
1ebe0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
1ebf0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30  Item->iCursor>=0
1ec00 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1ec10 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  pItem->iCursor =
1ec20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
1ec30 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
1ec40 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
1ec50 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
1ec60 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
1ec70 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
1ec80 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a  pSelect->pSrc);.
1ec90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1eca0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
1ecb0 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c  e an entire SrcL
1ecc0 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c  ist including al
1ecd0 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75  l its substructu
1ece0 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  re..*/.void sqli
1ecf0 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1ed00 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72  (sqlite3 *db, Sr
1ed10 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
1ed20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1ed30 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1ed40 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
1ed50 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1ed60 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
1ed70 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
1ed80 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
1ed90 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
1eda0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1edb0 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
1edc0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1edd0 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e  ee(db, pItem->zN
1ede0 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
1edf0 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
1ee00 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
1ee10 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  if( pItem->fg.is
1ee20 49 6e 64 65 78 65 64 42 79 20 29 20 73 71 6c 69  IndexedBy ) sqli
1ee30 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1ee40 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  tem->u1.zIndexed
1ee50 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  By);.    if( pIt
1ee60 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
1ee70 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   ) sqlite3ExprLi
1ee80 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  stDelete(db, pIt
1ee90 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 29  em->u1.pFuncArg)
1eea0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  ;.    sqlite3Del
1eeb0 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 49 74  eteTable(db, pIt
1eec0 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73  em->pTab);.    s
1eed0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
1eee0 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53  te(db, pItem->pS
1eef0 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69  elect);.    sqli
1ef00 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1ef10 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20  , pItem->pOn);. 
1ef20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
1ef30 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
1ef40 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20  ->pUsing);.  }. 
1ef50 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1ef60 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  b, pList);.}../*
1ef70 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1ef80 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
1ef90 65 20 70 61 72 73 65 72 20 74 6f 20 61 64 64 20  e parser to add 
1efa0 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68  a new term to th
1efb0 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20 67 72  e.** end of a gr
1efc0 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73  owing FROM claus
1efd0 65 2e 20 20 54 68 65 20 22 70 22 20 70 61 72 61  e.  The "p" para
1efe0 6d 65 74 65 72 20 69 73 20 74 68 65 20 70 61 72  meter is the par
1eff0 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d  t of.** the FROM
1f000 20 63 6c 61 75 73 65 20 74 68 61 74 20 68 61 73   clause that has
1f010 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f   already been co
1f020 6e 73 74 72 75 63 74 65 64 2e 20 20 22 70 22 20  nstructed.  "p" 
1f030 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68  is NULL.** if th
1f040 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
1f050 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d  term of the FROM
1f060 20 63 6c 61 75 73 65 2e 20 20 70 54 61 62 6c 65   clause.  pTable
1f070 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 0a 2a   and pDatabase.*
1f080 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65 20 6f  * are the name o
1f090 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  f the table and 
1f0a0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20 69  database named i
1f0b0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1f0c0 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61  e term..** pData
1f0d0 62 61 73 65 20 69 73 20 4e 55 4c 4c 20 69 66 20  base is NULL if 
1f0e0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1f0f0 65 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6d  e qualifier is m
1f100 69 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20  issing - the.** 
1f110 75 73 75 61 6c 20 63 61 73 65 2e 20 20 49 66 20  usual case.  If 
1f120 74 68 65 20 74 65 72 6d 20 68 61 73 20 61 6e 20  the term has an 
1f130 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41 6c 69  alias, then pAli
1f140 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  as points to the
1f150 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e  .** alias token.
1f160 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 69 73    If the term is
1f170 20 61 20 73 75 62 71 75 65 72 79 2c 20 74 68 65   a subquery, the
1f180 6e 20 70 53 75 62 71 75 65 72 79 20 69 73 20 74  n pSubquery is t
1f190 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  he.** SELECT sta
1f1a0 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20  tement that the 
1f1b0 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64 65 73  subquery encodes
1f1c0 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20 61 6e  .  The pTable an
1f1d0 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 70  d.** pDatabase p
1f1e0 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 4e 55  arameters are NU
1f1f0 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72 69 65  LL for subquerie
1f200 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e 64 20  s.  The pOn and 
1f210 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65  pUsing.** parame
1f220 74 65 72 73 20 61 72 65 20 74 68 65 20 63 6f 6e  ters are the con
1f230 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e 20 61  tent of the ON a
1f240 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
1f250 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
1f260 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77 68 69   new SrcList whi
1f270 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20 74 68  ch encodes is th
1f280 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68 65 20  e FROM with the 
1f290 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65  new.** term adde
1f2a0 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  d..*/.SrcList *s
1f2b0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
1f2c0 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50  endFromTerm(.  P
1f2d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1f2e0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
1f2f0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
1f300 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20 20 20  rcList *p,      
1f310 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65         /* The le
1f320 66 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 46  ft part of the F
1f330 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72 65 61  ROM clause alrea
1f340 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b  dy seen */.  Tok
1f350 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20  en *pTable,     
1f360 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1f370 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61 64 64  the table to add
1f380 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   to the FROM cla
1f390 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  use */.  Token *
1f3a0 70 44 61 74 61 62 61 73 65 2c 20 20 20 20 20 20  pDatabase,      
1f3b0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1f3c0 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
1f3d0 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20  ing pTable */.  
1f3e0 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20  Token *pAlias,  
1f3f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
1f400 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
1f410 66 20 74 68 65 20 41 53 20 73 75 62 65 78 70 72  f the AS subexpr
1f420 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65  ession */.  Sele
1f430 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c 20 20  ct *pSubquery,  
1f440 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75 65 72      /* A subquer
1f450 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20  y used in place 
1f460 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20  of a table name 
1f470 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20  */.  Expr *pOn, 
1f480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f490 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66  The ON clause of
1f4a0 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c   a join */.  IdL
1f4b0 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20 20 20  ist *pUsing     
1f4c0 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53 49 4e       /* The USIN
1f4d0 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f  G clause of a jo
1f4e0 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  in */.){.  struc
1f4f0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1f500 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
1f510 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1f520 62 3b 0a 20 20 69 66 28 20 21 70 20 26 26 20 28  b;.  if( !p && (
1f530 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29 20 29  pOn || pUsing) )
1f540 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
1f550 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
1f560 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69 73 20   JOIN clause is 
1f570 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20  required before 
1f580 25 73 22 2c 20 0a 20 20 20 20 20 20 28 70 4f 6e  %s", .      (pOn
1f590 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49 4e 47   ? "ON" : "USING
1f5a0 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 67 6f  ").    );.    go
1f5b0 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65  to append_from_e
1f5c0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  rror;.  }.  p = 
1f5d0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1f5e0 70 65 6e 64 28 64 62 2c 20 70 2c 20 70 54 61 62  pend(db, p, pTab
1f5f0 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a  le, pDatabase);.
1f600 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45    if( p==0 || NE
1f610 56 45 52 28 70 2d 3e 6e 53 72 63 3d 3d 30 29 20  VER(p->nSrc==0) 
1f620 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65  ){.    goto appe
1f630 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20  nd_from_error;. 
1f640 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d   }.  pItem = &p-
1f650 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20  >a[p->nSrc-1];. 
1f660 20 61 73 73 65 72 74 28 20 70 41 6c 69 61 73 21   assert( pAlias!
1f670 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 41 6c 69  =0 );.  if( pAli
1f680 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74  as->n ){.    pIt
1f690 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c  em->zAlias = sql
1f6a0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1f6b0 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20  n(db, pAlias);. 
1f6c0 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c   }.  pItem->pSel
1f6d0 65 63 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b  ect = pSubquery;
1f6e0 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20  .  pItem->pOn = 
1f6f0 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55  pOn;.  pItem->pU
1f700 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20  sing = pUsing;. 
1f710 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70   return p;.. app
1f720 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a  end_from_error:.
1f730 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29    assert( p==0 )
1f740 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
1f750 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a  elete(db, pOn);.
1f760 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
1f770 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69 6e 67  elete(db, pUsing
1f780 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
1f790 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75  ctDelete(db, pSu
1f7a0 62 71 75 65 72 79 29 3b 0a 20 20 72 65 74 75 72  bquery);.  retur
1f7b0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n 0;.}../*.** Ad
1f7c0 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  d an INDEXED BY 
1f7d0 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63  or NOT INDEXED c
1f7e0 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d 6f 73  lause to the mos
1f7f0 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
1f800 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20   .** element of 
1f810 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20  the source-list 
1f820 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
1f830 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
1f840 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
1f850 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 50  cListIndexedBy(P
1f860 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
1f870 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20  cList *p, Token 
1f880 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a 20 20  *pIndexedBy){.  
1f890 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 65 64  assert( pIndexed
1f8a0 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  By!=0 );.  if( p
1f8b0 20 26 26 20 41 4c 57 41 59 53 28 70 2d 3e 6e 53   && ALWAYS(p->nS
1f8c0 72 63 3e 30 29 20 29 7b 0a 20 20 20 20 73 74 72  rc>0) ){.    str
1f8d0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1f8e0 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b   *pItem = &p->a[
1f8f0 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20  p->nSrc-1];.    
1f900 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66  assert( pItem->f
1f910 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20  g.notIndexed==0 
1f920 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1f930 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
1f940 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61  edBy==0 );.    a
1f950 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
1f960 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b  .isTabFunc==0 );
1f970 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 65  .    if( pIndexe
1f980 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49  dBy->n==1 && !pI
1f990 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20  ndexedBy->z ){. 
1f9a0 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49       /* A "NOT I
1f9b0 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65 20 77  NDEXED" clause w
1f9c0 61 73 20 73 75 70 70 6c 69 65 64 2e 20 53 65 65  as supplied. See
1f9d0 20 70 61 72 73 65 2e 79 20 0a 20 20 20 20 20 20   parse.y .      
1f9e0 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 22 69 6e  ** construct "in
1f9f0 64 65 78 65 64 5f 6f 70 74 22 20 66 6f 72 20 64  dexed_opt" for d
1fa00 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20  etails. */.     
1fa10 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e   pItem->fg.notIn
1fa20 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  dexed = 1;.    }
1fa30 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
1fa40 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
1fa50 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1fa60 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
1fa70 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79 29 3b  db, pIndexedBy);
1fa80 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  .      pItem->fg
1fa90 2e 69 73 49 6e 64 65 78 65 64 42 79 20 3d 20 28  .isIndexedBy = (
1faa0 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  pItem->u1.zIndex
1fab0 65 64 42 79 21 3d 30 29 3b 0a 20 20 20 20 7d 0a  edBy!=0);.    }.
1fac0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
1fad0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66 75 6e   the list of fun
1fae0 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
1faf0 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74 20 65  to the SrcList e
1fb00 6e 74 72 79 20 66 6f 72 20 61 0a 2a 2a 20 74 61  ntry for a.** ta
1fb10 62 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74  ble-valued-funct
1fb20 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
1fb30 69 74 65 33 53 72 63 4c 69 73 74 46 75 6e 63 41  ite3SrcListFuncA
1fb40 72 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  rgs(Parse *pPars
1fb50 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 45  e, SrcList *p, E
1fb60 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
1fb70 0a 20 20 69 66 28 20 70 20 26 26 20 70 4c 69 73  .  if( p && pLis
1fb80 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  t ){.    struct 
1fb90 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1fba0 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e  tem = &p->a[p->n
1fbb0 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  Src-1];.    asse
1fbc0 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f  rt( pItem->fg.no
1fbd0 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a 20  tIndexed==0 );. 
1fbe0 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
1fbf0 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
1fc00 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
1fc10 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54  t( pItem->fg.isT
1fc20 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  abFunc==0 );.   
1fc30 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63   pItem->u1.pFunc
1fc40 41 72 67 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20  Arg = pList;.   
1fc50 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62   pItem->fg.isTab
1fc60 46 75 6e 63 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  Func = 1;.  }els
1fc70 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
1fc80 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
1fc90 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b  rse->db, pList);
1fca0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  .  }.}../*.** Wh
1fcb0 65 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61  en building up a
1fcc0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20   FROM clause in 
1fcd0 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 20  the parser, the 
1fce0 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  join operator.**
1fcf0 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74   is initially at
1fd00 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65  tached to the le
1fd10 66 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74  ft operand.  But
1fd20 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
1fd30 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74  tor.** expects t
1fd40 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
1fd50 20 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69   to be on the ri
1fd60 67 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68  ght operand.  Th
1fd70 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68  is routine.** Sh
1fd80 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70  ifts all join op
1fd90 65 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66  erators from lef
1fda0 74 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61  t to right for a
1fdb0 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a  n entire FROM.**
1fdc0 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45   clause..**.** E
1fdd0 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20  xample: Suppose 
1fde0 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65  the join is like
1fdf0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1fe00 20 20 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c         A natural
1fe10 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a   cross join B.**
1fe20 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72  .** The operator
1fe30 20 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f   is "natural cro
1fe40 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41  ss join".  The A
1fe50 20 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20   and B operands 
1fe60 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  are stored.** in
1fe70 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e   p->a[0] and p->
1fe80 61 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65  a[1], respective
1fe90 6c 79 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  ly.  The parser 
1fea0 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73  initially stores
1feb0 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72   the.** operator
1fec0 20 77 69 74 68 20 41 2e 20 20 54 68 69 73 20 72   with A.  This r
1fed0 6f 75 74 69 6e 65 20 73 68 69 66 74 73 20 74 68  outine shifts th
1fee0 61 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72  at operator over
1fef0 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73   to B..*/.void s
1ff00 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68 69  qlite3SrcListShi
1ff10 66 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69  ftJoinType(SrcLi
1ff20 73 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  st *p){.  if( p 
1ff30 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
1ff40 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d    for(i=p->nSrc-
1ff50 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
1ff60 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 66 67 2e 6a      p->a[i].fg.j
1ff70 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69  ointype = p->a[i
1ff80 2d 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b  -1].fg.jointype;
1ff90 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b  .    }.    p->a[
1ffa0 30 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d  0].fg.jointype =
1ffb0 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
1ffc0 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63   Begin a transac
1ffd0 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
1ffe0 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63  ite3BeginTransac
1fff0 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
20000 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20  se, int type){. 
20010 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
20020 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69  Vdbe *v;.  int i
20030 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
20040 72 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d  rse!=0 );.  db =
20050 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
20060 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
20070 2f 2a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b  /*  if( db->aDb[
20080 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75  0].pBt==0 ) retu
20090 72 6e 3b 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  rn; */.  if( sql
200a0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
200b0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
200c0 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e  NSACTION, "BEGIN
200d0 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  ", 0, 0) ){.    
200e0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20  return;.  }.  v 
200f0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
20100 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
20110 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  !v ) return;.  i
20120 66 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45  f( type!=TK_DEFE
20130 52 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28  RRED ){.    for(
20140 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
20150 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
20160 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20170 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
20180 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58   i, (type==TK_EX
20190 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20  CLUSIVE)+1);.   
201a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
201b0 65 73 42 74 72 65 65 28 76 2c 20 69 29 3b 0a 20  esBtree(v, i);. 
201c0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
201d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
201e0 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30  OP_AutoCommit, 0
201f0 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  , 0);.}../*.** C
20200 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74  ommit a transact
20210 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
20220 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63  te3CommitTransac
20230 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
20240 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  se){.  Vdbe *v;.
20250 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
20260 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
20270 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20  ( pParse->db!=0 
20280 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
20290 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
202a0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
202b0 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  TION, "COMMIT", 
202c0 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74  0, 0) ){.    ret
202d0 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73  urn;.  }.  v = s
202e0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
202f0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
20300 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
20310 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75  eAddOp2(v, OP_Au
20320 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b  toCommit, 1, 0);
20330 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  .  }.}../*.** Ro
20340 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
20350 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
20360 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e  ite3RollbackTran
20370 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
20380 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
20390 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  v;..  assert( pP
203a0 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  arse!=0 );.  ass
203b0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21  ert( pParse->db!
203c0 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  =0 );.  if( sqli
203d0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
203e0 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
203f0 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41  SACTION, "ROLLBA
20400 43 4b 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  CK", 0, 0) ){.  
20410 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
20420 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
20430 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
20440 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
20450 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
20460 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
20470 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 1);.  }.}../*.
20480 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
20490 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
204a0 65 20 70 61 72 73 65 72 20 77 68 65 6e 20 69 74  e parser when it
204b0 20 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e   parses a comman
204c0 64 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20  d to create,.** 
204d0 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
204e0 61 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70  ack an SQL savep
204f0 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  oint. .*/.void s
20500 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28  qlite3Savepoint(
20510 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
20520 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e  nt op, Token *pN
20530 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
20540 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
20550 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
20560 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  e->db, pName);. 
20570 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
20580 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
20590 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
205a0 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
205b0 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
205c0 41 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63  ATION.    static
205d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f   const char * co
205e0 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45  nst az[] = { "BE
205f0 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c  GIN", "RELEASE",
20600 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20   "ROLLBACK" };. 
20610 20 20 20 61 73 73 65 72 74 28 20 21 53 41 56 45     assert( !SAVE
20620 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53  POINT_BEGIN && S
20630 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
20640 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54  ==1 && SAVEPOINT
20650 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a  _ROLLBACK==2 );.
20660 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21  #endif.    if( !
20670 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68  v || sqlite3Auth
20680 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
20690 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20  LITE_SAVEPOINT, 
206a0 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30  az[op], zName, 0
206b0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
206c0 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
206d0 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  >db, zName);.   
206e0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
206f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
20700 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76  AddOp4(v, OP_Sav
20710 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30  epoint, op, 0, 0
20720 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41  , zName, P4_DYNA
20730 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  MIC);.  }.}../*.
20740 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
20750 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69   TEMP database i
20760 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c  s open and avail
20770 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52  able for use.  R
20780 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d  eturn.** the num
20790 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
207a0 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20  Leave any error 
207b0 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20  messages in the 
207c0 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
207d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
207e0 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65  OpenTempDatabase
207f0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
20800 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
20810 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
20820 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  f( db->aDb[1].pB
20830 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d  t==0 && !pParse-
20840 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
20850 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72 65  int rc;.    Btre
20860 65 20 2a 70 42 74 3b 0a 20 20 20 20 73 74 61 74  e *pBt;.    stat
20870 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61  ic const int fla
20880 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  gs = .          
20890 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
208a0 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20  WRITE |.        
208b0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
208c0 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  EATE |.         
208d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
208e0 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20  LUSIVE |.       
208f0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
20900 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20  ELETEONCLOSE |. 
20910 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
20920 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20  OPEN_TEMP_DB;.. 
20930 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
20940 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66  treeOpen(db->pVf
20950 73 2c 20 30 2c 20 64 62 2c 20 26 70 42 74 2c 20  s, 0, db, &pBt, 
20960 30 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69  0, flags);.    i
20970 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20980 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
20990 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
209a0 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  , "unable to ope
209b0 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61  n a temporary da
209c0 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20  tabase ".       
209d0 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69   "file for stori
209e0 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ng temporary tab
209f0 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61  les");.      pPa
20a00 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
20a10 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
20a20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b    }.    db->aDb[
20a30 31 5d 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  1].pBt = pBt;.  
20a40 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
20a50 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a  b[1].pSchema );.
20a60 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e      if( SQLITE_N
20a70 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72  OMEM==sqlite3Btr
20a80 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 42  eeSetPageSize(pB
20a90 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73  t, db->nextPages
20aa0 69 7a 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20  ize, -1, 0) ){. 
20ab0 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46       db->mallocF
20ac0 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  ailed = 1;.     
20ad0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
20ae0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
20af0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64  .}../*.** Record
20b00 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
20b10 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
20b20 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65   will need to be
20b30 20 76 65 72 69 66 69 65 64 0a 2a 2a 20 66 6f 72   verified.** for
20b40 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20 20   database iDb.  
20b50 54 68 65 20 63 6f 64 65 20 74 6f 20 61 63 74 75  The code to actu
20b60 61 6c 6c 79 20 76 65 72 69 66 79 20 74 68 65 20  ally verify the 
20b70 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a  schema cookie.**
20b80 20 77 69 6c 6c 20 6f 63 63 75 72 20 61 74 20 74   will occur at t
20b90 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74 6f  he end of the to
20ba0 70 2d 6c 65 76 65 6c 20 56 44 42 45 20 61 6e 64  p-level VDBE and
20bb0 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74   will be generat
20bc0 65 64 0a 2a 2a 20 6c 61 74 65 72 2c 20 62 79 20  ed.** later, by 
20bd0 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64  sqlite3FinishCod
20be0 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ing()..*/.void s
20bf0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
20c00 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50  Schema(Parse *pP
20c10 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
20c20 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
20c30 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
20c40 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
20c50 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  );.  sqlite3 *db
20c60 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 64 62   = pToplevel->db
20c70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  ;..  assert( iDb
20c80 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
20c90 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
20ca0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
20cb0 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b  !=0 || iDb==1 );
20cc0 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 53  .  assert( iDb<S
20cd0 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
20ce0 45 44 2b 32 20 29 3b 0a 20 20 61 73 73 65 72 74  ED+2 );.  assert
20cf0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
20d00 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
20d10 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 44 62  , 0) );.  if( Db
20d20 4d 61 73 6b 54 65 73 74 28 70 54 6f 70 6c 65 76  MaskTest(pToplev
20d30 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20  el->cookieMask, 
20d40 69 44 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 44  iDb)==0 ){.    D
20d50 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c 65 76  bMaskSet(pToplev
20d60 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20  el->cookieMask, 
20d70 69 44 62 29 3b 0a 20 20 20 20 70 54 6f 70 6c 65  iDb);.    pTople
20d80 76 65 6c 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65  vel->cookieValue
20d90 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b  [iDb] = db->aDb[
20da0 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63  iDb].pSchema->sc
20db0 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20  hema_cookie;.   
20dc0 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
20dd0 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
20de0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
20df0 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 54 6f  TempDatabase(pTo
20e00 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  plevel);.    }. 
20e10 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61   }.}../*.** If a
20e20 72 67 75 6d 65 6e 74 20 7a 44 62 20 69 73 20 4e  rgument zDb is N
20e30 55 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20 73  ULL, then call s
20e40 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
20e50 53 63 68 65 6d 61 28 29 20 66 6f 72 20 65 61 63  Schema() for eac
20e60 68 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64  h .** attached d
20e70 61 74 61 62 61 73 65 2e 20 4f 74 68 65 72 77 69  atabase. Otherwi
20e80 73 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66 6f  se, invoke it fo
20e90 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  r the database n
20ea0 61 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a  amed zDb only..*
20eb0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
20ec0 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68  deVerifyNamedSch
20ed0 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  ema(Parse *pPars
20ee0 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
20ef0 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Db){.  sqlite3 *
20f00 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
20f10 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
20f20 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
20f30 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44  i++){.    Db *pD
20f40 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
20f50 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
20f60 74 20 26 26 20 28 21 7a 44 62 20 7c 7c 20 30 3d  t && (!zDb || 0=
20f70 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
20f80 7a 44 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29  zDb, pDb->zName)
20f90 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
20fa0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
20fb0 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20  ma(pParse, i);. 
20fc0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
20fd0 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
20fe0 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72  code that prepar
20ff0 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20  es for doing an 
21000 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a  operation that.*
21010 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  * might change t
21020 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
21030 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
21040 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61  starts a new tra
21050 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61  nsaction if we a
21060 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77  re not already w
21070 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73  ithin.** a trans
21080 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61  action.  If we a
21090 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  re already withi
210a0 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  n a transaction,
210b0 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69   then a checkpoi
210c0 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20  nt.** is set if 
210d0 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74  the setStatement
210e0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72   parameter is tr
210f0 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e  ue.  A checkpoin
21100 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73  t should.** be s
21110 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e  et for operation
21120 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69  s that might fai
21130 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73  l (due to a cons
21140 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a  traint) part of.
21150 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75  ** the way throu
21160 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c  gh and which wil
21170 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73  l need to undo s
21180 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f  ome writes witho
21190 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20  ut having to.** 
211a0 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f  rollback the who
211b0 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  le transaction. 
211c0 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20   For operations 
211d0 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72  where all constr
211e0 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20  aints.** can be 
211f0 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61  checked before a
21200 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  ny changes are m
21210 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ade to the datab
21220 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72  ase, it is never
21230 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f  .** necessary to
21240 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e   undo a write an
21250 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  d the checkpoint
21260 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73   should not be s
21270 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
21280 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
21290 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  ration(Parse *pP
212a0 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74 61  arse, int setSta
212b0 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62 29  tement, int iDb)
212c0 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c  {.  Parse *pTopl
212d0 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
212e0 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
212f0 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  se);.  sqlite3Co
21300 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
21310 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 44  Parse, iDb);.  D
21320 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c 65 76  bMaskSet(pToplev
21330 65 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 2c 20 69  el->writeMask, i
21340 44 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c  Db);.  pToplevel
21350 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 7c  ->isMultiWrite |
21360 3d 20 73 65 74 53 74 61 74 65 6d 65 6e 74 3b 0a  = setStatement;.
21370 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74  }../*.** Indicat
21380 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65  e that the state
21390 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 75  ment currently u
213a0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
213b0 6e 20 6d 69 67 68 74 20 77 72 69 74 65 0a 2a 2a  n might write.**
213c0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65   more than one e
213d0 6e 74 72 79 20 28 65 78 61 6d 70 6c 65 3a 20 64  ntry (example: d
213e0 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72 6f 77 20  eleting one row 
213f0 74 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 61  then inserting a
21400 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e 73 65 72  nother,.** inser
21410 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 72 6f  ting multiple ro
21420 77 73 20 69 6e 20 61 20 74 61 62 6c 65 2c 20 6f  ws in a table, o
21430 72 20 69 6e 73 65 72 74 69 6e 67 20 61 20 72 6f  r inserting a ro
21440 77 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72  w and index entr
21450 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61 6e 20 61  ies.).** If an a
21460 62 6f 72 74 20 6f 63 63 75 72 73 20 61 66 74 65  bort occurs afte
21470 72 20 73 6f 6d 65 20 6f 66 20 74 68 65 73 65 20  r some of these 
21480 77 72 69 74 65 73 20 68 61 76 65 20 63 6f 6d 70  writes have comp
21490 6c 65 74 65 64 2c 20 74 68 65 6e 20 69 74 20 77  leted, then it w
214a0 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73  ill.** be necess
214b0 61 72 79 20 74 6f 20 75 6e 64 6f 20 74 68 65 20  ary to undo the 
214c0 63 6f 6d 70 6c 65 74 65 64 20 77 72 69 74 65 73  completed writes
214d0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
214e0 33 4d 75 6c 74 69 57 72 69 74 65 28 50 61 72 73  3MultiWrite(Pars
214f0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61  e *pParse){.  Pa
21500 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
21510 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
21520 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
21530 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75   pToplevel->isMu
21540 6c 74 69 57 72 69 74 65 20 3d 20 31 3b 0a 7d 0a  ltiWrite = 1;.}.
21550 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 64 65  ./* .** The code
21560 20 67 65 6e 65 72 61 74 6f 72 20 63 61 6c 6c 73   generator calls
21570 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 66   this routine if
21580 20 69 73 20 64 69 73 63 6f 76 65 72 73 20 74 68   is discovers th
21590 61 74 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73 73  at it is.** poss
215a0 69 62 6c 65 20 74 6f 20 61 62 6f 72 74 20 61 20  ible to abort a 
215b0 73 74 61 74 65 6d 65 6e 74 20 70 72 69 6f 72 20  statement prior 
215c0 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20  to completion.  
215d0 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a 2a 2a 20  In order to .** 
215e0 70 65 72 66 6f 72 6d 20 74 68 69 73 20 61 62 6f  perform this abo
215f0 72 74 20 77 69 74 68 6f 75 74 20 63 6f 72 72 75  rt without corru
21600 70 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  pting the databa
21610 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 6d  se, we need to m
21620 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74 68 61 74  ake.** sure that
21630 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
21640 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 61  s protected by a
21650 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
21660 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65  action..**.** Te
21670 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6f 6e  chnically, we on
21680 6c 79 20 6e 65 65 64 20 74 6f 20 73 65 74 20 74  ly need to set t
21690 68 65 20 6d 61 79 41 62 6f 72 74 20 66 6c 61 67  he mayAbort flag
216a0 20 69 66 20 74 68 65 0a 2a 2a 20 69 73 4d 75 6c   if the.** isMul
216b0 74 69 57 72 69 74 65 20 66 6c 61 67 20 77 61 73  tiWrite flag was
216c0 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 2e   previously set.
216d0 20 20 54 68 65 72 65 20 69 73 20 61 20 74 69 6d    There is a tim
216e0 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20  e dependency.** 
216f0 73 75 63 68 20 74 68 61 74 20 74 68 65 20 61 62  such that the ab
21700 6f 72 74 20 6d 75 73 74 20 6f 63 63 75 72 20 61  ort must occur a
21710 66 74 65 72 20 74 68 65 20 6d 75 6c 74 69 77 72  fter the multiwr
21720 69 74 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73  ite.  This makes
21730 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74 65 6d 65  .** some stateme
21740 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 74 68  nts involving th
21750 65 20 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c 69  e REPLACE confli
21760 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
21770 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f 20 61 20  gorithm.** go a 
21780 6c 69 74 74 6c 65 20 66 61 73 74 65 72 2e 20 20  little faster.  
21790 42 75 74 20 74 61 6b 69 6e 67 20 61 64 76 61 6e  But taking advan
217a0 74 61 67 65 20 6f 66 20 74 68 69 73 20 74 69 6d  tage of this tim
217b0 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20  e dependency.** 
217c0 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65 20 64 69  makes it more di
217d0 66 66 69 63 75 6c 74 20 74 6f 20 70 72 6f 76 65  fficult to prove
217e0 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 69   that the code i
217f0 73 20 63 6f 72 72 65 63 74 20 28 69 6e 20 0a 2a  s correct (in .*
21800 2a 20 70 61 72 74 69 63 75 6c 61 72 2c 20 69 74  * particular, it
21810 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f   prevents us fro
21820 6d 20 77 72 69 74 69 6e 67 20 61 6e 20 65 66 66  m writing an eff
21830 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70 6c 65 6d  ective.** implem
21840 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71 6c 69  entation of sqli
21850 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72  te3AssertMayAbor
21860 74 28 29 29 20 61 6e 64 20 73 6f 20 77 65 20 68  t()) and so we h
21870 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a 20 74 6f  ave chosen.** to
21880 20 74 61 6b 65 20 74 68 65 20 73 61 66 65 20 72   take the safe r
21890 6f 75 74 65 20 61 6e 64 20 73 6b 69 70 20 74 68  oute and skip th
218a0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  e optimization..
218b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d  */.void sqlite3M
218c0 61 79 41 62 6f 72 74 28 50 61 72 73 65 20 2a 70  ayAbort(Parse *p
218d0 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20  Parse){.  Parse 
218e0 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
218f0 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
21900 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f  l(pParse);.  pTo
21910 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f 72 74  plevel->mayAbort
21920 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 1;.}../*.** C
21930 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 74  ode an OP_Halt t
21940 68 61 74 20 63 61 75 73 65 73 20 74 68 65 20 76  hat causes the v
21950 64 62 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  dbe to return an
21960 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
21970 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54 68 65  NT.** error. The
21980 20 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d 65 74   onError paramet
21990 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  er determines wh
219a0 69 63 68 20 28 69 66 20 61 6e 79 29 20 6f 66 20  ich (if any) of 
219b0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  the statement.**
219c0 20 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e 74 20   and/or current 
219d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
219e0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76  olled back..*/.v
219f0 6f 69 64 20 73 71 6c 69 74 65 33 48 61 6c 74 43  oid sqlite3HaltC
21a00 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72  onstraint(.  Par
21a10 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
21a20 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
21a30 74 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f  t */.  int errCo
21a40 64 65 2c 20 20 20 20 20 20 2f 2a 20 65 78 74 65  de,      /* exte
21a50 6e 64 65 64 20 65 72 72 6f 72 20 63 6f 64 65 20  nded error code 
21a60 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
21a70 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  ,      /* Constr
21a80 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 63  aint type */.  c
21a90 68 61 72 20 2a 70 34 2c 20 20 20 20 20 20 20 20  har *p4,        
21aa0 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67   /* Error messag
21ab0 65 20 2a 2f 0a 20 20 69 38 20 70 34 74 79 70 65  e */.  i8 p4type
21ac0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 34 5f 53  ,        /* P4_S
21ad0 54 41 54 49 43 20 6f 72 20 50 34 5f 54 52 41 4e  TATIC or P4_TRAN
21ae0 53 49 45 4e 54 20 2a 2f 0a 20 20 75 38 20 70 35  SIENT */.  u8 p5
21af0 45 72 72 6d 73 67 20 20 20 20 20 20 20 2f 2a 20  Errmsg       /* 
21b00 50 35 5f 45 72 72 4d 73 67 20 74 79 70 65 20 2a  P5_ErrMsg type *
21b10 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
21b20 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
21b30 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
21b40 74 28 20 28 65 72 72 43 6f 64 65 26 30 78 66 66  t( (errCode&0xff
21b50 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  )==SQLITE_CONSTR
21b60 41 49 4e 54 20 29 3b 0a 20 20 69 66 28 20 6f 6e  AINT );.  if( on
21b70 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20  Error==OE_Abort 
21b80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61  ){.    sqlite3Ma
21b90 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a  yAbort(pParse);.
21ba0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
21bb0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61  eAddOp4(v, OP_Ha
21bc0 6c 74 2c 20 65 72 72 43 6f 64 65 2c 20 6f 6e 45  lt, errCode, onE
21bd0 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34 74  rror, 0, p4, p4t
21be0 79 70 65 29 3b 0a 20 20 69 66 28 20 70 35 45 72  ype);.  if( p5Er
21bf0 72 6d 73 67 20 29 20 73 71 6c 69 74 65 33 56 64  rmsg ) sqlite3Vd
21c00 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35  beChangeP5(v, p5
21c10 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Errmsg);.}../*.*
21c20 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c  * Code an OP_Hal
21c30 74 20 64 75 65 20 74 6f 20 55 4e 49 51 55 45 20  t due to UNIQUE 
21c40 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
21c50 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74  onstraint violat
21c60 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
21c70 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72  ite3UniqueConstr
21c80 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  aint(.  Parse *p
21c90 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
21ca0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
21cb0 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
21cc0 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e      /* Constrain
21cd0 74 20 74 79 70 65 20 2a 2f 0a 20 20 49 6e 64 65  t type */.  Inde
21ce0 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 2f 2a  x *pIdx       /*
21cf0 20 54 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   The index that 
21d00 74 72 69 67 67 65 72 73 20 74 68 65 20 63 6f 6e  triggers the con
21d10 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20  straint */.){.  
21d20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 69 6e  char *zErr;.  in
21d30 74 20 6a 3b 0a 20 20 53 74 72 41 63 63 75 6d 20  t j;.  StrAccum 
21d40 65 72 72 4d 73 67 3b 0a 20 20 54 61 62 6c 65 20  errMsg;.  Table 
21d50 2a 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54  *pTab = pIdx->pT
21d60 61 62 6c 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33  able;..  sqlite3
21d70 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 65 72  StrAccumInit(&er
21d80 72 4d 73 67 2c 20 70 50 61 72 73 65 2d 3e 64 62  rMsg, pParse->db
21d90 2c 20 30 2c 20 30 2c 20 32 30 30 29 3b 0a 20 20  , 0, 0, 200);.  
21da0 69 66 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78  if( pIdx->aColEx
21db0 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pr ){.    sqlite
21dc0 33 58 50 72 69 6e 74 66 28 26 65 72 72 4d 73 67  3XPrintf(&errMsg
21dd0 2c 20 30 2c 20 22 69 6e 64 65 78 20 27 25 71 27  , 0, "index '%q'
21de0 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b  ", pIdx->zName);
21df0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
21e00 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e  r(j=0; j<pIdx->n
21e10 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  KeyCol; j++){.  
21e20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a      char *zCol;.
21e30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
21e40 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e  dx->aiColumn[j]>
21e50 3d 30 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c  =0 );.      zCol
21e60 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49   = pTab->aCol[pI
21e70 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d  dx->aiColumn[j]]
21e80 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66  .zName;.      if
21e90 28 20 6a 20 29 20 73 71 6c 69 74 65 33 53 74 72  ( j ) sqlite3Str
21ea0 41 63 63 75 6d 41 70 70 65 6e 64 28 26 65 72 72  AccumAppend(&err
21eb0 4d 73 67 2c 20 22 2c 20 22 2c 20 32 29 3b 0a 20  Msg, ", ", 2);. 
21ec0 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
21ed0 6e 74 66 28 26 65 72 72 4d 73 67 2c 20 30 2c 20  ntf(&errMsg, 0, 
21ee0 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a  "%s.%s", pTab->z
21ef0 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  Name, zCol);.   
21f00 20 7d 0a 20 20 7d 0a 20 20 7a 45 72 72 20 3d 20   }.  }.  zErr = 
21f10 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46  sqlite3StrAccumF
21f20 69 6e 69 73 68 28 26 65 72 72 4d 73 67 29 3b 0a  inish(&errMsg);.
21f30 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e    sqlite3HaltCon
21f40 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20  straint(pParse, 
21f50 0a 20 20 20 20 49 73 50 72 69 6d 61 72 79 4b 65  .    IsPrimaryKe
21f60 79 49 6e 64 65 78 28 70 49 64 78 29 20 3f 20 53  yIndex(pIdx) ? S
21f70 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
21f80 5f 50 52 49 4d 41 52 59 4b 45 59 20 0a 20 20 20  _PRIMARYKEY .   
21f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fa0 20 20 20 20 20 20 20 20 20 3a 20 53 51 4c 49 54           : SQLIT
21fb0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49  E_CONSTRAINT_UNI
21fc0 51 55 45 2c 0a 20 20 20 20 6f 6e 45 72 72 6f 72  QUE,.    onError
21fd0 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d  , zErr, P4_DYNAM
21fe0 49 43 2c 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e  IC, P5_Constrain
21ff0 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a  tUnique);.}.../*
22000 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48  .** Code an OP_H
22010 61 6c 74 20 64 75 65 20 74 6f 20 6e 6f 6e 2d 75  alt due to non-u
22020 6e 69 71 75 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a  nique rowid..*/.
22030 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 77 69  void sqlite3Rowi
22040 64 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50  dConstraint(.  P
22050 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
22060 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
22070 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  ext */.  int onE
22080 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f  rror,      /* Co
22090 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
220a0 6e 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20  n algorithm */. 
220b0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 20 20 20   Table *pTab    
220c0 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
220d0 77 69 74 68 20 74 68 65 20 6e 6f 6e 2d 75 6e 69  with the non-uni
220e0 71 75 65 20 72 6f 77 69 64 20 2a 2f 20 0a 29 7b  que rowid */ .){
220f0 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20  .  char *zMsg;. 
22100 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
22110 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b  Tab->iPKey>=0 ){
22120 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69  .    zMsg = sqli
22130 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
22140 65 2d 3e 64 62 2c 20 22 25 73 2e 25 73 22 2c 20  e->db, "%s.%s", 
22150 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
22160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22170 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f         pTab->aCo
22180 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a  l[pTab->iPKey].z
22190 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  Name);.    rc = 
221a0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
221b0 54 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20  T_PRIMARYKEY;.  
221c0 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4d 73 67 20  }else{.    zMsg 
221d0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
221e0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73  (pParse->db, "%s
221f0 2e 72 6f 77 69 64 22 2c 20 70 54 61 62 2d 3e 7a  .rowid", pTab->z
22200 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  Name);.    rc = 
22210 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
22220 54 5f 52 4f 57 49 44 3b 0a 20 20 7d 0a 20 20 73  T_ROWID;.  }.  s
22230 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72  qlite3HaltConstr
22240 61 69 6e 74 28 70 50 61 72 73 65 2c 20 72 63 2c  aint(pParse, rc,
22250 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d 73 67 2c 20   onError, zMsg, 
22260 50 34 5f 44 59 4e 41 4d 49 43 2c 0a 20 20 20 20  P4_DYNAMIC,.    
22270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22280 20 20 20 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e      P5_Constrain
22290 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a  tUnique);.}../*.
222a0 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
222b0 69 66 20 70 49 6e 64 65 78 20 75 73 65 73 20 74  if pIndex uses t
222c0 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
222d0 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65  uence pColl.  Re
222e0 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
222f0 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73  it does and fals
22300 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  e if it does not
22310 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
22320 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
22330 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c  .static int coll
22340 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74  ationMatch(const
22350 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e   char *zColl, In
22360 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20  dex *pIndex){.  
22370 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
22380 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 66   zColl!=0 );.  f
22390 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78  or(i=0; i<pIndex
223a0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
223b0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
223c0 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43  *z = pIndex->azC
223d0 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65  oll[i];.    asse
223e0 72 74 28 20 7a 21 3d 30 20 7c 7c 20 70 49 6e 64  rt( z!=0 || pInd
223f0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c  ex->aiColumn[i]<
22400 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  0 );.    if( pIn
22410 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
22420 3e 3d 30 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  >=0 && 0==sqlite
22430 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c  3StrICmp(z, zCol
22440 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  l) ){.      retu
22450 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
22460 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
22470 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  ndif../*.** Reco
22480 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  mpute all indice
22490 73 20 6f 66 20 70 54 61 62 20 74 68 61 74 20 75  s of pTab that u
224a0 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  se the collating
224b0 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
224c0 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20  .** If pColl==0 
224d0 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20 61  then recompute a
224e0 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54  ll indices of pT
224f0 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ab..*/.#ifndef S
22500 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
22510 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  EX.static void r
22520 65 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72 73  eindexTable(Pars
22530 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
22540 20 2a 70 54 61 62 2c 20 63 68 61 72 20 63 6f 6e   *pTab, char con
22550 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e  st *zColl){.  In
22560 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
22570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
22580 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
22590 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20   with pTab */.. 
225a0 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62   for(pIndex=pTab
225b0 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ->pIndex; pIndex
225c0 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d  ; pIndex=pIndex-
225d0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
225e0 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c   zColl==0 || col
225f0 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c  lationMatch(zCol
22600 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20  l, pIndex) ){.  
22610 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
22620 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
22630 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
22640 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
22650 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
22660 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
22670 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
22680 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
22690 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
226a0 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20  , pIndex, -1);. 
226b0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
226c0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75  f../*.** Recompu
226d0 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
226e0 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  f all tables in 
226f0 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77 68  all databases wh
22700 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63  ere the.** indic
22710 65 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61  es use the colla
22720 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43  ting sequence pC
22730 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d  oll.  If pColl==
22740 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65  0 then recompute
22750 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  .** all indices 
22760 65 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23  everywhere..*/.#
22770 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22780 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
22790 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61  c void reindexDa
227a0 74 61 62 61 73 65 73 28 50 61 72 73 65 20 2a 70  tabases(Parse *p
227b0 50 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e 73  Parse, char cons
227c0 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20  t *zColl){.  Db 
227d0 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *pDb;           
227e0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
227f0 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f  ngle database */
22800 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
22810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22820 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69  * The database i
22830 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ndex number */. 
22840 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
22850 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20  Parse->db;   /* 
22860 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
22870 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73  nection */.  Has
22880 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20  hElem *k;       
22890 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
228a0 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62  looping over tab
228b0 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20  les in pDb */.  
228c0 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
228d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
228e0 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
228f0 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73  tabase */..  ass
22900 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
22910 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73  eHoldsAllMutexes
22920 28 64 62 29 20 29 3b 20 20 2f 2a 20 4e 65 65 64  (db) );  /* Need
22930 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63  ed for schema ac
22940 63 65 73 73 20 2a 2f 0a 20 20 66 6f 72 28 69 44  cess */.  for(iD
22950 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62  b=0, pDb=db->aDb
22960 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69  ; iDb<db->nDb; i
22970 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20  Db++, pDb++){.  
22980 20 20 61 73 73 65 72 74 28 20 70 44 62 21 3d 30    assert( pDb!=0
22990 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71   );.    for(k=sq
229a0 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
229b0 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  Db->pSchema->tbl
229c0 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c  Hash);  k; k=sql
229d0 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b  iteHashNext(k)){
229e0 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54  .      pTab = (T
229f0 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68  able*)sqliteHash
22a00 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72  Data(k);.      r
22a10 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72  eindexTable(pPar
22a20 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29  se, pTab, zColl)
22a30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
22a40 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ndif../*.** Gene
22a50 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
22a60 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e  e REINDEX comman
22a70 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  d..**.**        
22a80 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20  REINDEX         
22a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22aa0 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20     -- 1.**      
22ab0 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c    REINDEX  <coll
22ac0 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20  ation>          
22ad0 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20       -- 2.**    
22ae0 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64      REINDEX  ?<d
22af0 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65  atabase>.?<table
22b00 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20  name>  -- 3.**  
22b10 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f        REINDEX  ?
22b20 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64  <database>.?<ind
22b30 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a  exname>  -- 4.**
22b40 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65  .** Form 1 cause
22b50 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e  s all indices in
22b60 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
22b70 74 61 62 61 73 65 73 20 74 6f 20 62 65 20 72 65  tabases to be re
22b80 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32  built..** Form 2
22b90 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e   rebuilds all in
22ba0 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74  dices in all dat
22bb0 61 62 61 73 65 73 20 74 68 61 74 20 75 73 65 20  abases that use 
22bc0 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c  the named.** col
22bd0 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  lating function.
22be0 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20    Forms 3 and 4 
22bf0 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65  rebuild the name
22c00 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a  d index or all.*
22c10 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  * indices associ
22c20 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61  ated with the na
22c30 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69  med table..*/.#i
22c40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22c50 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73  T_REINDEX.void s
22c60 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50 61  qlite3Reindex(Pa
22c70 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
22c80 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65  en *pName1, Toke
22c90 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f  n *pName2){.  Co
22ca0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
22cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
22cc0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
22cd0 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c  to be reindexed,
22ce0 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68   or NULL */.  ch
22cf0 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20  ar *z;          
22d00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
22d10 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  e of a table or 
22d20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74  index */.  const
22d30 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20   char *zDb;     
22d40 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
22d50 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  f the database *
22d60 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
22d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d80 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68  /* A table in th
22d90 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
22da0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
22db0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
22dc0 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  n index associat
22dd0 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a  ed with pTab */.
22de0 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
22df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22e00 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   The database in
22e10 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
22e20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
22e30 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54  arse->db;   /* T
22e40 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
22e50 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ection */.  Toke
22e60 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20  n *pObjName;    
22e70 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
22e80 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
22e90 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e  index to be rein
22ea0 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52  dexed */..  /* R
22eb0 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
22ec0 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65   schema. If an e
22ed0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61  rror occurs, lea
22ee0 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
22ef0 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64  age.  ** and cod
22f00 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
22f10 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a  return NULL. */.
22f20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
22f30 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
22f40 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
22f50 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
22f60 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29   if( pName1==0 )
22f70 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61 74  {.    reindexDat
22f80 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 30  abases(pParse, 0
22f90 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
22fa0 20 7d 65 6c 73 65 20 69 66 28 20 4e 45 56 45 52   }else if( NEVER
22fb0 28 70 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 70  (pName2==0) || p
22fc0 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  Name2->z==0 ){. 
22fd0 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a     char *zColl;.
22fe0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
22ff0 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f  e1->z );.    zCo
23000 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ll = sqlite3Name
23010 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
23020 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20  ->db, pName1);. 
23030 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20     if( !zColl ) 
23040 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c  return;.    pCol
23050 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
23060 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64  ollSeq(db, ENC(d
23070 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20  b), zColl, 0);. 
23080 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
23090 20 20 20 20 20 20 72 65 69 6e 64 65 78 44 61 74        reindexDat
230a0 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 7a  abases(pParse, z
230b0 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Coll);.      sql
230c0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
230d0 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74  Coll);.      ret
230e0 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  urn;.    }.    s
230f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
23100 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69   zColl);.  }.  i
23110 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
23120 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
23130 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
23140 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66  &pObjName);.  if
23150 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e  ( iDb<0 ) return
23160 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e  ;.  z = sqlite3N
23170 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
23180 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66   pObjName);.  if
23190 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
231a0 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  zDb = db->aDb
231b0 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70  [iDb].zName;.  p
231c0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Tab = sqlite3Fin
231d0 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44  dTable(db, z, zD
231e0 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29  b);.  if( pTab )
231f0 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61 62  {.    reindexTab
23200 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  le(pParse, pTab,
23210 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
23220 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
23230 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
23240 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
23250 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
23260 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , zDb);.  sqlite
23270 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
23280 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
23290 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
232a0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
232b0 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
232c0 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
232d0 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
232e0 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20  Index, -1);.    
232f0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
23300 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
23310 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f  arse, "unable to
23320 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f 62   identify the ob
23330 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e 64  ject to be reind
23340 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66  exed");.}.#endif
23350 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
23360 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
23370 72 65 20 74 68 61 74 20 69 73 20 61 70 70 72 6f  re that is appro
23380 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67  priate for the g
23390 69 76 65 6e 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a  iven Index..**.*
233a0 2a 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  * The KeyInfo st
233b0 72 75 63 74 75 72 65 20 66 6f 72 20 61 6e 20 69  ructure for an i
233c0 6e 64 65 78 20 69 73 20 63 61 63 68 65 64 20 69  ndex is cached i
233d0 6e 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65  n the Index obje
233e0 63 74 2e 0a 2a 2a 20 53 6f 20 74 68 65 72 65 20  ct..** So there 
233f0 6d 69 67 68 74 20 62 65 20 6d 75 6c 74 69 70 6c  might be multipl
23400 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
23410 74 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69  the returned poi
23420 6e 74 65 72 2e 20 20 54 68 65 0a 2a 2a 20 63 61  nter.  The.** ca
23430 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20  ller should not 
23440 74 72 79 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  try to modify th
23450 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  e KeyInfo object
23460 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
23470 65 72 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65  er should invoke
23480 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
23490 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 72 65  nref() on the re
234a0 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 0a 2a 2a  turned object.**
234b0 20 77 68 65 6e 20 69 74 20 68 61 73 20 66 69 6e   when it has fin
234c0 69 73 68 65 64 20 75 73 69 6e 67 20 69 74 2e 0a  ished using it..
234d0 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
234e0 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65  te3KeyInfoOfInde
234f0 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
23500 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20   Index *pIdx){. 
23510 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43   int i;.  int nC
23520 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ol = pIdx->nColu
23530 6d 6e 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d  mn;.  int nKey =
23540 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a   pIdx->nKeyCol;.
23550 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b    KeyInfo *pKey;
23560 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
23570 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Err ) return 0;.
23580 20 20 69 66 28 20 70 49 64 78 2d 3e 75 6e 69 71    if( pIdx->uniq
23590 4e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 70  NotNull ){.    p
235a0 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  Key = sqlite3Key
235b0 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65  InfoAlloc(pParse
235c0 2d 3e 64 62 2c 20 6e 4b 65 79 2c 20 6e 43 6f 6c  ->db, nKey, nCol
235d0 2d 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  -nKey);.  }else{
235e0 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69  .    pKey = sqli
235f0 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
23600 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 43 6f 6c  pParse->db, nCol
23610 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
23620 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65  pKey ){.    asse
23630 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
23640 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b  foIsWriteable(pK
23650 65 79 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  ey) );.    for(i
23660 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
23670 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  {.      char *zC
23680 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f  oll = pIdx->azCo
23690 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73  ll[i];.      ass
236a0 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b  ert( zColl!=0 );
236b0 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f  .      pKey->aCo
236c0 6c 6c 5b 69 5d 20 3d 20 73 74 72 63 6d 70 28 7a  ll[i] = strcmp(z
236d0 43 6f 6c 6c 2c 22 42 49 4e 41 52 59 22 29 3d 3d  Coll,"BINARY")==
236e0 30 20 3f 20 30 20 3a 0a 20 20 20 20 20 20 20 20  0 ? 0 :.        
236f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23700 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
23710 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f  lSeq(pParse, zCo
23720 6c 6c 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d  ll);.      pKey-
23730 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
23740 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
23750 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  r[i];.    }.    
23760 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
23770 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
23780 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b  3KeyInfoUnref(pK
23790 65 79 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 20  ey);.      pKey 
237a0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
237b0 20 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a   return pKey;.}.
237c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
237d0 4f 4d 49 54 5f 43 54 45 0a 2f 2a 20 0a 2a 2a 20  OMIT_CTE./* .** 
237e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
237f0 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 70 65 72  invoked once per
23800 20 43 54 45 20 62 79 20 74 68 65 20 70 61 72 73   CTE by the pars
23810 65 72 20 77 68 69 6c 65 20 70 61 72 73 69 6e 67  er while parsing
23820 20 61 20 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75   a .** WITH clau
23830 73 65 2e 20 0a 2a 2f 0a 57 69 74 68 20 2a 73 71  se. .*/.With *sq
23840 6c 69 74 65 33 57 69 74 68 41 64 64 28 0a 20 20  lite3WithAdd(.  
23850 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
23860 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
23870 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
23880 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20  With *pWith,    
23890 20 20 20 20 20 20 20 20 2f 2a 20 45 78 69 73 74          /* Exist
238a0 69 6e 67 20 57 49 54 48 20 63 6c 61 75 73 65 2c  ing WITH clause,
238b0 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   or NULL */.  To
238c0 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20  ken *pName,     
238d0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
238e0 20 74 68 65 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c   the common-tabl
238f0 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
23900 2a 70 41 72 67 6c 69 73 74 2c 20 20 20 20 20 2f  *pArglist,     /
23910 2a 20 4f 70 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  * Optional colum
23920 6e 20 6e 61 6d 65 20 6c 69 73 74 20 66 6f 72 20  n name list for 
23930 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53  the table */.  S
23940 65 6c 65 63 74 20 2a 70 51 75 65 72 79 20 20 20  elect *pQuery   
23950 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20         /* Query 
23960 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69  used to initiali
23970 7a 65 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  ze the table */.
23980 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
23990 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
239a0 20 57 69 74 68 20 2a 70 4e 65 77 3b 0a 20 20 63   With *pNew;.  c
239b0 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 2f  har *zName;..  /
239c0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
239d0 20 43 54 45 20 6e 61 6d 65 20 69 73 20 75 6e 69   CTE name is uni
239e0 71 75 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  que within this 
239f0 57 49 54 48 20 63 6c 61 75 73 65 2e 20 49 66 0a  WITH clause. If.
23a00 20 20 2a 2a 20 6e 6f 74 2c 20 73 74 6f 72 65 20    ** not, store 
23a10 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  an error in the 
23a20 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
23a30 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71   */.  zName = sq
23a40 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
23a50 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
23a60 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
23a70 6d 65 20 26 26 20 70 57 69 74 68 20 29 7b 0a 20  me && pWith ){. 
23a80 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
23a90 72 28 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e  r(i=0; i<pWith->
23aa0 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCte; i++){.    
23ab0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
23ac0 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 57 69 74  ICmp(zName, pWit
23ad0 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  h->a[i].zName)==
23ae0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
23af0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
23b00 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20  rse, "duplicate 
23b10 57 49 54 48 20 74 61 62 6c 65 20 6e 61 6d 65 3a  WITH table name:
23b20 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
23b30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
23b40 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a  .  if( pWith ){.
23b50 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
23b60 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 20 2b  sizeof(*pWith) +
23b70 20 28 73 69 7a 65 6f 66 28 70 57 69 74 68 2d 3e   (sizeof(pWith->
23b80 61 5b 31 5d 29 20 2a 20 70 57 69 74 68 2d 3e 6e  a[1]) * pWith->n
23b90 43 74 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d  Cte);.    pNew =
23ba0 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
23bb0 63 28 64 62 2c 20 70 57 69 74 68 2c 20 6e 42 79  c(db, pWith, nBy
23bc0 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  te);.  }else{.  
23bd0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
23be0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
23bf0 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 29   sizeof(*pWith))
23c00 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
23c10 7a 4e 61 6d 65 21 3d 30 20 7c 7c 20 70 4e 65 77  zName!=0 || pNew
23c20 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
23c30 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
23c40 64 3d 3d 30 20 7c 7c 20 70 4e 65 77 3d 3d 30 20  d==0 || pNew==0 
23c50 29 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d  );..  if( pNew==
23c60 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
23c70 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
23c80 62 2c 20 70 41 72 67 6c 69 73 74 29 3b 0a 20 20  b, pArglist);.  
23c90 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
23ca0 65 6c 65 74 65 28 64 62 2c 20 70 51 75 65 72 79  elete(db, pQuery
23cb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
23cc0 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
23cd0 0a 20 20 20 20 70 4e 65 77 20 3d 20 70 57 69 74  .    pNew = pWit
23ce0 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  h;.  }else{.    
23cf0 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43  pNew->a[pNew->nC
23d00 74 65 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70 51  te].pSelect = pQ
23d10 75 65 72 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  uery;.    pNew->
23d20 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 43  a[pNew->nCte].pC
23d30 6f 6c 73 20 3d 20 70 41 72 67 6c 69 73 74 3b 0a  ols = pArglist;.
23d40 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
23d50 2d 3e 6e 43 74 65 5d 2e 7a 4e 61 6d 65 20 3d 20  ->nCte].zName = 
23d60 7a 4e 61 6d 65 3b 0a 20 20 20 20 70 4e 65 77 2d  zName;.    pNew-
23d70 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a  >a[pNew->nCte].z
23d80 43 74 65 45 72 72 20 3d 20 30 3b 0a 20 20 20 20  CteErr = 0;.    
23d90 70 4e 65 77 2d 3e 6e 43 74 65 2b 2b 3b 0a 20 20  pNew->nCte++;.  
23da0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  }..  return pNew
23db0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
23dc0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
23dd0 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20  the With object 
23de0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
23df0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
23e00 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
23e10 74 68 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  thDelete(sqlite3
23e20 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 57 69 74   *db, With *pWit
23e30 68 29 7b 0a 20 20 69 66 28 20 70 57 69 74 68 20  h){.  if( pWith 
23e40 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
23e50 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69    for(i=0; i<pWi
23e60 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  th->nCte; i++){.
23e70 20 20 20 20 20 20 73 74 72 75 63 74 20 43 74 65        struct Cte
23e80 20 2a 70 43 74 65 20 3d 20 26 70 57 69 74 68 2d   *pCte = &pWith-
23e90 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c  >a[i];.      sql
23ea0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
23eb0 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 43 6f  te(db, pCte->pCo
23ec0 6c 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ls);.      sqlit
23ed0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
23ee0 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74  b, pCte->pSelect
23ef0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23f00 44 62 46 72 65 65 28 64 62 2c 20 70 43 74 65 2d  DbFree(db, pCte-
23f10 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
23f20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
23f30 28 64 62 2c 20 70 57 69 74 68 29 3b 0a 20 20 7d  (db, pWith);.  }
23f40 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
23f50 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
23f60 54 5f 43 54 45 29 20 2a 2f 0a                    T_CTE) */.