/ Hex Artifact Content
Login

Artifact 4acc35c4e0a2d94c906abd164568cd6fc989cfbb:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t.h"../*.** This
02f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
0300: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 53 51  ed when a new SQ
0310: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 62  L statement is b
0320: 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62  eginning to.** b
0330: 65 20 70 61 72 73 65 64 2e 20 20 49 6e 69 74 69  e parsed.  Initi
0340: 61 6c 69 7a 65 20 74 68 65 20 70 50 61 72 73 65  alize the pParse
0350: 20 73 74 72 75 63 74 75 72 65 20 61 73 20 6e 65   structure as ne
0360: 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eded..*/.void sq
0370: 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73 65 28  lite3BeginParse(
0380: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
0390: 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67 29 7b  nt explainFlag){
03a0: 0a 20 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  .  pParse->expla
03b0: 69 6e 20 3d 20 28 75 38 29 65 78 70 6c 61 69 6e  in = (u8)explain
03c0: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
03d0: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  nVar = 0;.}..#if
03e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
03f0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0400: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 4c 6f 63  .** The TableLoc
0410: 6b 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  k structure is o
0420: 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65 20  nly used by the 
0430: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0440: 28 29 20 61 6e 64 0a 2a 2a 20 63 6f 64 65 54 61  () and.** codeTa
0450: 62 6c 65 4c 6f 63 6b 73 28 29 20 66 75 6e 63 74  bleLocks() funct
0460: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ions..*/.struct 
0470: 54 61 62 6c 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  TableLock {.  in
0480: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
0490: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
04a0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
04b0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f  e table to be lo
04c0: 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  cked */.  int iT
04d0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ab;            /
04e0: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
04f0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0500: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
0510: 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20  8 isWriteLock;  
0520: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
0530: 77 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c  write lock.  Fal
0540: 73 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f  se for a read lo
0550: 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ck */.  const ch
0560: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
0570: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
0580: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  e */.};../*.** R
0590: 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
05a0: 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6c  hat we want to l
05b0: 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20 72  ock a table at r
05c0: 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a 2a  un-time.  .**.**
05d0: 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   The table to be
05e0: 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f 74   locked has root
05f0: 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20 69   page iTab and i
0600: 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61 62  s found in datab
0610: 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72 65  ase iDb..** A re
0620: 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c 6f  ad or a write lo
0630: 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e 20  ck can be taken 
0640: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73 57  depending on isW
0650: 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ritelock..**.** 
0660: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
0670: 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66 61  t records the fa
0680: 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ct that the lock
0690: 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54 68   is desired.  Th
06a0: 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61 6b  e.** code to mak
06b0: 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75 72  e the lock occur
06c0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
06d0: 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74 6f   a later call to
06e0: 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  .** codeTableLoc
06f0: 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75 72  ks() which occur
0700: 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  s during sqlite3
0710: 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
0720: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  */.void sqlite3T
0730: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72 73  ableLock(.  Pars
0740: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
0750: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0760: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
0770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
0780: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
0790: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
07a0: 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 20  e table to lock 
07b0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
07c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
07d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
07e0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c  he table to be l
07f0: 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69 73  ocked */.  u8 is
0800: 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f 2a  WriteLock,    /*
0810: 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69 74   True for a writ
0820: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73  e lock */.  cons
0830: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 2f  t char *zName  /
0840: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
0850: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
0860: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
0870: 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
0880: 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
0890: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
08a0: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 3b  i;.  int nBytes;
08b0: 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 3b  .  TableLock *p;
08c0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
08d0: 30 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  0 );..  for(i=0;
08e0: 20 69 3c 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54   i<pToplevel->nT
08f0: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0900: 20 20 20 20 70 20 3d 20 26 70 54 6f 70 6c 65 76      p = &pToplev
0910: 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69  el->aTableLock[i
0920: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 44  ];.    if( p->iD
0930: 62 3d 3d 69 44 62 20 26 26 20 70 2d 3e 69 54 61  b==iDb && p->iTa
0940: 62 3d 3d 69 54 61 62 20 29 7b 0a 20 20 20 20 20  b==iTab ){.     
0950: 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20   p->isWriteLock 
0960: 3d 20 28 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63  = (p->isWriteLoc
0970: 6b 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b  k || isWriteLock
0980: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
0990: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42  .    }.  }..  nB
09a0: 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 54 61  ytes = sizeof(Ta
09b0: 62 6c 65 4c 6f 63 6b 29 20 2a 20 28 70 54 6f 70  bleLock) * (pTop
09c0: 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63  level->nTableLoc
09d0: 6b 2b 31 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  k+1);.  pTopleve
09e0: 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 0a  l->aTableLock =.
09f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52        sqlite3DbR
0a00: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 54 6f  eallocOrFree(pTo
0a10: 70 6c 65 76 65 6c 2d 3e 64 62 2c 20 70 54 6f 70  plevel->db, pTop
0a20: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
0a30: 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  k, nBytes);.  if
0a40: 28 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61  ( pToplevel->aTa
0a50: 62 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  bleLock ){.    p
0a60: 20 3d 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61   = &pToplevel->a
0a70: 54 61 62 6c 65 4c 6f 63 6b 5b 70 54 6f 70 6c 65  TableLock[pTople
0a80: 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b  vel->nTableLock+
0a90: 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d  +];.    p->iDb =
0aa0: 20 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61   iDb;.    p->iTa
0ab0: 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d  b = iTab;.    p-
0ac0: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69  >isWriteLock = i
0ad0: 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20  sWriteLock;.    
0ae0: 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  p->zName = zName
0af0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
0b00: 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65  Toplevel->nTable
0b10: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 70 54  Lock = 0;.    pT
0b20: 6f 70 6c 65 76 65 6c 2d 3e 64 62 2d 3e 6d 61 6c  oplevel->db->mal
0b30: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
0b40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
0b50: 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b   an OP_TableLock
0b60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
0b70: 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b   each table lock
0b80: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 61  ed by the.** sta
0b90: 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75 72  tement (configur
0ba0: 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
0bb0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
0bc0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ))..*/.static vo
0bd0: 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  id codeTableLock
0be0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  s(Parse *pParse)
0bf0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0c00: 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70 56  e *pVdbe; ..  pV
0c10: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dbe = sqlite3Get
0c20: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
0c30: 61 73 73 65 72 74 28 20 70 56 64 62 65 21 3d 30  assert( pVdbe!=0
0c40: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47 65   ); /* sqlite3Ge
0c50: 74 56 64 62 65 20 63 61 6e 6e 6f 74 20 66 61 69  tVdbe cannot fai
0c60: 6c 3a 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  l: VDBE already 
0c70: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20  allocated */..  
0c80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
0c90: 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69  e->nTableLock; i
0ca0: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f  ++){.    TableLo
0cb0: 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d  ck *p = &pParse-
0cc0: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
0cd0: 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e      int p1 = p->
0ce0: 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  iDb;.    sqlite3
0cf0: 56 64 62 65 41 64 64 4f 70 34 28 70 56 64 62 65  VdbeAddOp4(pVdbe
0d00: 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20  , OP_TableLock, 
0d10: 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e  p1, p->iTab, p->
0d20: 69 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20  isWriteLock,.   
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f     p->zName, P4_
0d50: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  STATIC);.  }.}.#
0d60: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63  else.  #define c
0d70: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29  odeTableLocks(x)
0d80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
0d90: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
0da0: 65 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20  e given yDbMask 
0db0: 6f 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20  object is empty 
0dc0: 2d 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73  - if it contains
0dd0: 20 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20   no.** 1 bits.  
0de0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0df0: 75 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61  used by the DbMa
0e00: 73 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20  skAllZero() and 
0e10: 44 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a  DbMaskNotZero().
0e20: 2a 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53  ** macros when S
0e30: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
0e40: 45 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ED is greater th
0e50: 61 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51  an 30..*/.#if SQ
0e60: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0e70: 44 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33  D>30.int sqlite3
0e80: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44  DbMaskAllZero(yD
0e90: 62 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20  bMask m){.  int 
0ea0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
0eb0: 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b  sizeof(yDbMask);
0ec0: 20 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29   i++) if( m[i] )
0ed0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
0ee0: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
0ef0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
0f00: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
0f10: 74 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c  ter a single SQL
0f20: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62   statement has b
0f30: 65 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e  een.** parsed an
0f40: 64 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d  d a VDBE program
0f50: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74   to execute that
0f60: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62   statement has b
0f70: 65 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e  een.** prepared.
0f80: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70    This routine p
0f90: 75 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e  uts the finishin
0fa0: 67 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65  g touches on the
0fb0: 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d  .** VDBE program
0fc0: 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20   and resets the 
0fd0: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
0fe0: 20 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a   for the next.**
0ff0: 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   parse..**.** No
1000: 74 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72  te that if an er
1010: 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74  ror occurred, it
1020: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
1030: 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44  se that.** no VD
1040: 42 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65  BE code was gene
1050: 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rated..*/.void s
1060: 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69  qlite3FinishCodi
1070: 6e 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ng(Parse *pParse
1080: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1090: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
10a0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
10b0: 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a  pToplevel==0 );.
10c0: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
10d0: 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  b;.  if( pParse-
10e0: 3e 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e  >nested ) return
10f0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
1100: 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
1110: 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
1120: 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d  if( pParse->rc==
1130: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72  SQLITE_OK ) pPar
1140: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
1150: 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72  ERROR;.    retur
1160: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67  n;.  }..  /* Beg
1170: 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67  in by generating
1180: 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f   some terminatio
1190: 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e  n code at the en
11a0: 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64  d of the.  ** vd
11b0: 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a  be program.  */.
11c0: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
11d0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
11e0: 61 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d  assert( !pParse-
11f0: 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20  >isMultiWrite . 
1200: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
1210: 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f  VdbeAssertMayAbo
1220: 72 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61  rt(v, pParse->ma
1230: 79 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20  yAbort));.  if( 
1240: 76 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  v ){.    while( 
1250: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
1260: 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 76 2c 20  ePriorOpcode(v, 
1270: 4f 50 5f 43 6c 6f 73 65 29 20 29 7b 7d 0a 20 20  OP_Close) ){}.  
1280: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1290: 4f 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b  Op0(v, OP_Halt);
12a0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  ..#if SQLITE_USE
12b0: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
12c0: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
12d0: 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3e 30 20 26 26  >nTableLock>0 &&
12e0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
12f0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1300: 65 33 55 73 65 72 41 75 74 68 49 6e 69 74 28 64  e3UserAuthInit(d
1310: 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  b);.      if( db
1320: 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c  ->auth.authLevel
1330: 3c 55 41 55 54 48 5f 55 73 65 72 20 29 7b 0a 20  <UAUTH_User ){. 
1340: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72         pParse->r
1350: 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48 5f  c = SQLITE_AUTH_
1360: 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 73 71  USER;.        sq
1370: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1380: 61 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20  arse, "user not 
1390: 61 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b  authenticated");
13a0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
13b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
13c0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68  endif..    /* Th
13d0: 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b 20 63 6f  e cookie mask co
13e0: 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69 74 20 66  ntains one bit f
13f0: 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65  or each database
1400: 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20 20 20 20   file open..    
1410: 2a 2a 20 28 42 69 74 20 30 20 69 73 20 66 6f 72  ** (Bit 0 is for
1420: 20 6d 61 69 6e 2c 20 62 69 74 20 31 20 69 73 20   main, bit 1 is 
1430: 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64 20 73 6f  for temp, and so
1440: 20 66 6f 72 74 68 2e 29 20 20 42 69 74 73 20 61   forth.)  Bits a
1450: 72 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 66 6f  re.    ** set fo
1460: 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  r each database 
1470: 74 68 61 74 20 69 73 20 75 73 65 64 2e 20 20 47  that is used.  G
1480: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1490: 73 74 61 72 74 20 61 0a 20 20 20 20 2a 2a 20 74  start a.    ** t
14a0: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 65 61  ransaction on ea
14b0: 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65  ch used database
14c0: 20 61 6e 64 20 74 6f 20 76 65 72 69 66 79 20 74   and to verify t
14d0: 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
14e0: 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61 63 68 20  .    ** on each 
14f0: 75 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20  used database.. 
1500: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62     */.    if( db
1510: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
1520: 30 20 0a 20 20 20 20 20 26 26 20 28 44 62 4d 61  0 .     && (DbMa
1530: 73 6b 4e 6f 6e 5a 65 72 6f 28 70 50 61 72 73 65  skNonZero(pParse
1540: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 20 7c 7c  ->cookieMask) ||
1550: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1560: 78 70 72 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  xpr).    ){.    
1570: 20 20 69 6e 74 20 69 44 62 2c 20 69 3b 0a 20 20    int iDb, i;.  
1580: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
1590: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
15a0: 30 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  0)->opcode==OP_I
15b0: 6e 69 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  nit );.      sql
15c0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
15d0: 28 76 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f  (v, 0);.      fo
15e0: 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64 62 2d  r(iDb=0; iDb<db-
15f0: 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20 20  >nDb; iDb++){.  
1600: 20 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b        if( DbMask
1610: 54 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f  Test(pParse->coo
1620: 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30  kieMask, iDb)==0
1630: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1640: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1650: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
1660: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1670: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
1680: 76 2c 0a 20 20 20 20 20 20 20 20 20 20 4f 50 5f  v,.          OP_
1690: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20  Transaction,    
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  /* Opcode */.   
16c0: 20 20 20 20 20 20 20 69 44 62 2c 20 20 20 20 20         iDb,     
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20            /* P1 
16f0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 44 62 4d  */.          DbM
1700: 61 73 6b 54 65 73 74 28 70 50 61 72 73 65 2d 3e  askTest(pParse->
1710: 77 72 69 74 65 4d 61 73 6b 2c 69 44 62 29 2c 20  writeMask,iDb), 
1720: 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 20 20 20  /* P2 */.       
1730: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69     pParse->cooki
1740: 65 56 61 6c 75 65 5b 69 44 62 5d 2c 20 20 20 20  eValue[iDb],    
1750: 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20        /* P3 */. 
1760: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62           db->aDb
1770: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69  [iDb].pSchema->i
1780: 47 65 6e 65 72 61 74 69 6f 6e 20 20 2f 2a 20 50  Generation  /* P
1790: 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 3b 0a  4 */.        );.
17a0: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
17b0: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 20 73  init.busy==0 ) s
17c0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
17d0: 50 35 28 76 2c 20 31 29 3b 0a 20 20 20 20 20 20  P5(v, 1);.      
17e0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
17f0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1800: 4c 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  LE.      for(i=0
1810: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61  ; i<pParse->nVta
1820: 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  bLock; i++){.   
1830: 20 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20       char *vtab 
1840: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
1850: 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
1860: 50 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63  Parse->apVtabLoc
1870: 6b 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73  k[i]);.        s
1880: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1890: 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30  (v, OP_VBegin, 0
18a0: 2c 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34  , 0, 0, vtab, P4
18b0: 5f 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a  _VTAB);.      }.
18c0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
18d0: 74 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e  tabLock = 0;.#en
18e0: 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  dif..      /* On
18f0: 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69  ce all the cooki
1900: 65 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72  es have been ver
1910: 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61  ified and transa
1920: 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a  ctions opened, .
1930: 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20        ** obtain 
1940: 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62  the required tab
1950: 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69  le-locks. This i
1960: 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
1970: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73   the .      ** s
1980: 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74  hared-cache feat
1990: 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  ure is enabled..
19a0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
19b0: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50  odeTableLocks(pP
19c0: 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  arse);..      /*
19d0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20   Initialize any 
19e0: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61  AUTOINCREMENT da
19f0: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65  ta structures re
1a00: 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  quired..      */
1a10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75  .      sqlite3Au
1a20: 74 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e  toincrementBegin
1a30: 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20  (pParse);..     
1a40: 20 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e   /* Code constan
1a50: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  t expressions th
1a60: 61 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65  at where factore
1a70: 64 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c  d out of inner l
1a80: 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66  oops */.      if
1a90: 28 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74  ( pParse->pConst
1aa0: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
1ab0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20  ExprList *pEL = 
1ac0: 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
1ad0: 70 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  pr;.        pPar
1ae0: 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
1af0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  r = 0;.        f
1b00: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e  or(i=0; i<pEL->n
1b10: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1b20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b30: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
1b40: 4c 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70  L->a[i].pExpr, p
1b50: 45 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73  EL->a[i].u.iCons
1b60: 74 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20  tExprReg);.     
1b70: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
1b80: 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20      /* Finally, 
1b90: 6a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65  jump back to the
1ba0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
1bb0: 65 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64  e executable cod
1bc0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  e. */.      sqli
1bd0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1be0: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 31 29 3b   OP_Goto, 0, 1);
1bf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
1c00: 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20 70  * Get the VDBE p
1c10: 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72  rogram ready for
1c20: 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a   execution.  */.
1c30: 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72 73    if( v && pPars
1c40: 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21 64  e->nErr==0 && !d
1c50: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1c60: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1c70: 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
1c80: 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 44 69 73  el==0 );  /* Dis
1c90: 61 62 6c 65 73 20 61 6e 64 20 72 65 2d 65 6e 61  ables and re-ena
1ca0: 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f 0a 20 20  bles match */.  
1cb0: 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75 6d 20 6f    /* A minimum o
1cc0: 66 20 6f 6e 65 20 63 75 72 73 6f 72 20 69 73 20  f one cursor is 
1cd0: 72 65 71 75 69 72 65 64 20 69 66 20 61 75 74 6f  required if auto
1ce0: 69 6e 63 72 65 6d 65 6e 74 20 69 73 20 75 73 65  increment is use
1cf0: 64 0a 20 20 20 20 2a 20 20 53 65 65 20 74 69 63  d.    *  See tic
1d00: 6b 65 74 20 5b 61 36 39 36 33 37 39 63 31 66 30  ket [a696379c1f0
1d10: 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20 69 66 28  8866] */.    if(
1d20: 20 70 50 61 72 73 65 2d 3e 70 41 69 6e 63 21 3d   pParse->pAinc!=
1d30: 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 61  0 && pParse->nTa
1d40: 62 3d 3d 30 20 29 20 70 50 61 72 73 65 2d 3e 6e  b==0 ) pParse->n
1d50: 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c  Tab = 1;.    sql
1d60: 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64  ite3VdbeMakeRead
1d70: 79 28 76 2c 20 70 50 61 72 73 65 29 3b 0a 20 20  y(v, pParse);.  
1d80: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
1d90: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
1da0: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
1db0: 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Set = 0;.  }else
1dc0: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  {.    pParse->rc
1dd0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1de0: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
1df0: 54 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Tab = 0;.  pPars
1e00: 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70  e->nMem = 0;.  p
1e10: 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b  Parse->nSet = 0;
1e20: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20  .  pParse->nVar 
1e30: 3d 20 30 3b 0a 20 20 44 62 4d 61 73 6b 5a 65 72  = 0;.  DbMaskZer
1e40: 6f 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  o(pParse->cookie
1e50: 4d 61 73 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Mask);.}../*.** 
1e60: 52 75 6e 20 74 68 65 20 70 61 72 73 65 72 20 61  Run the parser a
1e70: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  nd code generato
1e80: 72 20 72 65 63 75 72 73 69 76 65 6c 79 20 69 6e  r recursively in
1e90: 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61   order to genera
1ea0: 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74  te.** code for t
1eb0: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
1ec0: 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20   given onto the 
1ed0: 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72 73  end of the pPars
1ee0: 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72  e context.** cur
1ef0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
1f00: 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e  struction.  When
1f10: 20 74 68 65 20 70 61 72 73 65 72 20 69 73 20 72   the parser is r
1f20: 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a  un recursively.*
1f30: 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68 65 20  * this way, the 
1f40: 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73  final OP_Halt is
1f50: 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61 6e   not appended an
1f60: 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c 69  d other initiali
1f70: 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69  zation.** and fi
1f80: 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73  nalization steps
1f90: 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65 63   are omitted bec
1fa0: 61 75 73 65 20 74 68 6f 73 65 20 61 72 65 20 68  ause those are h
1fb0: 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a  andling by the.*
1fc0: 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72 73  * outermost pars
1fd0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76  er..**.** Not ev
1fe0: 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73 74  erything is nest
1ff0: 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63 69  able.  This faci
2000: 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e 65 64  lity is designed
2010: 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e   to permit.** IN
2020: 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e  SERT, UPDATE, an
2030: 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69  d DELETE operati
2040: 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c 49  ons against SQLI
2050: 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65 0a  TE_MASTER.  Use.
2060: 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20 64  ** care if you d
2070: 65 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f 20  ecide to try to 
2080: 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  use this routine
2090: 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20   for some other 
20a0: 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69  purposes..*/.voi
20b0: 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50  d sqlite3NestedP
20c0: 61 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  arse(Parse *pPar
20d0: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
20e0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
20f0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63   va_list ap;.  c
2100: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61  har *zSql;.  cha
2110: 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
2120: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
2130: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 20 64 65  pParse->db;.# de
2140: 66 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28 73  fine SAVE_SZ  (s
2150: 69 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20 6f  izeof(Parse) - o
2160: 66 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e 56  ffsetof(Parse,nV
2170: 61 72 29 29 0a 20 20 63 68 61 72 20 73 61 76 65  ar)).  char save
2180: 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20  Buf[SAVE_SZ];.. 
2190: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
21a0: 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  r ) return;.  as
21b0: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65  sert( pParse->ne
21c0: 73 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e  sted<10 );  /* N
21d0: 65 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e  esting should on
21e0: 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64  ly be of limited
21f0: 20 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73   depth */.  va_s
2200: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
2210: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
2220: 74 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20  te3VMPrintf(db, 
2230: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
2240: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66  va_end(ap);.  if
2250: 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
2260: 20 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20   return;   /* A 
2270: 6d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  malloc must have
2280: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20   failed */.  }. 
2290: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b   pParse->nested+
22a0: 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65  +;.  memcpy(save
22b0: 42 75 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56  Buf, &pParse->nV
22c0: 61 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20  ar, SAVE_SZ);.  
22d0: 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d 3e  memset(&pParse->
22e0: 6e 56 61 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a  nVar, 0, SAVE_SZ
22f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 75 6e 50  );.  sqlite3RunP
2300: 61 72 73 65 72 28 70 50 61 72 73 65 2c 20 7a 53  arser(pParse, zS
2310: 71 6c 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  ql, &zErrMsg);. 
2320: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2330: 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73  b, zErrMsg);.  s
2340: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2350: 20 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79   zSql);.  memcpy
2360: 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20  (&pParse->nVar, 
2370: 73 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53 5a  saveBuf, SAVE_SZ
2380: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73  );.  pParse->nes
2390: 74 65 64 2d 2d 3b 0a 7d 0a 0a 23 69 66 20 53 51  ted--;.}..#if SQ
23a0: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
23b0: 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 52  TICATION./*.** R
23c0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 7a 54  eturn TRUE if zT
23d0: 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65  able is the name
23e0: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 74   of the system t
23f0: 61 62 6c 65 20 74 68 61 74 20 73 74 6f 72 65 73  able that stores
2400: 20 74 68 65 0a 2a 2a 20 6c 69 73 74 20 6f 66 20   the.** list of 
2410: 75 73 65 72 73 20 61 6e 64 20 74 68 65 69 72 20  users and their 
2420: 61 63 63 65 73 73 20 63 72 65 64 65 6e 74 69 61  access credentia
2430: 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ls..*/.int sqlit
2440: 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28  e3UserAuthTable(
2450: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
2460: 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  le){.  return sq
2470: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54  lite3_stricmp(zT
2480: 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 75 73  able, "sqlite_us
2490: 65 72 22 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69  er")==0;.}.#endi
24a0: 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  f../*.** Locate 
24b0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
24c0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
24d0: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
24e0: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
24f0: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
2500: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
2510: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
2520: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
2530: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
2540: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
2550: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
2560: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
2570: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
2580: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
2590: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
25a0: 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62  ched for the tab
25b0: 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69  le and the.** fi
25c0: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62  rst matching tab
25d0: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  le is returned. 
25e0: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f   (No checking fo
25f0: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
2600: 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f  e.** names is do
2610: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
2620: 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66   order is TEMP f
2630: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2640: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78   then any.** aux
2650: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
2660: 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65   added using the
2670: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
2680: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
2690: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
26a0: 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  le()..*/.Table *
26b0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
26c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
26d0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
26e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
26f0: 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  tabase){.  Table
2700: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
2710: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65  ;..  /* All mute
2720: 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  xes are required
2730: 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
2740: 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77  ss.  Make sure w
2750: 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a  e hold them. */.
2760: 20 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62    assert( zDatab
2770: 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase!=0 || sqlite
2780: 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
2790: 74 65 78 65 73 28 64 62 29 20 29 3b 0a 23 69 66  texes(db) );.#if
27a0: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
27b0: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 2f 2a  HENTICATION.  /*
27c0: 20 4f 6e 6c 79 20 74 68 65 20 61 64 6d 69 6e 20   Only the admin 
27d0: 75 73 65 72 20 69 73 20 61 6c 6c 6f 77 65 64 20  user is allowed 
27e0: 74 6f 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  to know that the
27f0: 20 73 71 6c 69 74 65 5f 75 73 65 72 20 74 61 62   sqlite_user tab
2800: 6c 65 0a 20 20 2a 2a 20 65 78 69 73 74 73 20 2a  le.  ** exists *
2810: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68  /.  if( db->auth
2820: 2e 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48  .authLevel<UAUTH
2830: 5f 41 64 6d 69 6e 20 26 26 20 73 71 6c 69 74 65  _Admin && sqlite
2840: 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 7a  3UserAuthTable(z
2850: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
2860: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
2870: 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 4f 4d 49  ndif.  for(i=OMI
2880: 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e  T_TEMPDB; i<db->
2890: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
28a0: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
28b0: 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61  ^1 : i;   /* Sea
28c0: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
28d0: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20  MAIN */.    if( 
28e0: 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26 26 20  zDatabase!=0 && 
28f0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
2900: 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44  Database, db->aD
2910: 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f  b[j].zName) ) co
2920: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
2930: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
2940: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a  aMutexHeld(db, j
2950: 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 20 3d 20  , 0) );.    p = 
2960: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
2970: 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68  &db->aDb[j].pSch
2980: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e  ema->tblHash, zN
2990: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20  ame);.    if( p 
29a0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
29b0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
29c0: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
29d0: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
29e0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
29f0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
2a00: 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67  abase.** table g
2a10: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
2a20: 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20   that table and 
2a30: 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65  (optionally) the
2a40: 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20   name of the.** 
2a50: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
2a60: 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20  ing the table.  
2a70: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
2a80: 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20  ot found.  Also 
2a90: 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f  leave an.** erro
2aa0: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
2ab0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
2ac0: 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
2ad0: 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
2ae0: 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69  routine and sqli
2af0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69  te3FindTable() i
2b00: 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72  s that this.** r
2b10: 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e  outine leaves an
2b20: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
2b30: 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
2b40: 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74  g where.** sqlit
2b50: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f  e3FindTable() do
2b60: 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65  es not..*/.Table
2b70: 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54   *sqlite3LocateT
2b80: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
2b90: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
2ba0: 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69  * context in whi
2bb0: 63 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72  ch to report err
2bc0: 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  ors */.  int isV
2bd0: 69 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20  iew,            
2be0: 2f 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69  /* True if looki
2bf0: 6e 67 20 66 6f 72 20 61 20 56 49 45 57 20 72 61  ng for a VIEW ra
2c00: 74 68 65 72 20 74 68 61 6e 20 61 20 54 41 42 4c  ther than a TABL
2c10: 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  E */.  const cha
2c20: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  r *zName,     /*
2c30: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
2c40: 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  le we are lookin
2c50: 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  g for */.  const
2c60: 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20   char *zDbase   
2c70: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2c80: 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68   database.  Migh
2c90: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
2ca0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f    Table *p;..  /
2cb0: 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
2cc0: 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
2cd0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2ce0: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
2cf0: 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
2d00: 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
2d10: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
2d20: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
2d30: 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
2d40: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
2d50: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2d60: 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   }..  p = sqlite
2d70: 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
2d80: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44  e->db, zName, zD
2d90: 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  base);.  if( p==
2da0: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
2db0: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69  har *zMsg = isVi
2dc0: 65 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69  ew ? "no such vi
2dd0: 65 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74  ew" : "no such t
2de0: 61 62 6c 65 22 3b 0a 20 20 20 20 69 66 28 20 7a  able";.    if( z
2df0: 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73  Dbase ){.      s
2e00: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2e10: 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25  Parse, "%s: %s.%
2e20: 73 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65  s", zMsg, zDbase
2e30: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  , zName);.    }e
2e40: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2e50: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2e60: 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73  e, "%s: %s", zMs
2e70: 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  g, zName);.    }
2e80: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65  .    pParse->che
2e90: 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
2ea0: 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  }.#if SQLITE_USE
2eb0: 52 5f 41 55 54 48 45 4e 49 43 41 54 49 4f 4e 0a  R_AUTHENICATION.
2ec0: 20 20 65 6c 73 65 20 69 66 28 20 70 50 61 72 73    else if( pPars
2ed0: 65 2d 3e 64 62 2d 3e 61 75 74 68 2e 61 75 74 68  e->db->auth.auth
2ee0: 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65 72  Level<UAUTH_User
2ef0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
2f00: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2f10: 22 75 73 65 72 20 6e 6f 74 20 61 75 74 68 65 6e  "user not authen
2f20: 74 69 63 61 74 65 64 22 29 3b 0a 20 20 20 20 70  ticated");.    p
2f30: 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
2f40: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
2f50: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
2f60: 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65   table identifie
2f70: 64 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54  d by *p..**.** T
2f80: 68 69 73 20 69 73 20 61 20 77 72 61 70 70 65 72  his is a wrapper
2f90: 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 4c   around sqlite3L
2fa0: 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 20 54 68  ocateTable(). Th
2fb0: 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
2fc0: 77 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 4c  ween.** sqlite3L
2fd0: 6f 63 61 74 65 54 61 62 6c 65 28 29 20 61 6e 64  ocateTable() and
2fe0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2ff0: 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63  s that this func
3000: 74 69 6f 6e 20 72 65 73 74 72 69 63 74 73 0a 2a  tion restricts.*
3010: 2a 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20  * the search to 
3020: 73 63 68 65 6d 61 20 28 70 2d 3e 70 53 63 68 65  schema (p->pSche
3030: 6d 61 29 20 69 66 20 69 74 20 69 73 20 6e 6f 74  ma) if it is not
3040: 20 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68 65 6d   NULL. p->pSchem
3050: 61 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f 6e 2d  a may be.** non-
3060: 4e 55 4c 4c 20 69 66 20 69 74 20 69 73 20 70 61  NULL if it is pa
3070: 72 74 20 6f 66 20 61 20 76 69 65 77 20 6f 72 20  rt of a view or 
3080: 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20  trigger program 
3090: 64 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65 65 0a  definition. See.
30a0: 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63  ** sqlite3FixSrc
30b0: 4c 69 73 74 28 29 20 66 6f 72 20 64 65 74 61 69  List() for detai
30c0: 6c 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  ls..*/.Table *sq
30d0: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
30e0: 49 74 65 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Item(.  Parse *p
30f0: 50 61 72 73 65 2c 20 0a 20 20 69 6e 74 20 69 73  Parse, .  int is
3100: 56 69 65 77 2c 20 0a 20 20 73 74 72 75 63 74 20  View, .  struct 
3110: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 0a  SrcList_item *p.
3120: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
3130: 2a 7a 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20  *zDb;.  assert( 
3140: 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20 7c 7c  p->pSchema==0 ||
3150: 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30   p->zDatabase==0
3160: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 63   );.  if( p->pSc
3170: 68 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e 74 20  hema ){.    int 
3180: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
3190: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
31a0: 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d  e->db, p->pSchem
31b0: 61 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 70 50  a);.    zDb = pP
31c0: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
31d0: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73  b].zName;.  }els
31e0: 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20 70 2d 3e  e{.    zDb = p->
31f0: 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a 20  zDatabase;.  }. 
3200: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4c   return sqlite3L
3210: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
3220: 65 2c 20 69 73 56 69 65 77 2c 20 70 2d 3e 7a 4e  e, isView, p->zN
3230: 61 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a 2f 2a  ame, zDb);.}../*
3240: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
3250: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
3260: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
3270: 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c  s .** a particul
3280: 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74  ar index given t
3290: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
32a0: 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65  index.** and the
32b0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
32c0: 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61  abase that conta
32d0: 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ins the index..*
32e0: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
32f0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
3300: 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69  * If zDatabase i
3310: 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73  s 0, all databas
3320: 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20  es are searched 
3330: 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  for the.** table
3340: 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d   and the first m
3350: 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73  atching index is
3360: 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20   returned.  (No 
3370: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20  checking.** for 
3380: 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20  duplicate index 
3390: 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20  names is done.) 
33a0: 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65   The search orde
33b0: 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72  r is.** TEMP fir
33c0: 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74  st, then MAIN, t
33d0: 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72  hen any auxiliar
33e0: 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65  y databases adde
33f0: 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41  d.** using the A
3400: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TTACH command..*
3410: 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33  /.Index *sqlite3
3420: 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65  FindIndex(sqlite
3430: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
3440: 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20  r *zName, const 
3450: 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e  char *zDb){.  In
3460: 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e  dex *p = 0;.  in
3470: 74 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75  t i;.  /* All mu
3480: 74 65 78 65 73 20 61 72 65 20 72 65 71 75 69 72  texes are requir
3490: 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63  ed for schema ac
34a0: 63 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65  cess.  Make sure
34b0: 20 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a   we hold them. *
34c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 44 62 21  /.  assert( zDb!
34d0: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72  =0 || sqlite3Btr
34e0: 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65  eeHoldsAllMutexe
34f0: 73 28 64 62 29 20 29 3b 0a 20 20 66 6f 72 28 69  s(db) );.  for(i
3500: 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c  =OMIT_TEMPDB; i<
3510: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
3520: 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29     int j = (i<2)
3530: 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20   ? i^1 : i;  /* 
3540: 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f  Search TEMP befo
3550: 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53  re MAIN */.    S
3560: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
3570: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68   db->aDb[j].pSch
3580: 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ema;.    assert(
3590: 20 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20   pSchema );.    
35a0: 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74  if( zDb && sqlit
35b0: 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64  e3StrICmp(zDb, d
35c0: 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29  b->aDb[j].zName)
35d0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
35e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
35f0: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
3600: 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20  db, j, 0) );.   
3610: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
3620: 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69  Find(&pSchema->i
3630: 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a  dxHash, zName);.
3640: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
3650: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
3660: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c  p;.}../*.** Recl
3670: 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75  aim the memory u
3680: 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a  sed by an index.
3690: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
36a0: 72 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  reeIndex(sqlite3
36b0: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b   *db, Index *p){
36c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
36d0: 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73  OMIT_ANALYZE.  s
36e0: 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65  qlite3DeleteInde
36f0: 78 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b  xSamples(db, p);
3700: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
3710: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
3720: 70 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  p->pPartIdxWhere
3730: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
3740: 65 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66  ee(db, p->zColAf
3750: 66 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 73 52  f);.  if( p->isR
3760: 65 73 69 7a 65 64 20 29 20 73 71 6c 69 74 65 33  esized ) sqlite3
3770: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a  DbFree(db, p->az
3780: 43 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20 53 51  Coll);.#ifdef SQ
3790: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
37a0: 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73 71 6c  3_OR_STAT4.  sql
37b0: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69 52  ite3_free(p->aiR
37c0: 6f 77 45 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20  owEst);.#endif. 
37d0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
37e0: 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
37f0: 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63 61  For the index ca
3800: 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68  lled zIdxName wh
3810: 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20  ich is found in 
3820: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 44 62  the database iDb
3830: 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74  ,.** unlike that
3840: 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20   index from its 
3850: 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76  Table then remov
3860: 65 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d  e the index from
3870: 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61  .** the index ha
3880: 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65  sh table and fre
3890: 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72  e all memory str
38a0: 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74  uctures associat
38b0: 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69  ed.** with the i
38c0: 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ndex..*/.void sq
38d0: 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65  lite3UnlinkAndDe
38e0: 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65  leteIndex(sqlite
38f0: 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20  3 *db, int iDb, 
3900: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78  const char *zIdx
3910: 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a  Name){.  Index *
3920: 70 49 6e 64 65 78 3b 0a 20 20 48 61 73 68 20 2a  pIndex;.  Hash *
3930: 70 48 61 73 68 3b 0a 0a 20 20 61 73 73 65 72 74  pHash;..  assert
3940: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
3950: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
3960: 2c 20 30 29 20 29 3b 0a 20 20 70 48 61 73 68 20  , 0) );.  pHash 
3970: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  = &db->aDb[iDb].
3980: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
3990: 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  ;.  pIndex = sql
39a0: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70  ite3HashInsert(p
39b0: 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20  Hash, zIdxName, 
39c0: 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  0);.  if( ALWAYS
39d0: 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20  (pIndex) ){.    
39e0: 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  if( pIndex->pTab
39f0: 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64  le->pIndex==pInd
3a00: 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64  ex ){.      pInd
3a10: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
3a20: 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  ex = pIndex->pNe
3a30: 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
3a40: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20       Index *p;. 
3a50: 20 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69 63       /* Justific
3a60: 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28  ation of ALWAYS(
3a70: 29 3b 20 20 54 68 65 20 69 6e 64 65 78 20 6d 75  );  The index mu
3a80: 73 74 20 62 65 20 6f 6e 20 74 68 65 20 6c 69 73  st be on the lis
3a90: 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e  t of.      ** in
3aa0: 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  dices. */.      
3ab0: 70 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  p = pIndex->pTab
3ac0: 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  le->pIndex;.    
3ad0: 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
3ae0: 70 29 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d  p) && p->pNext!=
3af0: 70 49 6e 64 65 78 20 29 7b 20 70 20 3d 20 70 2d  pIndex ){ p = p-
3b00: 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20 20  >pNext; }.      
3b10: 69 66 28 20 41 4c 57 41 59 53 28 70 20 26 26 20  if( ALWAYS(p && 
3b20: 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78  p->pNext==pIndex
3b30: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ) ){.        p->
3b40: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
3b50: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
3b60: 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64     }.    freeInd
3b70: 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
3b80: 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20    }.  db->flags 
3b90: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
3ba0: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
3bb0: 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20 74  * Look through t
3bc0: 68 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e 20  he list of open 
3bd0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 69  database files i
3be0: 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64 20  n db->aDb[] and 
3bf0: 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20 62  if.** any have b
3c00: 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d 6f  een closed, remo
3c10: 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65  ve them from the
3c20: 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63 61   list.  Realloca
3c30: 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61 44  te the.** db->aD
3c40: 62 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74 6f  b[] structure to
3c50: 20 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65 2c   a smaller size,
3c60: 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a   if possible..**
3c70: 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68 65  .** Entry 0 (the
3c80: 20 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73 65   "main" database
3c90: 29 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28 74  ) and entry 1 (t
3ca0: 68 65 20 22 74 65 6d 70 22 20 64 61 74 61 62 61  he "temp" databa
3cb0: 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65 72  se).** are never
3cc0: 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20   candidates for 
3cd0: 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64 2e  being collapsed.
3ce0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3cf0: 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65  CollapseDatabase
3d00: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64  Array(sqlite3 *d
3d10: 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  b){.  int i, j;.
3d20: 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64    for(i=j=2; i<d
3d30: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
3d40: 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62    struct Db *pDb
3d50: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
3d60: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
3d70: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
3d80: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3d90: 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db->zName);.    
3da0: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30    pDb->zName = 0
3db0: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
3dc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3dd0: 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  j<i ){.      db-
3de0: 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44  >aDb[j] = db->aD
3df0: 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b[i];.    }.    
3e00: 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  j++;.  }.  memse
3e10: 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30  t(&db->aDb[j], 0
3e20: 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69  , (db->nDb-j)*si
3e30: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29  zeof(db->aDb[j])
3e40: 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a  );.  db->nDb = j
3e50: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c  ;.  if( db->nDb<
3e60: 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64  =2 && db->aDb!=d
3e70: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a  b->aDbStatic ){.
3e80: 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61      memcpy(db->a
3e90: 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44  DbStatic, db->aD
3ea0: 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b, 2*sizeof(db->
3eb0: 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71  aDb[0]));.    sq
3ec0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3ed0: 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62  db->aDb);.    db
3ee0: 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53  ->aDb = db->aDbS
3ef0: 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  tatic;.  }.}../*
3f00: 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 73 63  .** Reset the sc
3f10: 68 65 6d 61 20 66 6f 72 20 74 68 65 20 64 61 74  hema for the dat
3f20: 61 62 61 73 65 20 61 74 20 69 6e 64 65 78 20 69  abase at index i
3f30: 44 62 2e 20 20 41 6c 73 6f 20 72 65 73 65 74 20  Db.  Also reset 
3f40: 74 68 65 0a 2a 2a 20 54 45 4d 50 20 73 63 68 65  the.** TEMP sche
3f50: 6d 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ma..*/.void sqli
3f60: 74 65 33 52 65 73 65 74 4f 6e 65 53 63 68 65 6d  te3ResetOneSchem
3f70: 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  a(sqlite3 *db, i
3f80: 6e 74 20 69 44 62 29 7b 0a 20 20 44 62 20 2a 70  nt iDb){.  Db *p
3f90: 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  Db;.  assert( iD
3fa0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20  b<db->nDb );..  
3fb0: 2f 2a 20 43 61 73 65 20 31 3a 20 20 52 65 73 65  /* Case 1:  Rese
3fc0: 74 20 74 68 65 20 73 69 6e 67 6c 65 20 73 63 68  t the single sch
3fd0: 65 6d 61 20 69 64 65 6e 74 69 66 69 65 64 20 62  ema identified b
3fe0: 79 20 69 44 62 20 2a 2f 0a 20 20 70 44 62 20 3d  y iDb */.  pDb =
3ff0: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
4000: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
4010: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
4020: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
4030: 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70    assert( pDb->p
4040: 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20 73  Schema!=0 );.  s
4050: 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61  qlite3SchemaClea
4060: 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b  r(pDb->pSchema);
4070: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 64 61  ..  /* If any da
4080: 74 61 62 61 73 65 20 6f 74 68 65 72 20 74 68 61  tabase other tha
4090: 6e 20 54 45 4d 50 20 69 73 20 72 65 73 65 74 2c  n TEMP is reset,
40a0: 20 74 68 65 6e 20 61 6c 73 6f 20 72 65 73 65 74   then also reset
40b0: 20 54 45 4d 50 0a 20 20 2a 2a 20 73 69 6e 63 65   TEMP.  ** since
40c0: 20 54 45 4d 50 20 6d 69 67 68 74 20 62 65 20 68   TEMP might be h
40d0: 6f 6c 64 69 6e 67 20 74 72 69 67 67 65 72 73 20  olding triggers 
40e0: 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74  that reference t
40f0: 61 62 6c 65 73 20 69 6e 20 74 68 65 0a 20 20 2a  ables in the.  *
4100: 2a 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  * other database
4110: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44 62  ..  */.  if( iDb
4120: 21 3d 31 20 29 7b 0a 20 20 20 20 70 44 62 20 3d  !=1 ){.    pDb =
4130: 20 26 64 62 2d 3e 61 44 62 5b 31 5d 3b 0a 20 20   &db->aDb[1];.  
4140: 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70    assert( pDb->p
4150: 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20 20  Schema!=0 );.   
4160: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c   sqlite3SchemaCl
4170: 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61  ear(pDb->pSchema
4180: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b  );.  }.  return;
4190: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
41a0: 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  all schema infor
41b0: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 6c 6c 20  mation from all 
41c0: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
41d0: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a  es (including.**
41e0: 20 22 6d 61 69 6e 22 20 61 6e 64 20 22 74 65 6d   "main" and "tem
41f0: 70 22 29 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  p") for a single
4200: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
4210: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
4220: 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
4230: 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
4240: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
4250: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
4260: 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
4270: 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  b);.  for(i=0; i
4280: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
4290: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
42a0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
42b0: 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20  f( pDb->pSchema 
42c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
42d0: 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d  SchemaClear(pDb-
42e0: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  >pSchema);.    }
42f0: 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73  .  }.  db->flags
4300: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65   &= ~SQLITE_Inte
4310: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71 6c  rnChanges;.  sql
4320: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69  ite3VtabUnlockLi
4330: 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  st(db);.  sqlite
4340: 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
4350: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c  b);.  sqlite3Col
4360: 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72 72  lapseDatabaseArr
4370: 61 79 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ay(db);.}../*.**
4380: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4390: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63   called when a c
43a0: 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f  ommit occurs..*/
43b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
43c0: 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
43d0: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
43e0: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
43f0: 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  ~SQLITE_InternCh
4400: 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  anges;.}../*.** 
4410: 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79 20 61 6c  Delete memory al
4420: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
4430: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 20  column names of 
4440: 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  a table or view 
4450: 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65 2e 61 43  (the.** Table.aC
4460: 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a 2a 2f 0a  ol[] array)..*/.
4470: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
4480: 74 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61  teDeleteColumnNa
4490: 6d 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  mes(sqlite3 *db,
44a0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
44b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75  .  int i;.  Colu
44c0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65  mn *pCol;.  asse
44d0: 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29 3b  rt( pTable!=0 );
44e0: 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20 70  .  if( (pCol = p
44f0: 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20  Table->aCol)!=0 
4500: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
4510: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
4520: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
4530: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4540: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  e(db, pCol->zNam
4550: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
4560: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
4570: 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20  pCol->pDflt);.  
4580: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4590: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66 6c  e(db, pCol->zDfl
45a0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
45b0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
45c0: 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20  ->zType);.      
45d0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
45e0: 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a  , pCol->zColl);.
45f0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
4600: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
4610: 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 7d  le->aCol);.  }.}
4620: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
4630: 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73  he memory data s
4640: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
4650: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
4660: 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e  ven.** Table.  N
4670: 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
4680: 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68  de to disk by th
4690: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
46a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a  * This routine j
46b0: 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65 20  ust deletes the 
46c0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 20  data structure. 
46d0: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c   It does not unl
46e0: 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ink.** the table
46f0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
4700: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
4710: 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65  ble.  But it doe
4720: 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d  s destroy.** mem
4730: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f  ory structures o
4740: 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e  f the indices an
4750: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  d foreign keys a
4760: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
4770: 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  ** the table..**
4780: 0a 2a 2a 20 54 68 65 20 64 62 20 70 61 72 61 6d  .** The db param
4790: 65 74 65 72 20 69 73 20 6f 70 74 69 6f 6e 61 6c  eter is optional
47a0: 2e 20 20 49 74 20 69 73 20 6e 65 65 64 65 64 20  .  It is needed 
47b0: 69 66 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  if the Table obj
47c0: 65 63 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  ect .** contains
47d0: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
47e0: 79 2e 20 20 28 54 61 62 6c 65 20 6f 62 6a 65 63  y.  (Table objec
47f0: 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  ts in the schema
4800: 20 64 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 6c   do not use.** l
4810: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2c  ookaside memory,
4820: 20 62 75 74 20 73 6f 6d 65 20 65 70 68 65 6d 65   but some epheme
4830: 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  ral Table object
4840: 73 20 64 6f 2e 29 20 20 4f 72 20 74 68 65 0a 2a  s do.)  Or the.*
4850: 2a 20 64 62 20 70 61 72 61 6d 65 74 65 72 20 63  * db parameter c
4860: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
4870: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
4880: 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65 20   to measure the 
4890: 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73 65 64 20 62  memory.** used b
48a0: 79 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  y the Table obje
48b0: 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ct..*/.void sqli
48c0: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 73  te3DeleteTable(s
48d0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c  qlite3 *db, Tabl
48e0: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e  e *pTable){.  In
48f0: 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e  dex *pIndex, *pN
4900: 65 78 74 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  ext;.  TESTONLY(
4910: 20 69 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64 65 3b   int nLookaside;
4920: 20 29 20 2f 2a 20 55 73 65 64 20 74 6f 20 76 65   ) /* Used to ve
4930: 72 69 66 79 20 6c 6f 6f 6b 61 73 69 64 65 20 6e  rify lookaside n
4940: 6f 74 20 75 73 65 64 20 66 6f 72 20 73 63 68 65  ot used for sche
4950: 6d 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ma */..  assert(
4960: 20 21 70 54 61 62 6c 65 20 7c 7c 20 70 54 61 62   !pTable || pTab
4970: 6c 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20  le->nRef>0 );.. 
4980: 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74   /* Do not delet
4990: 65 20 74 68 65 20 74 61 62 6c 65 20 75 6e 74 69  e the table unti
49a0: 6c 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  l the reference 
49b0: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
49c0: 72 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 21 70 54  ro. */.  if( !pT
49d0: 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  able ) return;. 
49e0: 20 69 66 28 20 28 28 21 64 62 20 7c 7c 20 64 62   if( ((!db || db
49f0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
4a00: 30 29 20 26 26 20 28 2d 2d 70 54 61 62 6c 65 2d  0) && (--pTable-
4a10: 3e 6e 52 65 66 29 3e 30 29 20 29 20 72 65 74 75  >nRef)>0) ) retu
4a20: 72 6e 3b 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64  rn;..  /* Record
4a30: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
4a40: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 6f 6b 61  utstanding looka
4a50: 73 69 64 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  side allocations
4a60: 20 69 6e 20 73 63 68 65 6d 61 20 54 61 62 6c 65   in schema Table
4a70: 73 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20  s.  ** prior to 
4a80: 64 6f 69 6e 67 20 61 6e 79 20 66 72 65 65 28 29  doing any free()
4a90: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 53 69   operations.  Si
4aa0: 6e 63 65 20 73 63 68 65 6d 61 20 54 61 62 6c 65  nce schema Table
4ab0: 73 20 64 6f 20 6e 6f 74 20 75 73 65 0a 20 20 2a  s do not use.  *
4ac0: 2a 20 6c 6f 6f 6b 61 73 69 64 65 2c 20 74 68 69  * lookaside, thi
4ad0: 73 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c 64 20  s number should 
4ae0: 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f 0a 20  not change. */. 
4af0: 20 54 45 53 54 4f 4e 4c 59 28 20 6e 4c 6f 6f 6b   TESTONLY( nLook
4b00: 61 73 69 64 65 20 3d 20 28 64 62 20 26 26 20 28  aside = (db && (
4b10: 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73  pTable->tabFlags
4b20: 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
4b30: 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20  ==0) ?.         
4b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b50: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f  db->lookaside.nO
4b60: 75 74 20 3a 20 30 20 29 3b 0a 0a 20 20 2f 2a 20  ut : 0 );..  /* 
4b70: 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63  Delete all indic
4b80: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
4b90: 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  th this table. *
4ba0: 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d  /.  for(pIndex =
4bb0: 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b   pTable->pIndex;
4bc0: 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d   pIndex; pIndex=
4bd0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
4be0: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
4bf0: 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
4c00: 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d  Index->pSchema==
4c10: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20  pTable->pSchema 
4c20: 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 20 7c  );.    if( !db |
4c30: 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  | db->pnBytesFre
4c40: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  ed==0 ){.      c
4c50: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e  har *zName = pIn
4c60: 64 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20  dex->zName; .   
4c70: 20 20 20 54 45 53 54 4f 4e 4c 59 20 28 20 49 6e     TESTONLY ( In
4c80: 64 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20 73 71  dex *pOld = ) sq
4c90: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
4ca0: 0a 20 20 20 20 20 20 20 20 20 26 70 49 6e 64 65  .         &pInde
4cb0: 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  x->pSchema->idxH
4cc0: 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a 20 20  ash, zName, 0.  
4cd0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
4ce0: 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71  ert( db==0 || sq
4cf0: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
4d00: 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64  Held(db, 0, pInd
4d10: 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a  ex->pSchema) );.
4d20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
4d30: 6c 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20 70 4f  ld==pIndex || pO
4d40: 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  ld==0 );.    }. 
4d50: 20 20 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c     freeIndex(db,
4d60: 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20   pIndex);.  }.. 
4d70: 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 66   /* Delete any f
4d80: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74 74 61  oreign keys atta
4d90: 63 68 65 64 20 74 6f 20 74 68 69 73 20 74 61 62  ched to this tab
4da0: 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  le. */.  sqlite3
4db0: 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61  FkDelete(db, pTa
4dc0: 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  ble);..  /* Dele
4dd0: 74 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  te the Table str
4de0: 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20  ucture itself.. 
4df0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 44 65 6c 65   */.  sqliteDele
4e00: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62  teColumnNames(db
4e10: 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c  , pTable);.  sql
4e20: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4e30: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Table->zName);. 
4e40: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4e50: 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41  b, pTable->zColA
4e60: 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ff);.  sqlite3Se
4e70: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
4e80: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b  Table->pSelect);
4e90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4ea0: 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 73 71 6c  OMIT_CHECK.  sql
4eb0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
4ec0: 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70  te(db, pTable->p
4ed0: 43 68 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 23  Check);.#endif.#
4ee0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4ef0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
4f00: 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65    sqlite3VtabCle
4f10: 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  ar(db, pTable);.
4f20: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
4f30: 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c  DbFree(db, pTabl
4f40: 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79  e);..  /* Verify
4f50: 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73 69   that no lookasi
4f60: 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20 75 73  de memory was us
4f70: 65 64 20 62 79 20 73 63 68 65 6d 61 20 74 61 62  ed by schema tab
4f80: 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  les */.  assert(
4f90: 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30 20 7c   nLookaside==0 |
4fa0: 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 64 62  | nLookaside==db
4fb0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74  ->lookaside.nOut
4fc0: 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c   );.}../*.** Unl
4fd0: 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61  ink the given ta
4fe0: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73  ble from the has
4ff0: 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65  h tables and the
5000: 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74   delete the.** t
5010: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 77  able structure w
5020: 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69  ith all its indi
5030: 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20  ces and foreign 
5040: 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  keys..*/.void sq
5050: 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65  lite3UnlinkAndDe
5060: 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65  leteTable(sqlite
5070: 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20  3 *db, int iDb, 
5080: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
5090: 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Name){.  Table *
50a0: 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20  p;.  Db *pDb;.. 
50b0: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
50c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
50d0: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
50e0: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  b );.  assert( z
50f0: 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20 61 73 73  TabName );.  ass
5100: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
5110: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
5120: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 74 65 73  iDb, 0) );.  tes
5130: 74 63 61 73 65 28 20 7a 54 61 62 4e 61 6d 65 5b  tcase( zTabName[
5140: 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a 65 72  0]==0 );  /* Zer
5150: 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c 65 20 6e  o-length table n
5160: 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64  ames are allowed
5170: 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62 2d   */.  pDb = &db-
5180: 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d  >aDb[iDb];.  p =
5190: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
51a0: 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61  rt(&pDb->pSchema
51b0: 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e  ->tblHash, zTabN
51c0: 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ame, 0);.  sqlit
51d0: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
51e0: 2c 20 70 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  , p);.  db->flag
51f0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
5200: 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a  rnChanges;.}../*
5210: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65  .** Given a toke
5220: 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72 69  n, return a stri
5230: 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73  ng that consists
5240: 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66 20   of the text of 
5250: 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 2e 20 20  that.** token.  
5260: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
5270: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
5280: 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64  g.** is obtained
5290: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
52a0: 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65  oc() and must be
52b0: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
52c0: 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
52d0: 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 71 75 6f  n..**.** Any quo
52e0: 74 61 74 69 6f 6e 20 6d 61 72 6b 73 20 28 65 78  tation marks (ex
52f0: 3a 20 20 22 6e 61 6d 65 22 2c 20 27 6e 61 6d 65  :  "name", 'name
5300: 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72 20 60 6e  ', [name], or `n
5310: 61 6d 65 60 29 20 74 68 61 74 0a 2a 2a 20 73 75  ame`) that.** su
5320: 72 72 6f 75 6e 64 20 74 68 65 20 62 6f 64 79 20  rround the body 
5330: 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 61 72 65  of the token are
5340: 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20   removed..**.** 
5350: 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74 65 6e  Tokens are often
5360: 20 6a 75 73 74 20 70 6f 69 6e 74 65 72 73 20 69   just pointers i
5370: 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nto the original
5380: 20 53 51 4c 20 74 65 78 74 20 61 6e 64 20 73 6f   SQL text and so
5390: 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30 30  .** are not \000
53a0: 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20   terminated and 
53b0: 61 72 65 20 6e 6f 74 20 70 65 72 73 69 73 74 65  are not persiste
53c0: 6e 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65  nt.  The returne
53d0: 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c  d string.** is \
53e0: 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61  000 terminated a
53f0: 6e 64 20 69 73 20 70 65 72 73 69 73 74 65 6e 74  nd is persistent
5400: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
5410: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
5420: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b  sqlite3 *db, Tok
5430: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68  en *pName){.  ch
5440: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28  ar *zName;.  if(
5450: 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e   pName ){.    zN
5460: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
5470: 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72  trNDup(db, (char
5480: 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  *)pName->z, pNam
5490: 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  e->n);.    sqlit
54a0: 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
54b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
54c0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Name = 0;.  }.  
54d0: 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a  return zName;.}.
54e0: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  ./*.** Open the 
54f0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
5500: 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64 61  ble stored in da
5510: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69 44  tabase number iD
5520: 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67  b for.** writing
5530: 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6f  . The table is o
5540: 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72 73  pened using curs
5550: 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  or 0..*/.void sq
5560: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
5570: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 2c 20 69  able(Parse *p, i
5580: 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20  nt iDb){.  Vdbe 
5590: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
55a0: 64 62 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  dbe(p);.  sqlite
55b0: 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 44  3TableLock(p, iD
55c0: 62 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  b, MASTER_ROOT, 
55d0: 31 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  1, SCHEMA_TABLE(
55e0: 69 44 62 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  iDb));.  sqlite3
55f0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
5600: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30   OP_OpenWrite, 0
5610: 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 69  , MASTER_ROOT, i
5620: 44 62 2c 20 35 29 3b 0a 20 20 69 66 28 20 70 2d  Db, 5);.  if( p-
5630: 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20  >nTab==0 ){.    
5640: 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 7d  p->nTab = 1;.  }
5650: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
5660: 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73  ter zName points
5670: 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e   to a nul-termin
5680: 61 74 65 64 20 62 75 66 66 65 72 20 63 6f 6e 74  ated buffer cont
5690: 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 0a  aining the name.
56a0: 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  ** of a database
56b0: 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22   ("main", "temp"
56c0: 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   or the name of 
56d0: 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e  an attached db).
56e0: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
56f0: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 69 6e  n returns the in
5700: 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  dex of the named
5710: 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d   database in db-
5720: 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d 31  >aDb[], or.** -1
5730: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62   if the named db
5740: 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
5750: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5760: 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69 74  FindDbName(sqlit
5770: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
5780: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
5790: 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  t i = -1;       
57a0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
57b0: 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a 4e  mber */.  if( zN
57c0: 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20 2a 70  ame ){.    Db *p
57d0: 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20  Db;.    int n = 
57e0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
57f0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28  zName);.    for(
5800: 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70  i=(db->nDb-1), p
5810: 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20  Db=&db->aDb[i]; 
5820: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d  i>=0; i--, pDb--
5830: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 21 4f  ){.      if( (!O
5840: 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69 21  MIT_TEMPDB || i!
5850: 3d 31 20 29 20 26 26 20 6e 3d 3d 73 71 6c 69 74  =1 ) && n==sqlit
5860: 65 33 53 74 72 6c 65 6e 33 30 28 70 44 62 2d 3e  e3Strlen30(pDb->
5870: 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20 20 20 20  zName) && .     
5880: 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53       0==sqlite3S
5890: 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d  trICmp(pDb->zNam
58a0: 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
58b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
58c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
58d0: 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a  return i;.}../*.
58e0: 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e  ** The token *pN
58f0: 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ame contains the
5900: 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62   name of a datab
5910: 61 73 65 20 28 65 69 74 68 65 72 20 22 6d 61 69  ase (either "mai
5920: 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20  n" or.** "temp" 
5930: 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  or the name of a
5940: 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20  n attached db). 
5950: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
5960: 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65  urns the.** inde
5970: 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64  x of the named d
5980: 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61  atabase in db->a
5990: 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74  Db[], or -1 if t
59a0: 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20  he named db .** 
59b0: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a  does not exist..
59c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69  */.int sqlite3Fi
59d0: 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a 64 62  ndDb(sqlite3 *db
59e0: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
59f0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a10: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
5a20: 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ase number */.  
5a30: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
5a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a50: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20       /* Name we 
5a60: 61 72 65 20 73 65 61 72 63 68 69 6e 67 20 66 6f  are searching fo
5a70: 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  r */.  zName = s
5a80: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
5a90: 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ken(db, pName);.
5aa0: 20 20 69 20 3d 20 73 71 6c 69 74 65 33 46 69 6e    i = sqlite3Fin
5ab0: 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 4e 61 6d  dDbName(db, zNam
5ac0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
5ad0: 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
5ae0: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f    return i;.}../
5af0: 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76  * The table or v
5b00: 69 65 77 20 6f 72 20 74 72 69 67 67 65 72 20 6e  iew or trigger n
5b10: 61 6d 65 20 69 73 20 70 61 73 73 65 64 20 74 6f  ame is passed to
5b20: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69   this routine vi
5b30: 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d  a tokens.** pNam
5b40: 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49  e1 and pName2. I
5b50: 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  f the table name
5b60: 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69   was fully quali
5b70: 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  fied, for exampl
5b80: 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20  e:.**.** CREATE 
5b90: 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e  TABLE xxx.yyy (.
5ba0: 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e  ..);.** .** Then
5bb0: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
5bc0: 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d  o "xxx" and pNam
5bd0: 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65  e2 "yyy". On the
5be0: 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 2a   other hand if.*
5bf0: 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  * the table name
5c00: 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75   is not fully qu
5c10: 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a  alified, i.e.:.*
5c20: 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c  *.** CREATE TABL
5c30: 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a  E yyy(...);.**.*
5c40: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
5c50: 20 73 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e   set to "yyy" an
5c60: 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a  d pName2 is ""..
5c70: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
5c80: 6e 65 20 73 65 74 73 20 74 68 65 20 2a 70 70 55  ne sets the *ppU
5c90: 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f  nqual pointer to
5ca0: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f   point at the to
5cb0: 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a  ken (pName1 or.*
5cc0: 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73  * pName2) that s
5cd0: 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c  tores the unqual
5ce0: 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65  ified table name
5cf0: 2e 20 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20  .  The index of 
5d00: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
5d10: 22 78 78 78 22 20 69 73 20 72 65 74 75 72 6e 65  "xxx" is returne
5d20: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5d30: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20  3TwoPartName(.  
5d40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5d50: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
5d60: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
5d70: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
5d80: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
5d90: 20 20 20 20 2f 2a 20 54 68 65 20 22 78 78 78 22      /* The "xxx"
5da0: 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78   in the name "xx
5db0: 78 2e 79 79 79 22 20 6f 72 20 22 78 78 78 22 20  x.yyy" or "xxx" 
5dc0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
5dd0: 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e2,      /* The 
5de0: 22 79 79 79 22 20 69 6e 20 74 68 65 20 6e 61 6d  "yyy" in the nam
5df0: 65 20 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20  e "xxx.yyy" */. 
5e00: 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c   Token **pUnqual
5e10: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
5e20: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6f 62  e unqualified ob
5e30: 6a 65 63 74 20 6e 61 6d 65 20 68 65 72 65 20 2a  ject name here *
5e40: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  /.){.  int iDb; 
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e60: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
5e70: 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a 65 63  olding the objec
5e80: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
5e90: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
5ea0: 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ..  if( ALWAYS(p
5eb0: 4e 61 6d 65 32 21 3d 30 29 20 26 26 20 70 4e 61  Name2!=0) && pNa
5ec0: 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  me2->n>0 ){.    
5ed0: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
5ee0: 79 20 29 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  y ) {.      sqli
5ef0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5f00: 73 65 2c 20 22 63 6f 72 72 75 70 74 20 64 61 74  se, "corrupt dat
5f10: 61 62 61 73 65 22 29 3b 0a 20 20 20 20 20 20 72  abase");.      r
5f20: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
5f30: 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70      *pUnqual = p
5f40: 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d  Name2;.    iDb =
5f50: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64   sqlite3FindDb(d
5f60: 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  b, pName1);.    
5f70: 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20  if( iDb<0 ){.   
5f80: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
5f90: 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
5fa0: 6f 77 6e 20 64 61 74 61 62 61 73 65 20 25 54 22  own database %T"
5fb0: 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20  , pName1);.     
5fc0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
5fd0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  }.  }else{.    a
5fe0: 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e  ssert( db->init.
5ff0: 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e  iDb==0 || db->in
6000: 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 69  it.busy );.    i
6010: 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44  Db = db->init.iD
6020: 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20  b;.    *pUnqual 
6030: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20  = pName1;.  }.  
6040: 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f  return iDb;.}../
6050: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6060: 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65  e is used to che
6070: 63 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38 20  ck if the UTF-8 
6080: 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20  string zName is 
6090: 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61  a legal.** unqua
60a0: 6c 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20  lified name for 
60b0: 61 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a  a new schema obj
60c0: 65 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65  ect (table, inde
60d0: 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72  x, view or.** tr
60e0: 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65  igger). All name
60f0: 73 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65  s are legal exce
6100: 70 74 20 74 68 6f 73 65 20 74 68 61 74 20 62 65  pt those that be
6110: 67 69 6e 20 77 69 74 68 20 74 68 65 20 73 74 72  gin with the str
6120: 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22  ing.** "sqlite_"
6130: 20 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65   (in upper, lowe
6140: 72 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29  r or mixed case)
6150: 2e 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f  . This portion o
6160: 66 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a  f the namespace.
6170: 2a 2a 20 69 73 20 72 65 73 65 72 76 65 64 20 66  ** is reserved f
6180: 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e  or internal use.
6190: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
61a0: 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50  heckObjectName(P
61b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
61c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
61d0: 7b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  {.  if( !pParse-
61e0: 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  >db->init.busy &
61f0: 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  & pParse->nested
6200: 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26  ==0 .          &
6210: 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  & (pParse->db->f
6220: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72  lags & SQLITE_Wr
6230: 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20  iteSchema)==0.  
6240: 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
6250: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e  lite3StrNICmp(zN
6260: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
6270: 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  7) ){.    sqlite
6280: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
6290: 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72  , "object name r
62a0: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
62b0: 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a  rnal use: %s", z
62c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
62d0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
62e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
62f0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6300: 20 52 65 74 75 72 6e 20 74 68 65 20 50 52 49 4d   Return the PRIM
6310: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 6f 66  ARY KEY index of
6320: 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65   a table.*/.Inde
6330: 78 20 2a 73 71 6c 69 74 65 33 50 72 69 6d 61 72  x *sqlite3Primar
6340: 79 4b 65 79 49 6e 64 65 78 28 54 61 62 6c 65 20  yKeyIndex(Table 
6350: 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20  *pTab){.  Index 
6360: 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 54 61 62  *p;.  for(p=pTab
6370: 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 21  ->pIndex; p && !
6380: 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
6390: 78 28 70 29 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  x(p); p=p->pNext
63a0: 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  ){}.  return p;.
63b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
63c0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e  the column of in
63d0: 64 65 78 20 70 49 64 78 20 74 68 61 74 20 63 6f  dex pIdx that co
63e0: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 61 62  rresponds to tab
63f0: 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f  le.** column iCo
6400: 6c 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  l.  Return -1 if
6410: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69   not found..*/.i
6420: 31 36 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  16 sqlite3Column
6430: 4f 66 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70  OfIndex(Index *p
6440: 49 64 78 2c 20 69 31 36 20 69 43 6f 6c 29 7b 0a  Idx, i16 iCol){.
6450: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
6460: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; i<pIdx->nCol
6470: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  umn; i++){.    i
6480: 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61  f( iCol==pIdx->a
6490: 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20 72 65 74  iColumn[i] ) ret
64a0: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
64b0: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
64c0: 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74   Begin construct
64d0: 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20  ing a new table 
64e0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
64f0: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
6500: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
6510: 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f  of several actio
6520: 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20  n routines that 
6530: 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65  get called in re
6540: 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43  sponse.** to a C
6550: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
6560: 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69  ement.  In parti
6570: 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74  cular, this rout
6580: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  ine is called.**
6590: 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f   after seeing to
65a0: 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e  kens "CREATE" an
65b0: 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68  d "TABLE" and th
65c0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68  e table name. Th
65d0: 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67  e isTemp.** flag
65e0: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
65f0: 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20  table should be 
6600: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75  stored in the au
6610: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
6620: 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64  .** file instead
6630: 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   of in the main 
6640: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
6650: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
6660: 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65   the case.** whe
6670: 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20  n the "TEMP" or 
6680: 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77  "TEMPORARY" keyw
6690: 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65  ord occurs in be
66a0: 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20  tween.** CREATE 
66b0: 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a  and TABLE..**.**
66c0: 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   The new table r
66d0: 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c  ecord is initial
66e0: 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20  ized and put in 
66f0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
6700: 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66  e..** As more of
6710: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
6720: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  E statement is p
6730: 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61  arsed, additiona
6740: 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74  l action.** rout
6750: 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c  ines will be cal
6760: 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20  led to add more 
6770: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
6780: 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41  his record..** A
6790: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
67a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
67b0: 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c  atement, the sql
67c0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72  ite3EndTable() r
67d0: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
67e0: 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  led to complete 
67f0: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  the construction
6800: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
6810: 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69  e record..*/.voi
6820: 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61  d sqlite3StartTa
6830: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
6840: 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65  arse,   /* Parse
6850: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
6860: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
6870: 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
6880: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
6890: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
68a0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
68b0: 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70  2,   /* Second p
68c0: 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20  art of the name 
68d0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
68e0: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
68f0: 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72  Temp,      /* Tr
6900: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
6910: 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20  TEMP table */.  
6920: 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20 20  int isView,     
6930: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
6940: 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20   is a VIEW */.  
6950: 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20  int isVirtual,  
6960: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
6970: 20 69 73 20 61 20 56 49 52 54 55 41 4c 20 74 61   is a VIRTUAL ta
6980: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45  ble */.  int noE
6990: 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  rr        /* Do 
69a0: 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65  nothing if table
69b0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
69c0: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
69d0: 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Table;.  char *z
69e0: 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65  Name = 0; /* The
69f0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77   name of the new
6a00: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
6a10: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
6a20: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ->db;.  Vdbe *v;
6a30: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
6a40: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
6a50: 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65  number to create
6a60: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f   the table in */
6a70: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b  .  Token *pName;
6a80: 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
6a90: 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  ed name of the t
6aa0: 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a  able to create *
6ab0: 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  /..  /* The tabl
6ac0: 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 74  e or view name t
6ad0: 6f 20 63 72 65 61 74 65 20 69 73 20 70 61 73 73  o create is pass
6ae0: 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ed to this routi
6af0: 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20  ne via tokens.  
6b00: 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e  ** pName1 and pN
6b10: 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62  ame2. If the tab
6b20: 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c  le name was full
6b30: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72  y qualified, for
6b40: 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   example:.  **. 
6b50: 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
6b60: 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a   xxx.yyy (...);.
6b70: 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20    ** .  ** Then 
6b80: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
6b90: 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65   "xxx" and pName
6ba0: 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20  2 "yyy". On the 
6bb0: 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 20 20  other hand if.  
6bc0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  ** the table nam
6bd0: 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71  e is not fully q
6be0: 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a  ualified, i.e.:.
6bf0: 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45    **.  ** CREATE
6c00: 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b   TABLE yyy(...);
6c10: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
6c20: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
6c30: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
6c40: 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20  2 is ""..  **.  
6c50: 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f  ** The call belo
6c60: 77 20 73 65 74 73 20 74 68 65 20 70 4e 61 6d 65  w sets the pName
6c70: 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e   pointer to poin
6c80: 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28  t at the token (
6c90: 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70  pName1 or.  ** p
6ca0: 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72  Name2) that stor
6cb0: 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  es the unqualifi
6cc0: 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54  ed table name. T
6cd0: 68 65 20 76 61 72 69 61 62 6c 65 20 69 44 62 20  he variable iDb 
6ce0: 69 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20 74  is.  ** set to t
6cf0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
6d00: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 74 68  database that th
6d10: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
6d20: 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72  is to be.  ** cr
6d30: 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20  eated in..  */. 
6d40: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
6d50: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
6d60: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
6d70: 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  , &pName);.  if(
6d80: 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b   iDb<0 ) return;
6d90: 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d  .  if( !OMIT_TEM
6da0: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 26 26  PDB && isTemp &&
6db0: 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20   pName2->n>0 && 
6dc0: 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  iDb!=1 ){.    /*
6dd0: 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 74   If creating a t
6de0: 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e  emp table, the n
6df0: 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71  ame may not be q
6e00: 75 61 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73 73  ualified. Unless
6e10: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74   .    ** the dat
6e20: 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 22 74  abase name is "t
6e30: 65 6d 70 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f  emp" anyway.  */
6e40: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
6e50: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 65  rMsg(pParse, "te
6e60: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e 61  mporary table na
6e70: 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61  me must be unqua
6e80: 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 72 65  lified");.    re
6e90: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
6ea0: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
6eb0: 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31  isTemp ) iDb = 1
6ec0: 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61  ;..  pParse->sNa
6ed0: 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65  meToken = *pName
6ee0: 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ;.  zName = sqli
6ef0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
6f00: 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  (db, pName);.  i
6f10: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  f( zName==0 ) re
6f20: 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49  turn;.  if( SQLI
6f30: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
6f40: 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
6f50: 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
6f60: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
6f70: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  able_error;.  }.
6f80: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69    if( db->init.i
6f90: 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d  Db==1 ) isTemp =
6fa0: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
6fb0: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
6fc0: 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20  ATION.  assert( 
6fd0: 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69 73  (isTemp & 1)==is
6fe0: 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20  Temp );.  {.    
6ff0: 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 68  int code;.    ch
7000: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
7010: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
7020: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
7030: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
7040: 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
7050: 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d  HEMA_TABLE(isTem
7060: 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  p), 0, zDb) ){. 
7070: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
7080: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
7090: 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65   }.    if( isVie
70a0: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  w ){.      if( !
70b0: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
70c0: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  sTemp ){.       
70d0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
70e0: 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b  REATE_TEMP_VIEW;
70f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7100: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
7110: 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 3b  ITE_CREATE_VIEW;
7120: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
7130: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  se{.      if( !O
7140: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73  MIT_TEMPDB && is
7150: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
7160: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
7170: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b  EATE_TEMP_TABLE;
7180: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7190: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
71a0: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
71b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
71c0: 20 20 20 20 69 66 28 20 21 69 73 56 69 72 74 75      if( !isVirtu
71d0: 61 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75 74  al && sqlite3Aut
71e0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
71f0: 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a  ode, zName, 0, z
7200: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
7210: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
7220: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ror;.    }.  }.#
7230: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65  endif..  /* Make
7240: 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61   sure the new ta
7250: 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f  ble name does no
7260: 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61  t collide with a
7270: 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
7280: 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e  index or table n
7290: 61 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ame in the same 
72a0: 64 61 74 61 62 61 73 65 2e 20 20 49 73 73 75 65  database.  Issue
72b0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
72c0: 65 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65  e if.  ** it doe
72d0: 73 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  s. The exception
72e0: 20 69 73 20 69 66 20 74 68 65 20 73 74 61 74 65   is if the state
72f0: 6d 65 6e 74 20 62 65 69 6e 67 20 70 61 72 73 65  ment being parse
7300: 64 20 77 61 73 20 70 61 73 73 65 64 0a 20 20 2a  d was passed.  *
7310: 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  * to an sqlite3_
7320: 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20 63  declare_vtab() c
7330: 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63 61 73  all. In that cas
7340: 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d  e only the colum
7350: 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64  n names.  ** and
7360: 20 74 79 70 65 73 20 77 69 6c 6c 20 62 65 20 75   types will be u
7370: 73 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73  sed, so there is
7380: 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74   no need to test
7390: 20 66 6f 72 20 6e 61 6d 65 73 70 61 63 65 0a 20   for namespace. 
73a0: 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a   ** collisions..
73b0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44    */.  if( !IN_D
73c0: 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20  ECLARE_VTAB ){. 
73d0: 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64     char *zDb = d
73e0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
73f0: 65 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  e;.    if( SQLIT
7400: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
7410: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
7420: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
7430: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
7440: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 6c  .    }.    pTabl
7450: 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  e = sqlite3FindT
7460: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
7470: 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54  zDb);.    if( pT
7480: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66  able ){.      if
7490: 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20  ( !noErr ){.    
74a0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
74b0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
74c0: 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20 65 78  le %T already ex
74d0: 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  ists", pName);. 
74e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
74f0: 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
7500: 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 43 4f  >init.busy || CO
7510: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
7520: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
7530: 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
7540: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
7550: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  }.      goto beg
7560: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
7570: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
7580: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
7590: 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d  b, zName, zDb)!=
75a0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
75b0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
75c0: 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
75d0: 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61  eady an index na
75e0: 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  med %s", zName);
75f0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
7600: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
7610: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62     }.  }..  pTab
7620: 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  le = sqlite3DbMa
7630: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
7640: 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 69  eof(Table));.  i
7650: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a  f( pTable==0 ){.
7660: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
7670: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 70 50  iled = 1;.    pP
7680: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
7690: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61  E_NOMEM;.    pPa
76a0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
76b0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
76c0: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  e_error;.  }.  p
76d0: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Table->zName = z
76e0: 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Name;.  pTable->
76f0: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54  iPKey = -1;.  pT
7700: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20  able->pSchema = 
7710: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
7720: 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  hema;.  pTable->
7730: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62  nRef = 1;.  pTab
7740: 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  le->nRowLogEst =
7750: 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30   200; assert( 20
7760: 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
7770: 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 61  (1048576) );.  a
7780: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
7790: 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  NewTable==0 );. 
77a0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
77b0: 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20  le = pTable;..  
77c0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
77d0: 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73  e magic sqlite_s
77e0: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73  equence table us
77f0: 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d  ed by autoincrem
7800: 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72  ent,.  ** then r
7810: 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20  ecord a pointer 
7820: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e  to this table in
7830: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
7840: 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
7850: 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54  * so that INSERT
7860: 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61   can find the ta
7870: 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f  ble easily..  */
7880: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7890: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
78a0: 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  NT.  if( !pParse
78b0: 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72 63  ->nested && strc
78c0: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
78d0: 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20  e_sequence")==0 
78e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
78f0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
7900: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
7910: 29 20 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  ) );.    pTable-
7920: 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61  >pSchema->pSeqTa
7930: 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a  b = pTable;.  }.
7940: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67  #endif..  /* Beg
7950: 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  in generating th
7960: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
7970: 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c   insert the tabl
7980: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20  e record into.  
7990: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  ** the SQLITE_MA
79a0: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74  STER table.  Not
79b0: 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20  e in particular 
79c0: 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20  that we must go 
79d0: 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61  ahead.  ** and a
79e0: 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f  llocate the reco
79f0: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
7a00: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f  e table entry no
7a10: 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20  w.  Before any. 
7a20: 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
7a30: 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72  or UNIQUE keywor
7a40: 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20  ds are parsed.  
7a50: 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77  Those keywords w
7a60: 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69  ill cause.  ** i
7a70: 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65  ndices to be cre
7a80: 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62  ated and the tab
7a90: 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63  le record must c
7aa0: 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a  ome before the .
7ab0: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48    ** indices.  H
7ac0: 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64  ence, the record
7ad0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
7ae0: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c  table must be al
7af0: 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77  located.  ** now
7b00: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
7b10: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28  ->init.busy && (
7b20: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
7b30: 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29  be(pParse))!=0 )
7b40: 7b 0a 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20  {.    int j1;.  
7b50: 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74    int fileFormat
7b60: 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20  ;.    int reg1, 
7b70: 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20  reg2, reg3;.    
7b80: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
7b90: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
7ba0: 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66  e, 1, iDb);..#if
7bb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7bc0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
7bd0: 20 20 69 66 28 20 69 73 56 69 72 74 75 61 6c 20    if( isVirtual 
7be0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7bf0: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
7c00: 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a  _VBegin);.    }.
7c10: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
7c20: 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  f the file forma
7c30: 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69  t and encoding i
7c40: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
7c50: 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74  ave not been set
7c60: 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  , .    ** set th
7c70: 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20  em now..    */. 
7c80: 20 20 20 72 65 67 31 20 3d 20 70 50 61 72 73 65     reg1 = pParse
7c90: 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70  ->regRowid = ++p
7ca0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
7cb0: 20 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e   reg2 = pParse->
7cc0: 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72  regRoot = ++pPar
7cd0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
7ce0: 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  g3 = ++pParse->n
7cf0: 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
7d00: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7d10: 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62  _ReadCookie, iDb
7d20: 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46 49  , reg3, BTREE_FI
7d30: 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20  LE_FORMAT);.    
7d40: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
7d50: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  tree(v, iDb);.  
7d60: 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
7d70: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
7d80: 66 2c 20 72 65 67 33 29 3b 20 56 64 62 65 43 6f  f, reg3); VdbeCo
7d90: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 66  verage(v);.    f
7da0: 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d  ileFormat = (db-
7db0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
7dc0: 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d  LegacyFileFmt)!=
7dd0: 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  0 ?.            
7de0: 20 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45        1 : SQLITE
7df0: 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  _MAX_FILE_FORMAT
7e00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7e10: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
7e20: 74 65 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61  teger, fileForma
7e30: 74 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71  t, reg3);.    sq
7e40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
7e50: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
7e60: 20 69 44 62 2c 20 42 54 52 45 45 5f 46 49 4c 45   iDb, BTREE_FILE
7e70: 5f 46 4f 52 4d 41 54 2c 20 72 65 67 33 29 3b 0a  _FORMAT, reg3);.
7e80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7e90: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
7ea0: 67 65 72 2c 20 45 4e 43 28 64 62 29 2c 20 72 65  ger, ENC(db), re
7eb0: 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g3);.    sqlite3
7ec0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7ed0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
7ee0: 20 42 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f   BTREE_TEXT_ENCO
7ef0: 44 49 4e 47 2c 20 72 65 67 33 29 3b 0a 20 20 20  DING, reg3);.   
7f00: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
7f10: 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20  Here(v, j1);..  
7f20: 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63    /* This just c
7f30: 72 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68  reates a place-h
7f40: 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20  older record in 
7f50: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
7f60: 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20  r table..    ** 
7f70: 54 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 74  The record creat
7f80: 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  ed does not cont
7f90: 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74  ain anything yet
7fa0: 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65  .  It will be re
7fb0: 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79  placed.    ** by
7fc0: 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20   the real entry 
7fd0: 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  in code generate
7fe0: 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54  d at sqlite3EndT
7ff0: 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  able()..    **. 
8000: 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20     ** The rowid 
8010: 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72  for the new entr
8020: 79 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  y is left in reg
8030: 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65  ister pParse->re
8040: 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54  gRowid..    ** T
8050: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
8060: 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ber of the new t
8070: 61 62 6c 65 20 69 73 20 6c 65 66 74 20 69 6e 20  able is left in 
8080: 72 65 67 20 70 50 61 72 73 65 2d 3e 72 65 67 52  reg pParse->regR
8090: 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  oot..    ** The 
80a0: 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74 20 70  rowid and root p
80b0: 61 67 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 65  age number value
80c0: 73 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  s are needed by 
80d0: 74 68 65 20 63 6f 64 65 20 74 68 61 74 0a 20 20  the code that.  
80e0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64 54    ** sqlite3EndT
80f0: 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72 61  able will genera
8100: 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21  te..    */.#if !
8110: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
8120: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
8130: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8140: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
8150: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 7c      if( isView |
8160: 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20  | isVirtual ){. 
8170: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8180: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
8190: 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a  eger, 0, reg2);.
81a0: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
81b0: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 70 50 61  .    {.      pPa
81c0: 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20 3d  rse->addrCrTab =
81d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
81e0: 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54  p2(v, OP_CreateT
81f0: 61 62 6c 65 2c 20 69 44 62 2c 20 72 65 67 32 29  able, iDb, reg2)
8200: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
8210: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
8220: 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  le(pParse, iDb);
8230: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8240: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
8250: 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b  Rowid, 0, reg1);
8260: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8270: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
8280: 6c 2c 20 30 2c 20 72 65 67 33 29 3b 0a 20 20 20  l, 0, reg3);.   
8290: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
82a0: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
82b0: 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b   0, reg3, reg1);
82c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
82d0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
82e0: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
82f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8300: 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a  0(v, OP_Close);.
8310: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
8320: 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74   (non-error) ret
8330: 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  urn. */.  return
8340: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
8350: 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a  ror occurs, we j
8360: 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69  ump here */.begi
8370: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20  n_table_error:. 
8380: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8390: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  b, zName);.  ret
83a0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  urn;.}../*.** Th
83b0: 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64  is macro is used
83c0: 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 20   to compare two 
83d0: 73 74 72 69 6e 67 73 20 69 6e 20 61 20 63 61 73  strings in a cas
83e0: 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 6d 61  e-insensitive ma
83f0: 6e 6e 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73  nner..** It is s
8400: 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 20 74  lightly faster t
8410: 68 61 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69  han calling sqli
8420: 74 65 33 53 74 72 49 43 6d 70 28 29 20 64 69 72  te3StrICmp() dir
8430: 65 63 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72  ectly, but.** pr
8440: 6f 64 75 63 65 73 20 6c 61 72 67 65 72 20 63 6f  oduces larger co
8450: 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e  de..**.** WARNIN
8460: 47 3a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73  G: This macro is
8470: 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 20   not compatible 
8480: 77 69 74 68 20 74 68 65 20 73 74 72 63 6d 70 28  with the strcmp(
8490: 29 20 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20  ) family. It.** 
84a0: 72 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20  returns true if 
84b0: 74 68 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20  the two strings 
84c0: 61 72 65 20 65 71 75 61 6c 2c 20 6f 74 68 65 72  are equal, other
84d0: 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23  wise false..*/.#
84e0: 64 65 66 69 6e 65 20 53 54 52 49 43 4d 50 28 78  define STRICMP(x
84f0: 2c 20 79 29 20 28 5c 0a 73 71 6c 69 74 65 33 55  , y) (\.sqlite3U
8500: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e  pperToLower[*(un
8510: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 78  signed char *)(x
8520: 29 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33  )]==   \.sqlite3
8530: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75  UpperToLower[*(u
8540: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28  nsigned char *)(
8550: 79 29 5d 20 20 20 20 20 5c 0a 26 26 20 73 71 6c  y)]     \.&& sql
8560: 69 74 65 33 53 74 72 49 43 6d 70 28 28 78 29 2b  ite3StrICmp((x)+
8570: 31 2c 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f  1,(y)+1)==0 )../
8580: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63  *.** Add a new c
8590: 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62  olumn to the tab
85a0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  le currently bei
85b0: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a  ng constructed..
85c0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  **.** The parser
85d0: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
85e0: 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ine once for eac
85f0: 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61  h column declara
8600: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45  tion.** in a CRE
8610: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
8620: 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61  ent.  sqlite3Sta
8630: 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63  rtTable() gets c
8640: 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74  alled.** first t
8650: 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69  o get things goi
8660: 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72  ng.  Then this r
8670: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8680: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c   for each.** col
8690: 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  umn..*/.void sql
86a0: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61  ite3AddColumn(Pa
86b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
86c0: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61  en *pName){.  Ta
86d0: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
86e0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f  .  char *z;.  Co
86f0: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71  lumn *pCol;.  sq
8700: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
8710: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70  se->db;.  if( (p
8720: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
8730: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
8740: 6e 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  n;.#if SQLITE_MA
8750: 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70  X_COLUMN.  if( p
8760: 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69  ->nCol+1>db->aLi
8770: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
8780: 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20  _COLUMN] ){.    
8790: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
87a0: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
87b0: 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22  y columns on %s"
87c0: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  , p->zName);.   
87d0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
87e0: 64 69 66 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  dif.  z = sqlite
87f0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
8800: 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
8810: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
8820: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
8830: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
8840: 69 66 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70  if( STRICMP(z, p
8850: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
8860: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8870: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8880: 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c  , "duplicate col
8890: 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  umn name: %s", z
88a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
88b0: 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
88c0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
88d0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d   }.  }.  if( (p-
88e0: 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20  >nCol & 0x7)==0 
88f0: 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61  ){.    Column *a
8900: 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20  New;.    aNew = 
8910: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
8920: 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e  (db,p->aCol,(p->
8930: 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70  nCol+8)*sizeof(p
8940: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  ->aCol[0]));.   
8950: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
8960: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
8970: 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
8980: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
8990: 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e      p->aCol = aN
89a0: 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d  ew;.  }.  pCol =
89b0: 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f   &p->aCol[p->nCo
89c0: 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f  l];.  memset(pCo
89d0: 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  l, 0, sizeof(p->
89e0: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f  aCol[0]));.  pCo
89f0: 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a  l->zName = z;. .
8a00: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
8a10: 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66 69   no type specifi
8a20: 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65  ed, columns have
8a30: 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 66 66   the default aff
8a40: 69 6e 69 74 79 0a 20 20 2a 2a 20 27 42 4c 4f 42  inity.  ** 'BLOB
8a50: 27 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  '. If there is a
8a60: 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c   type specified,
8a70: 20 74 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64   then sqlite3Add
8a80: 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c  ColumnType() wil
8a90: 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64  l.  ** be called
8aa0: 20 6e 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f   next to set pCo
8ab0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72  l->affinity corr
8ac0: 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43  ectly..  */.  pC
8ad0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  ol->affinity = S
8ae0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
8af0: 20 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20    pCol->szEst = 
8b00: 31 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a  1;.  p->nCol++;.
8b10: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
8b20: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
8b30: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
8b40: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
8b50: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
8b60: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
8b70: 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f  tatement.  A "NO
8b80: 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69  T NULL" constrai
8b90: 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73  nt has.** been s
8ba0: 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e  een on a column.
8bb0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
8bc0: 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20  ets the notNull 
8bd0: 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  flag on.** the c
8be0: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
8bf0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
8c00: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
8c10: 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61  te3AddNotNull(Pa
8c20: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
8c30: 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62   onError){.  Tab
8c40: 6c 65 20 2a 70 3b 0a 20 20 70 20 3d 20 70 50 61  le *p;.  p = pPa
8c50: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
8c60: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45    if( p==0 || NE
8c70: 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29  VER(p->nCol<1) )
8c80: 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 61 43   return;.  p->aC
8c90: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e 6e 6f  ol[p->nCol-1].no
8ca0: 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72  tNull = (u8)onEr
8cb0: 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63  ror;.}../*.** Sc
8cc0: 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  an the column ty
8cd0: 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c  pe name zType (l
8ce0: 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64  ength nType) and
8cf0: 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61   return the.** a
8d00: 73 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69  ssociated affini
8d10: 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54  ty type..**.** T
8d20: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
8d30: 20 61 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64   a case-independ
8d40: 65 6e 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54  ent search of zT
8d50: 79 70 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  ype for the .** 
8d60: 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68  substrings in th
8d70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
8d80: 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65  e. If one of the
8d90: 20 73 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a   substrings is.*
8da0: 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72  * found, the cor
8db0: 72 65 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e  responding affin
8dc0: 69 74 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ity is returned.
8dd0: 20 49 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69   If zType contai
8de0: 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20  ns.** more than 
8df0: 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74  one of the subst
8e00: 72 69 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74  rings, entries t
8e10: 6f 77 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66  oward the top of
8e20: 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74   .** the table t
8e30: 61 6b 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f  ake priority. Fo
8e40: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54  r example, if zT
8e50: 79 70 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27  ype is 'BLOBINT'
8e60: 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  , .** SQLITE_AFF
8e70: 5f 49 4e 54 45 47 45 52 20 69 73 20 72 65 74 75  _INTEGER is retu
8e80: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73  rned..**.** Subs
8e90: 74 72 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69  tring     | Affi
8ea0: 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  nity.** --------
8eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ec0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54  --------.** 'INT
8ed0: 27 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  '         | SQLI
8ee0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a  TE_AFF_INTEGER.*
8ef0: 2a 20 27 43 48 41 52 27 20 20 20 20 20 20 20 20  * 'CHAR'        
8f00: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  | SQLITE_AFF_TEX
8f10: 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20  T.** 'CLOB'     
8f20: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
8f30: 54 45 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20  TEXT.** 'TEXT'  
8f40: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
8f50: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42  FF_TEXT.** 'BLOB
8f60: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
8f70: 45 5f 41 46 46 5f 42 4c 4f 42 0a 2a 2a 20 27 52  E_AFF_BLOB.** 'R
8f80: 45 41 4c 27 20 20 20 20 20 20 20 20 7c 20 53 51  EAL'        | SQ
8f90: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a  LITE_AFF_REAL.**
8fa0: 20 27 46 4c 4f 41 27 20 20 20 20 20 20 20 20 7c   'FLOA'        |
8fb0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
8fc0: 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20 20 20 20  .** 'DOUB'      
8fd0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52    | SQLITE_AFF_R
8fe0: 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e  EAL.**.** If non
8ff0: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
9000: 6e 67 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65  ngs in the above
9010: 20 74 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64   table are found
9020: 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  ,.** SQLITE_AFF_
9030: 4e 55 4d 45 52 49 43 20 69 73 20 72 65 74 75 72  NUMERIC is retur
9040: 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c  ned..*/.char sql
9050: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
9060: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e  (const char *zIn
9070: 2c 20 75 38 20 2a 70 73 7a 45 73 74 29 7b 0a 20  , u8 *pszEst){. 
9080: 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68   u32 h = 0;.  ch
9090: 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f  ar aff = SQLITE_
90a0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63  AFF_NUMERIC;.  c
90b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 61 72  onst char *zChar
90c0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 7a 49 6e   = 0;..  if( zIn
90d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 66 66  ==0 ) return aff
90e0: 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 5b 30  ;.  while( zIn[0
90f0: 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c  ] ){.    h = (h<
9100: 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55 70 70  <8) + sqlite3Upp
9110: 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e 29  erToLower[(*zIn)
9120: 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49 6e 2b  &0xff];.    zIn+
9130: 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28  +;.    if( h==((
9140: 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31  'c'<<24)+('h'<<1
9150: 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29  6)+('a'<<8)+'r')
9160: 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
9170: 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20  /* CHAR */.     
9180: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9190: 46 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7a 43  F_TEXT;.      zC
91a0: 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20 20 20 7d  har = zIn;.    }
91b0: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63  else if( h==(('c
91c0: 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29  '<<24)+('l'<<16)
91d0: 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29  +('o'<<8)+'b') )
91e0: 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20  {       /* CLOB 
91f0: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
9200: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
9210: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
9220: 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27  =(('t'<<24)+('e'
9230: 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27  <<16)+('x'<<8)+'
9240: 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20  t') ){       /* 
9250: 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66  TEXT */.      af
9260: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
9270: 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EXT;.    }else i
9280: 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29  f( h==(('b'<<24)
9290: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
92a0: 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20  <8)+'b')        
92b0: 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20    /* BLOB */.   
92c0: 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51       && (aff==SQ
92d0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
92e0: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
92f0: 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20  AFF_REAL) ){.   
9300: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
9310: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20  AFF_BLOB;.      
9320: 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27 28 27 20  if( zIn[0]=='(' 
9330: 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 23  ) zChar = zIn;.#
9340: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9350: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
9360: 54 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  T.    }else if( 
9370: 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27  h==(('r'<<24)+('
9380: 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29  e'<<16)+('a'<<8)
9390: 2b 27 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'l')          /
93a0: 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20  * REAL */.      
93b0: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
93c0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
93d0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
93e0: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20  TE_AFF_REAL;.   
93f0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
9400: 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'f'<<24)+('l'<<1
9410: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29  6)+('o'<<8)+'a')
9420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f            /* FLO
9430: 41 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  A */.        && 
9440: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
9450: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
9460: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9470: 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73  F_REAL;.    }els
9480: 65 20 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c  e if( h==(('d'<<
9490: 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27  24)+('o'<<16)+('
94a0: 75 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  u'<<8)+'b')     
94b0: 20 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a       /* DOUB */.
94c0: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
94d0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
94e0: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
94f0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
9500: 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  L;.#endif.    }e
9510: 6c 73 65 20 69 66 28 20 28 68 26 30 78 30 30 46  lse if( (h&0x00F
9520: 46 46 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31  FFFFF)==(('i'<<1
9530: 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29  6)+('n'<<8)+'t')
9540: 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f   ){    /* INT */
9550: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
9560: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
9570: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9580: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
9590: 20 70 73 7a 45 73 74 20 69 73 20 6e 6f 74 20 4e   pszEst is not N
95a0: 55 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65 73  ULL, store an es
95b0: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 66 69  timate of the fi
95c0: 65 6c 64 20 73 69 7a 65 2e 20 20 54 68 65 0a 20  eld size.  The. 
95d0: 20 2a 2a 20 65 73 74 69 6d 61 74 65 20 69 73 20   ** estimate is 
95e0: 73 63 61 6c 65 64 20 73 6f 20 74 68 61 74 20 74  scaled so that t
95f0: 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 69 6e  he size of an in
9600: 74 65 67 65 72 20 69 73 20 31 2e 20 20 2a 2f 0a  teger is 1.  */.
9610: 20 20 69 66 28 20 70 73 7a 45 73 74 20 29 7b 0a    if( pszEst ){.
9620: 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 31 3b      *pszEst = 1;
9630: 20 20 20 2f 2a 20 64 65 66 61 75 6c 74 20 73 69     /* default si
9640: 7a 65 20 69 73 20 61 70 70 72 6f 78 20 34 20 62  ze is approx 4 b
9650: 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ytes */.    if( 
9660: 61 66 66 3c 53 51 4c 49 54 45 5f 41 46 46 5f 4e  aff<SQLITE_AFF_N
9670: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
9680: 69 66 28 20 7a 43 68 61 72 20 29 7b 0a 20 20 20  if( zChar ){.   
9690: 20 20 20 20 20 77 68 69 6c 65 28 20 7a 43 68 61       while( zCha
96a0: 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[0] ){.        
96b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 64    if( sqlite3Isd
96c0: 69 67 69 74 28 7a 43 68 61 72 5b 30 5d 29 20 29  igit(zChar[0]) )
96d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
96e0: 74 20 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t v = 0;.       
96f0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 74 49       sqlite3GetI
9700: 6e 74 33 32 28 7a 43 68 61 72 2c 20 26 76 29 3b  nt32(zChar, &v);
9710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 20 3d  .            v =
9720: 20 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20 20 20   v/4 + 1;.      
9730: 20 20 20 20 20 20 69 66 28 20 76 3e 32 35 35 20        if( v>255 
9740: 29 20 76 20 3d 20 32 35 35 3b 0a 20 20 20 20 20  ) v = 255;.     
9750: 20 20 20 20 20 20 20 2a 70 73 7a 45 73 74 20 3d         *pszEst =
9760: 20 76 3b 20 2f 2a 20 42 4c 4f 42 28 6b 29 2c 20   v; /* BLOB(k), 
9770: 56 41 52 43 48 41 52 28 6b 29 2c 20 43 48 41 52  VARCHAR(k), CHAR
9780: 28 6b 29 20 2d 3e 20 72 3d 28 6b 2f 34 2b 31 29  (k) -> r=(k/4+1)
9790: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
97a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
97b0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 43 68   }.          zCh
97c0: 61 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ar++;.        }.
97d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
97e0: 20 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 35       *pszEst = 5
97f0: 3b 20 20 20 2f 2a 20 42 4c 4f 42 2c 20 54 45 58  ;   /* BLOB, TEX
9800: 54 2c 20 43 4c 4f 42 20 2d 3e 20 72 3d 35 20 20  T, CLOB -> r=5  
9810: 28 61 70 70 72 6f 78 20 32 30 20 62 79 74 65 73  (approx 20 bytes
9820: 29 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )*/.      }.    
9830: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  }.  }.  return a
9840: 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ff;.}../*.** Thi
9850: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
9860: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
9870: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
9880: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
9890: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
98a0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  LE statement.  T
98b0: 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20  he pFirst token 
98c0: 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  is the first.** 
98d0: 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71  token in the seq
98e0: 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20  uence of tokens 
98f0: 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68  that describe th
9900: 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a  e type of the.**
9910: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
9920: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
9930: 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73  tion.   pLast is
9940: 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a   the last token.
9950: 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e  ** in the sequen
9960: 63 65 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e  ce.  Use this in
9970: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e  formation to con
9980: 73 74 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a  struct a string.
9990: 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ** that contains
99a0: 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66   the typename of
99b0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20   the column and 
99c0: 73 74 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e  store that strin
99d0: 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a  g.** in zType..*
99e0: 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  / .void sqlite3A
99f0: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72  ddColumnType(Par
9a00: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
9a10: 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62  n *pType){.  Tab
9a20: 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20  le *p;.  Column 
9a30: 2a 70 43 6f 6c 3b 0a 0a 20 20 70 20 3d 20 70 50  *pCol;..  p = pP
9a40: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
9a50: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e  .  if( p==0 || N
9a60: 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20  EVER(p->nCol<1) 
9a70: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c  ) return;.  pCol
9a80: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e   = &p->aCol[p->n
9a90: 43 6f 6c 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74  Col-1];.  assert
9aa0: 28 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30  ( pCol->zType==0
9ab0: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
9ac0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
9ad0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 43  e(pParse->db, pC
9ae0: 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 70 43  ol->zType);.  pC
9af0: 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69  ol->zType = sqli
9b00: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
9b10: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 79  (pParse->db, pTy
9b20: 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66 66  pe);.  pCol->aff
9b30: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41  inity = sqlite3A
9b40: 66 66 69 6e 69 74 79 54 79 70 65 28 70 43 6f 6c  ffinityType(pCol
9b50: 2d 3e 7a 54 79 70 65 2c 20 26 70 43 6f 6c 2d 3e  ->zType, &pCol->
9b60: 73 7a 45 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  szEst);.}../*.**
9b70: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
9b80: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76  is the default v
9b90: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73  alue for the mos
9ba0: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
9bb0: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68   column.** of th
9bc0: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
9bd0: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
9be0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61  tion..**.** Defa
9bf0: 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65 73  ult value expres
9c00: 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f  sions must be co
9c10: 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61  nstant.  Raise a
9c20: 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74  n exception if t
9c30: 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68  his.** is not th
9c40: 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e case..**.** Th
9c50: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
9c60: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
9c70: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
9c80: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
9c90: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
9ca0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
9cb0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
9cc0: 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61  dDefaultValue(Pa
9cd0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
9ce0: 72 53 70 61 6e 20 2a 70 53 70 61 6e 29 7b 0a 20  rSpan *pSpan){. 
9cf0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c   Table *p;.  Col
9d00: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c  umn *pCol;.  sql
9d10: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9d20: 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 70 50 61  e->db;.  p = pPa
9d30: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
9d40: 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20    if( p!=0 ){.  
9d50: 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43    pCol = &(p->aC
9d60: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a  ol[p->nCol-1]);.
9d70: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
9d80: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
9d90: 46 75 6e 63 74 69 6f 6e 28 70 53 70 61 6e 2d 3e  Function(pSpan->
9da0: 70 45 78 70 72 2c 20 64 62 2d 3e 69 6e 69 74 2e  pExpr, db->init.
9db0: 62 75 73 79 29 20 29 7b 0a 20 20 20 20 20 20 73  busy) ){.      s
9dc0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
9dd0: 50 61 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20  Parse, "default 
9de0: 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20  value of column 
9df0: 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73  [%s] is not cons
9e00: 74 61 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20  tant",.         
9e10: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
9e20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9e30: 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 45 78  /* A copy of pEx
9e40: 70 72 20 69 73 20 75 73 65 64 20 69 6e 73 74 65  pr is used inste
9e50: 61 64 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ad of the origin
9e60: 61 6c 2c 20 61 73 20 70 45 78 70 72 20 63 6f 6e  al, as pExpr con
9e70: 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74  tains.      ** t
9e80: 6f 6b 65 6e 73 20 74 68 61 74 20 70 6f 69 6e 74  okens that point
9e90: 20 74 6f 20 76 6f 6c 61 74 69 6c 65 20 6d 65 6d   to volatile mem
9ea0: 6f 72 79 2e 20 54 68 65 20 27 73 70 61 6e 27 20  ory. The 'span' 
9eb0: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
9ec0: 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65  n.      ** is re
9ed0: 71 75 69 72 65 64 20 62 79 20 70 72 61 67 6d 61  quired by pragma
9ee0: 20 74 61 62 6c 65 5f 69 6e 66 6f 2e 0a 20 20 20   table_info..   
9ef0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
9f00: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
9f10: 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a  , pCol->pDflt);.
9f20: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c        pCol->pDfl
9f30: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
9f40: 75 70 28 64 62 2c 20 70 53 70 61 6e 2d 3e 70 45  up(db, pSpan->pE
9f50: 78 70 72 2c 20 45 58 50 52 44 55 50 5f 52 45 44  xpr, EXPRDUP_RED
9f60: 55 43 45 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  UCE);.      sqli
9f70: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43  te3DbFree(db, pC
9f80: 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20 20 20  ol->zDflt);.    
9f90: 20 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 20 3d 20    pCol->zDflt = 
9fa0: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
9fb0: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61  (db, (char*)pSpa
9fc0: 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20  n->zStart,.     
9fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ff0: 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e  (int)(pSpan->zEn
a000: 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72  d - pSpan->zStar
a010: 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t));.    }.  }. 
a020: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
a030: 74 65 28 64 62 2c 20 70 53 70 61 6e 2d 3e 70 45  te(db, pSpan->pE
a040: 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  xpr);.}../*.** D
a050: 65 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49  esignate the PRI
a060: 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65  MARY KEY for the
a070: 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69   table.  pList i
a080: 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65  s a list of name
a090: 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73  s .** of columns
a0a0: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70   that form the p
a0b0: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
a0c0: 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74  pList is NULL, t
a0d0: 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20  hen the.** most 
a0e0: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63  recently added c
a0f0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62  olumn of the tab
a100: 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72  le is the primar
a110: 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  y key..**.** A t
a120: 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74  able can have at
a130: 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72   most one primar
a140: 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74  y key.  If the t
a150: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73  able already has
a160: 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65  .** a primary ke
a170: 79 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74  y (and this is t
a180: 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72  he second primar
a190: 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61  y key) then crea
a1a0: 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a  te an.** error..
a1b0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49  **.** If the PRI
a1c0: 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61  MARY KEY is on a
a1d0: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77   single column w
a1e0: 68 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73  hose datatype is
a1f0: 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65   INTEGER,.** the
a200: 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f  n we will try to
a210: 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e   use that column
a220: 20 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20   as the rowid.  
a230: 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50  Set the Table.iP
a240: 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20  Key.** field of 
a250: 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20  the table under 
a260: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20  construction to 
a270: 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  be the index of 
a280: 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50  the.** INTEGER P
a290: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
a2a0: 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20  n.  Table.iPKey 
a2b0: 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20  is set to -1 if 
a2c0: 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49  there is.** no I
a2d0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
a2e0: 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  EY..**.** If the
a2f0: 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49   key is not an I
a300: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
a310: 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  EY, then create 
a320: 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65  a unique.** inde
a330: 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20  x for the key.  
a340: 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61  No index is crea
a350: 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20  ted for INTEGER 
a360: 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f  PRIMARY KEYs..*/
a370: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
a380: 50 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61  PrimaryKey(.  Pa
a390: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
a3a0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
a3b0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
a3c0: 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73   *pList,  /* Lis
a3d0: 74 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73  t of field names
a3e0: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
a3f0: 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
a400: 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
a410: 20 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75   do with a uniqu
a420: 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a  eness conflict *
a430: 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c  /.  int autoInc,
a440: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
a450: 20 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45   the AUTOINCREME
a460: 4e 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  NT keyword is pr
a470: 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73  esent */.  int s
a480: 6f 72 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20  ortOrder     /* 
a490: 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72  SQLITE_SO_ASC or
a4a0: 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20   SQLITE_SO_DESC 
a4b0: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
a4c0: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
a4d0: 65 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20  ewTable;.  char 
a4e0: 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e  *zType = 0;.  in
a4f0: 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a  t iCol = -1, i;.
a500: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 69    int nTerm;.  i
a510: 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 49 4e  f( pTab==0 || IN
a520: 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20  _DECLARE_VTAB ) 
a530: 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79  goto primary_key
a540: 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61  _exit;.  if( pTa
a550: 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
a560: 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 20 29  _HasPrimaryKey )
a570: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
a580: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
a590: 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73       "table \"%s
a5a0: 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e  \" has more than
a5b0: 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79   one primary key
a5c0: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
a5d0: 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72  .    goto primar
a5e0: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a  y_key_exit;.  }.
a5f0: 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
a600: 20 7c 3d 20 54 46 5f 48 61 73 50 72 69 6d 61 72   |= TF_HasPrimar
a610: 79 4b 65 79 3b 0a 20 20 69 66 28 20 70 4c 69 73  yKey;.  if( pLis
a620: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c  t==0 ){.    iCol
a630: 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20   = pTab->nCol - 
a640: 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f  1;.    pTab->aCo
a650: 6c 5b 69 43 6f 6c 5d 2e 63 6f 6c 46 6c 61 67 73  l[iCol].colFlags
a660: 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d   |= COLFLAG_PRIM
a670: 4b 45 59 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d  KEY;.    zType =
a680: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
a690: 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 6e 54 65  ].zType;.    nTe
a6a0: 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  rm = 1;.  }else{
a6b0: 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 70 4c 69  .    nTerm = pLi
a6c0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66  st->nExpr;.    f
a6d0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b  or(i=0; i<nTerm;
a6e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72   i++){.      for
a6f0: 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54  (iCol=0; iCol<pT
a700: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  ab->nCol; iCol++
a710: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
a720: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c  qlite3StrICmp(pL
a730: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
a740: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
a750: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
a760: 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61           pTab->a
a770: 43 6f 6c 5b 69 43 6f 6c 5d 2e 63 6f 6c 46 6c 61  Col[iCol].colFla
a780: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52  gs |= COLFLAG_PR
a790: 49 4d 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 20  IMKEY;.         
a7a0: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
a7b0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
a7c0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
a7d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a7e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
a7f0: 69 66 28 20 6e 54 65 72 6d 3d 3d 31 0a 20 20 20  if( nTerm==1.   
a800: 26 26 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69  && zType && sqli
a810: 74 65 33 53 74 72 49 43 6d 70 28 7a 54 79 70 65  te3StrICmp(zType
a820: 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a  , "INTEGER")==0.
a830: 20 20 20 26 26 20 73 6f 72 74 4f 72 64 65 72 3d     && sortOrder=
a840: 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 0a 20  =SQLITE_SO_ASC. 
a850: 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50   ){.    pTab->iP
a860: 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  Key = iCol;.    
a870: 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20  pTab->keyConf = 
a880: 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20  (u8)onError;.   
a890: 20 61 73 73 65 72 74 28 20 61 75 74 6f 49 6e 63   assert( autoInc
a8a0: 3d 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d  ==0 || autoInc==
a8b0: 31 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74  1 );.    pTab->t
a8c0: 61 62 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49  abFlags |= autoI
a8d0: 6e 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d  nc*TF_Autoincrem
a8e0: 65 6e 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ent;.    if( pLi
a8f0: 73 74 20 29 20 70 50 61 72 73 65 2d 3e 69 50 6b  st ) pParse->iPk
a900: 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73  SortOrder = pLis
a910: 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  t->a[0].sortOrde
a920: 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61  r;.  }else if( a
a930: 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65  utoInc ){.#ifnde
a940: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
a950: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
a960: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
a970: 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43  pParse, "AUTOINC
a980: 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61  REMENT is only a
a990: 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20  llowed on an ". 
a9a0: 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 20 50        "INTEGER P
a9b0: 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65  RIMARY KEY");.#e
a9c0: 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
a9d0: 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
a9e0: 70 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  p = sqlite3Creat
a9f0: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30  eIndex(pParse, 0
aa00: 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f  , 0, 0, pList, o
aa10: 6e 45 72 72 6f 72 2c 20 30 2c 0a 20 20 20 20 20  nError, 0,.     
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa30: 20 20 20 20 20 20 30 2c 20 73 6f 72 74 4f 72 64        0, sortOrd
aa40: 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  er, 0);.    if( 
aa50: 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 64  p ){.      p->id
aa60: 78 54 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49  xType = SQLITE_I
aa70: 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45  DXTYPE_PRIMARYKE
aa80: 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  Y;.    }.    pLi
aa90: 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69  st = 0;.  }..pri
aaa0: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20  mary_key_exit:. 
aab0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
aac0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
aad0: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
aae0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  urn;.}../*.** Ad
aaf0: 64 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f  d a new CHECK co
ab00: 6e 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20  nstraint to the 
ab10: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
ab20: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
ab30: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
ab40: 74 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74  te3AddCheckConst
ab50: 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  raint(.  Parse *
ab60: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
ab70: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
ab80: 0a 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45  .  Expr *pCheckE
ab90: 78 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63  xpr  /* The chec
aba0: 6b 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  k expression */.
abb0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
abc0: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54  E_OMIT_CHECK.  T
abd0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
abe0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
abf0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
ac00: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
ac10: 28 20 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45  ( pTab && !IN_DE
ac20: 43 4c 41 52 45 5f 56 54 41 42 0a 20 20 20 26 26  CLARE_VTAB.   &&
ac30: 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 49 73   !sqlite3BtreeIs
ac40: 52 65 61 64 6f 6e 6c 79 28 64 62 2d 3e 61 44 62  Readonly(db->aDb
ac50: 5b 64 62 2d 3e 69 6e 69 74 2e 69 44 62 5d 2e 70  [db->init.iDb].p
ac60: 42 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 54 61  Bt).  ){.    pTa
ac70: 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69  b->pCheck = sqli
ac80: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
ac90: 64 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  d(pParse, pTab->
aca0: 70 43 68 65 63 6b 2c 20 70 43 68 65 63 6b 45 78  pCheck, pCheckEx
acb0: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  pr);.    if( pPa
acc0: 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e  rse->constraintN
acd0: 61 6d 65 2e 6e 20 29 7b 0a 20 20 20 20 20 20 73  ame.n ){.      s
ace0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
acf0: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 54  tName(pParse, pT
ad00: 61 62 2d 3e 70 43 68 65 63 6b 2c 20 26 70 50 61  ab->pCheck, &pPa
ad10: 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e  rse->constraintN
ad20: 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ame, 1);.    }. 
ad30: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
ad40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
ad50: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
ad60: 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b  db, pCheckExpr);
ad70: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
ad80: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  t the collation 
ad90: 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  function of the 
ada0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61  most recently pa
adb0: 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d  rsed table colum
adc0: 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c  n.** to the Coll
add0: 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f  Seq given..*/.vo
ade0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
adf0: 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a  lateType(Parse *
ae00: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
ae10: 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20  Token){.  Table 
ae20: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
ae30: 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20  har *zColl;     
ae40: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71 75           /* Dequ
ae50: 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c  oted name of col
ae60: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
ae70: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
ae80: 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  ;..  if( (p = pP
ae90: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
aea0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
aeb0: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
aec0: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
aed0: 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69  ;.  zColl = sqli
aee0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
aef0: 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  (db, pToken);.  
af00: 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74  if( !zColl ) ret
af10: 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  urn;..  if( sqli
af20: 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
af30: 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20  (pParse, zColl) 
af40: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
af50: 64 78 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  dx;.    sqlite3D
af60: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
af70: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20  l[i].zColl);.   
af80: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c   p->aCol[i].zCol
af90: 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20  l = zColl;.  .  
afa0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
afb0: 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20 61  mn is declared a
afc0: 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52  s "<name> PRIMAR
afd0: 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74  Y KEY COLLATE <t
afe0: 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68  ype>",.    ** th
aff0: 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20  en an index may 
b000: 68 61 76 65 20 62 65 65 6e 20 63 72 65 61 74 65  have been create
b010: 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e  d on this column
b020: 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20   before the.    
b030: 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70  ** collation typ
b040: 65 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72  e was added. Cor
b050: 72 65 63 74 20 74 68 69 73 20 69 66 20 69 74 20  rect this if it 
b060: 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20  is the case..   
b070: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49 64 78   */.    for(pIdx
b080: 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  =p->pIndex; pIdx
b090: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
b0a0: 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
b0b0: 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  t( pIdx->nKeyCol
b0c0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==1 );.      if(
b0d0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
b0e0: 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 20  0]==i ){.       
b0f0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d   pIdx->azColl[0]
b100: 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43   = p->aCol[i].zC
b110: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
b120: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
b130: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
b140: 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a  , zColl);.  }.}.
b150: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
b160: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
b170: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
b180: 6e 63 65 20 66 6f 72 20 64 61 74 61 62 61 73 65  nce for database
b190: 20 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20   native text.** 
b1a0: 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66  encoding identif
b1b0: 69 65 64 20 62 79 20 74 68 65 20 73 74 72 69 6e  ied by the strin
b1c0: 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  g zName, length 
b1d0: 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nName..**.** If 
b1e0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
b1f0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
b200: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
b210: 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61  e, or not availa
b220: 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61  ble.** in the da
b230: 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e  tabase native en
b240: 63 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c  coding, the coll
b250: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73  ation factory is
b260: 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72   invoked to.** r
b270: 65 71 75 65 73 74 20 69 74 2e 20 49 66 20 74 68  equest it. If th
b280: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
b290: 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ory does not sup
b2a0: 70 6c 79 20 73 75 63 68 20 61 20 73 65 71 75 65  ply such a seque
b2b0: 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  nce,.** and the 
b2c0: 73 65 71 75 65 6e 63 65 20 69 73 20 61 76 61 69  sequence is avai
b2d0: 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72  lable in another
b2e0: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20   text encoding, 
b2f0: 74 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20  then that is.** 
b300: 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
b310: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65  ..**.** If no ve
b320: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65  rsions of the re
b330: 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
b340: 6e 73 20 73 65 71 75 65 6e 63 65 20 61 72 65 20  ns sequence are 
b350: 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a  available, or.**
b360: 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f   another error o
b370: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
b380: 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65  eturned and an e
b390: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69  rror message wri
b3a0: 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61  tten into.** pPa
b3b0: 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  rse..**.** This 
b3c0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 77 72 61  routine is a wra
b3d0: 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69  pper around sqli
b3e0: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29  te3FindCollSeq()
b3f0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
b400: 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63  ** invokes the c
b410: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
b420: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 63 6f   if the named co
b430: 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  llation cannot b
b440: 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67  e found.** and g
b450: 65 6e 65 72 61 74 65 73 20 61 6e 20 65 72 72 6f  enerates an erro
b460: 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a  r message..**.**
b470: 20 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74   See also: sqlit
b480: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2c  e3FindCollSeq(),
b490: 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53   sqlite3GetCollS
b4a0: 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  eq().*/.CollSeq 
b4b0: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f  *sqlite3LocateCo
b4c0: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
b4d0: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
b4e0: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74  *zName){.  sqlit
b4f0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
b500: 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20  >db;.  u8 enc = 
b510: 45 4e 43 28 64 62 29 3b 0a 20 20 75 38 20 69 6e  ENC(db);.  u8 in
b520: 69 74 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69  itbusy = db->ini
b530: 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65  t.busy;.  CollSe
b540: 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f  q *pColl;..  pCo
b550: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
b560: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c  CollSeq(db, enc,
b570: 20 7a 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79   zName, initbusy
b580: 29 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75  );.  if( !initbu
b590: 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c  sy && (!pColl ||
b5a0: 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29   !pColl->xCmp) )
b5b0: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
b5c0: 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28  lite3GetCollSeq(
b5d0: 70 50 61 72 73 65 2c 20 65 6e 63 2c 20 70 43 6f  pParse, enc, pCo
b5e0: 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  ll, zName);.  }.
b5f0: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
b600: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
b610: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
b620: 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  ll increment the
b630: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a   schema cookie..
b640: 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61  **.** The schema
b650: 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20   cookie is used 
b660: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
b670: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72  n the schema for
b680: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
b690: 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72   changes.  After
b6a0: 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61   each schema cha
b6b0: 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20  nge, the cookie 
b6c0: 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73  value.** changes
b6d0: 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73  .  When a proces
b6e0: 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68  s first reads th
b6f0: 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f  e schema it reco
b700: 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69  rds the.** cooki
b710: 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20  e.  Thereafter, 
b720: 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73  whenever it goes
b730: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
b740: 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63  atabase,.** it c
b750: 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65  hecks the cookie
b760: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
b770: 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74  e schema has not
b780: 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63   changed.** sinc
b790: 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65  e it was last re
b7a0: 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70  ad..**.** This p
b7b0: 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c  lan is not compl
b7c0: 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f  etely bullet-pro
b7d0: 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69  of.  It is possi
b7e0: 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ble for.** the s
b7f0: 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20  chema to change 
b800: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61  multiple times a
b810: 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69  nd for the cooki
b820: 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62  e to be.** set b
b830: 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c  ack to prior val
b840: 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20  ue.  But schema 
b850: 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72  changes are infr
b860: 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68  equent.** and th
b870: 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  e probability of
b880: 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d   hitting the sam
b890: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69  e cookie value i
b8a0: 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e  s only.** 1 chan
b8b0: 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20  ce in 2^32.  So 
b8c0: 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67  we're safe enoug
b8d0: 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  h..*/.void sqlit
b8e0: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50  e3ChangeCookie(P
b8f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
b900: 74 20 69 44 62 29 7b 0a 20 20 69 6e 74 20 72 31  t iDb){.  int r1
b910: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
b920: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
b930: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
b940: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
b950: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
b960: 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  dbe;.  assert( s
b970: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
b980: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
b990: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ) );.  sqlite3Vd
b9a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
b9b0: 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b  nteger, db->aDb[
b9c0: 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63  iDb].pSchema->sc
b9d0: 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 72  hema_cookie+1, r
b9e0: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
b9f0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
ba00: 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54  tCookie, iDb, BT
ba10: 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53 49  REE_SCHEMA_VERSI
ba20: 4f 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74  ON, r1);.  sqlit
ba30: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
ba40: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a  (pParse, r1);.}.
ba50: 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74  ./*.** Measure t
ba60: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
ba70: 72 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74  racters needed t
ba80: 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76  o output the giv
ba90: 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72  en.** identifier
baa0: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65  .  The number re
bab0: 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20  turned includes 
bac0: 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a  any quotes used.
bad0: 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  ** but does not 
bae0: 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c  include the null
baf0: 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a   terminator..**.
bb00: 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 20  ** The estimate 
bb10: 69 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e  is conservative.
bb20: 20 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61    It might be la
bb30: 72 67 65 72 20 74 68 61 74 20 77 68 61 74 20 69  rger that what i
bb40: 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64  s.** really need
bb50: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
bb60: 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f  t identLength(co
bb70: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
bb80: 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30  int n;.  for(n=0
bb90: 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b  ; *z; n++, z++){
bba0: 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27  .    if( *z=='"'
bbb0: 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20   ){ n++; }.  }. 
bbc0: 20 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d   return n + 2;.}
bbd0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
bbe0: 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  t parameter is a
bbf0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
bc00: 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68  utput buffer. Th
bc10: 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72  e second .** par
bc20: 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
bc30: 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  ter to an intege
bc40: 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  r that contains 
bc50: 74 68 65 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a  the offset at.**
bc60: 20 77 68 69 63 68 20 74 6f 20 77 72 69 74 65 20   which to write 
bc70: 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  into the output 
bc80: 62 75 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e  buffer. This fun
bc90: 63 74 69 6f 6e 20 63 6f 70 69 65 73 20 74 68 65  ction copies the
bca0: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
bcb0: 65 64 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65  ed string pointe
bcc0: 64 20 74 6f 20 62 79 20 74 68 65 20 74 68 69 72  d to by the thir
bcd0: 64 20 70 61 72 61 6d 65 74 65 72 2c 20 7a 53 69  d parameter, zSi
bce0: 67 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f  gnedIdent,.** to
bcf0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f   the specified o
bd00: 66 66 73 65 74 20 69 6e 20 74 68 65 20 62 75 66  ffset in the buf
bd10: 66 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 20  fer and updates 
bd20: 2a 70 49 64 78 20 74 6f 20 72 65 66 65 72 0a 2a  *pIdx to refer.*
bd30: 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  * to the first b
bd40: 79 74 65 20 61 66 74 65 72 20 74 68 65 20 6c 61  yte after the la
bd50: 73 74 20 62 79 74 65 20 77 72 69 74 74 65 6e 20  st byte written 
bd60: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
bd70: 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
bd80: 73 74 72 69 6e 67 20 7a 53 69 67 6e 65 64 49 64  string zSignedId
bd90: 65 6e 74 20 63 6f 6e 73 69 73 74 73 20 65 6e 74  ent consists ent
bda0: 69 72 65 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e  irely of alpha-n
bdb0: 75 6d 65 72 69 63 0a 2a 2a 20 63 68 61 72 61 63  umeric.** charac
bdc0: 74 65 72 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62  ters, does not b
bdd0: 65 67 69 6e 20 77 69 74 68 20 61 20 64 69 67 69  egin with a digi
bde0: 74 20 61 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20  t and is not an 
bdf0: 53 51 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20  SQL keyword,.** 
be00: 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65  then it is copie
be10: 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  d to the output 
be20: 62 75 66 66 65 72 20 65 78 61 63 74 6c 79 20 61  buffer exactly a
be30: 73 20 69 74 20 69 73 2e 20 4f 74 68 65 72 77 69  s it is. Otherwi
be40: 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f  se,.** it is quo
be50: 74 65 64 20 75 73 69 6e 67 20 64 6f 75 62 6c 65  ted using double
be60: 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  -quotes..*/.stat
be70: 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74  ic void identPut
be80: 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70  (char *z, int *p
be90: 49 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e  Idx, char *zSign
bea0: 65 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69  edIdent){.  unsi
beb0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e  gned char *zIden
bec0: 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  t = (unsigned ch
bed0: 61 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74  ar*)zSignedIdent
bee0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65  ;.  int i, j, ne
bef0: 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a  edQuote;.  i = *
bf00: 70 49 64 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30  pIdx;..  for(j=0
bf10: 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b  ; zIdent[j]; j++
bf20: 29 7b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  ){.    if( !sqli
bf30: 74 65 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e  te3Isalnum(zIden
bf40: 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b  t[j]) && zIdent[
bf50: 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b  j]!='_' ) break;
bf60: 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65  .  }.  needQuote
bf70: 20 3d 20 73 71 6c 69 74 65 33 49 73 64 69 67 69   = sqlite3Isdigi
bf80: 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20  t(zIdent[0]).   
bf90: 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
bfa0: 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a  te3KeywordCode(z
bfb0: 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44  Ident, j)!=TK_ID
bfc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
bfd0: 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20  zIdent[j]!=0.   
bfe0: 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3d 3d 30           || j==0
bff0: 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f  ;..  if( needQuo
c000: 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22  te ) z[i++] = '"
c010: 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49  ';.  for(j=0; zI
c020: 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  dent[j]; j++){. 
c030: 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65     z[i++] = zIde
c040: 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a  nt[j];.    if( z
c050: 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20  Ident[j]=='"' ) 
c060: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
c070: 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  }.  if( needQuot
c080: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
c090: 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20  ;.  z[i] = 0;.  
c0a0: 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a  *pIdx = i;.}../*
c0b0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43  .** Generate a C
c0c0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
c0d0: 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74  ement appropriat
c0e0: 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
c0f0: 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72  ** table.  Memor
c100: 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65  y to hold the te
c110: 78 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  xt of the statem
c120: 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ent is obtained.
c130: 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ** from sqliteMa
c140: 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
c150: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
c160: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
c170: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
c180: 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d   *createTableStm
c190: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  t(sqlite3 *db, T
c1a0: 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  able *p){.  int 
c1b0: 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20  i, k, n;.  char 
c1c0: 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a  *zStmt;.  char *
c1d0: 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a  zSep, *zSep2, *z
c1e0: 45 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  End;.  Column *p
c1f0: 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  Col;.  n = 0;.  
c200: 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43  for(pCol = p->aC
c210: 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  ol, i=0; i<p->nC
c220: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
c230: 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74  {.    n += ident
c240: 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61  Length(pCol->zNa
c250: 6d 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e  me) + 5;.  }.  n
c260: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
c270: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  p->zName);.  if(
c280: 20 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a 53   n<50 ){ .    zS
c290: 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65  ep = "";.    zSe
c2a0: 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45  p2 = ",";.    zE
c2b0: 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73  nd = ")";.  }els
c2c0: 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c  e{.    zSep = "\
c2d0: 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  n  ";.    zSep2 
c2e0: 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a  = ",\n  ";.    z
c2f0: 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d  End = "\n)";.  }
c300: 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70  .  n += 35 + 6*p
c310: 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20  ->nCol;.  zStmt 
c320: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
c330: 63 52 61 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66  cRaw(0, n);.  if
c340: 28 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  ( zStmt==0 ){.  
c350: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
c360: 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ed = 1;.    retu
c370: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rn 0;.  }.  sqli
c380: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20  te3_snprintf(n, 
c390: 7a 53 74 6d 74 2c 20 22 43 52 45 41 54 45 20 54  zStmt, "CREATE T
c3a0: 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73  ABLE ");.  k = s
c3b0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
c3c0: 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75  Stmt);.  identPu
c3d0: 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e  t(zStmt, &k, p->
c3e0: 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b  zName);.  zStmt[
c3f0: 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f  k++] = '(';.  fo
c400: 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20  r(pCol=p->aCol, 
c410: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
c420: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
c430: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
c440: 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79  har * const azTy
c450: 70 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  pe[] = {.       
c460: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 42   /* SQLITE_AFF_B
c470: 4c 4f 42 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20  LOB    */ "",.  
c480: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
c490: 41 46 46 5f 54 45 58 54 20 20 20 20 2a 2f 20 22  AFF_TEXT    */ "
c4a0: 20 54 45 58 54 22 2c 0a 20 20 20 20 20 20 20 20   TEXT",.        
c4b0: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  /* SQLITE_AFF_NU
c4c0: 4d 45 52 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c  MERIC */ " NUM",
c4d0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  .        /* SQLI
c4e0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 2a  TE_AFF_INTEGER *
c4f0: 2f 20 22 20 49 4e 54 22 2c 0a 20 20 20 20 20 20  / " INT",.      
c500: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f    /* SQLITE_AFF_
c510: 52 45 41 4c 20 20 20 20 2a 2f 20 22 20 52 45 41  REAL    */ " REA
c520: 4c 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  L".    };.    in
c530: 74 20 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74  t len;.    const
c540: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20   char *zType;.. 
c550: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
c560: 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b  ntf(n-k, &zStmt[
c570: 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b  k], zSep);.    k
c580: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
c590: 6e 33 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a  n30(&zStmt[k]);.
c5a0: 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32      zSep = zSep2
c5b0: 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a  ;.    identPut(z
c5c0: 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e  Stmt, &k, pCol->
c5d0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 61 73 73 65  zName);.    asse
c5e0: 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  rt( pCol->affini
c5f0: 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  ty-SQLITE_AFF_BL
c600: 4f 42 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61  OB >= 0 );.    a
c610: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66  ssert( pCol->aff
c620: 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46  inity-SQLITE_AFF
c630: 5f 42 4c 4f 42 20 3c 20 41 72 72 61 79 53 69 7a  _BLOB < ArraySiz
c640: 65 28 61 7a 54 79 70 65 29 20 29 3b 0a 20 20 20  e(azType) );.   
c650: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
c660: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
c670: 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20  E_AFF_BLOB );.  
c680: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
c690: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
c6a0: 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20  TE_AFF_TEXT );. 
c6b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f     testcase( pCo
c6c0: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
c6d0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
c6e0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c6f0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
c700: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45  =SQLITE_AFF_INTE
c710: 47 45 52 20 29 3b 0a 20 20 20 20 74 65 73 74 63  GER );.    testc
c720: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
c730: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
c740: 52 45 41 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20  REAL );.    .   
c750: 20 7a 54 79 70 65 20 3d 20 61 7a 54 79 70 65 5b   zType = azType[
c760: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d  pCol->affinity -
c770: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
c780: 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c  ];.    len = sql
c790: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79  ite3Strlen30(zTy
c7a0: 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pe);.    assert(
c7b0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
c7c0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  =SQLITE_AFF_BLOB
c7d0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c   .            ||
c7e0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
c7f0: 3d 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79  =sqlite3Affinity
c800: 54 79 70 65 28 7a 54 79 70 65 2c 20 30 29 20 29  Type(zType, 0) )
c810: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 53  ;.    memcpy(&zS
c820: 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c  tmt[k], zType, l
c830: 65 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c 65  en);.    k += le
c840: 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6b  n;.    assert( k
c850: 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  <=n );.  }.  sql
c860: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d  ite3_snprintf(n-
c870: 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25  k, &zStmt[k], "%
c880: 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74  s", zEnd);.  ret
c890: 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a  urn zStmt;.}../*
c8a0: 0a 2a 2a 20 52 65 73 69 7a 65 20 61 6e 20 49 6e  .** Resize an In
c8b0: 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 68 6f  dex object to ho
c8c0: 6c 64 20 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f 74  ld N columns tot
c8d0: 61 6c 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  al.  Return SQLI
c8e0: 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
c8f0: 65 73 73 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e  ess and SQLITE_N
c900: 4f 4d 45 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65  OMEM on an OOM e
c910: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
c920: 69 6e 74 20 72 65 73 69 7a 65 49 6e 64 65 78 4f  int resizeIndexO
c930: 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64  bject(sqlite3 *d
c940: 62 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  b, Index *pIdx, 
c950: 69 6e 74 20 4e 29 7b 0a 20 20 63 68 61 72 20 2a  int N){.  char *
c960: 7a 45 78 74 72 61 3b 0a 20 20 69 6e 74 20 6e 42  zExtra;.  int nB
c970: 79 74 65 3b 0a 20 20 69 66 28 20 70 49 64 78 2d  yte;.  if( pIdx-
c980: 3e 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65  >nColumn>=N ) re
c990: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c9a0: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
c9b0: 69 73 52 65 73 69 7a 65 64 3d 3d 30 20 29 3b 0a  isResized==0 );.
c9c0: 20 20 6e 42 79 74 65 20 3d 20 28 73 69 7a 65 6f    nByte = (sizeo
c9d0: 66 28 63 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f  f(char*) + sizeo
c9e0: 66 28 69 31 36 29 20 2b 20 31 29 2a 4e 3b 0a 20  f(i16) + 1)*N;. 
c9f0: 20 7a 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65   zExtra = sqlite
ca00: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
ca10: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  , nByte);.  if( 
ca20: 7a 45 78 74 72 61 3d 3d 30 20 29 20 72 65 74 75  zExtra==0 ) retu
ca30: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
ca40: 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61  .  memcpy(zExtra
ca50: 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 2c 20  , pIdx->azColl, 
ca60: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70 49  sizeof(char*)*pI
ca70: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  dx->nColumn);.  
ca80: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28  pIdx->azColl = (
ca90: 63 68 61 72 2a 2a 29 7a 45 78 74 72 61 3b 0a 20  char**)zExtra;. 
caa0: 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f   zExtra += sizeo
cab0: 66 28 63 68 61 72 2a 29 2a 4e 3b 0a 20 20 6d 65  f(char*)*N;.  me
cac0: 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64  mcpy(zExtra, pId
cad0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 73 69 7a  x->aiColumn, siz
cae0: 65 6f 66 28 69 31 36 29 2a 70 49 64 78 2d 3e 6e  eof(i16)*pIdx->n
caf0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d  Column);.  pIdx-
cb00: 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36  >aiColumn = (i16
cb10: 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74  *)zExtra;.  zExt
cb20: 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36  ra += sizeof(i16
cb30: 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45  )*N;.  memcpy(zE
cb40: 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 53 6f 72  xtra, pIdx->aSor
cb50: 74 4f 72 64 65 72 2c 20 70 49 64 78 2d 3e 6e 43  tOrder, pIdx->nC
cb60: 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e  olumn);.  pIdx->
cb70: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
cb80: 2a 29 7a 45 78 74 72 61 3b 0a 20 20 70 49 64 78  *)zExtra;.  pIdx
cb90: 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a 20  ->nColumn = N;. 
cba0: 20 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64   pIdx->isResized
cbb0: 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
cbc0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
cbd0: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
cbe0: 74 6f 74 61 6c 20 72 6f 77 20 77 69 64 74 68 20  total row width 
cbf0: 66 6f 72 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a  for a table..*/.
cc00: 73 74 61 74 69 63 20 76 6f 69 64 20 65 73 74 69  static void esti
cc10: 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68 28 54  mateTableWidth(T
cc20: 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 75  able *pTab){.  u
cc30: 6e 73 69 67 6e 65 64 20 77 54 61 62 6c 65 20 3d  nsigned wTable =
cc40: 20 30 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75   0;.  const Colu
cc50: 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 69  mn *pTabCol;.  i
cc60: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 54  nt i;.  for(i=pT
cc70: 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 43 6f  ab->nCol, pTabCo
cc80: 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3e  l=pTab->aCol; i>
cc90: 30 3b 20 69 2d 2d 2c 20 70 54 61 62 43 6f 6c 2b  0; i--, pTabCol+
cca0: 2b 29 7b 0a 20 20 20 20 77 54 61 62 6c 65 20 2b  +){.    wTable +
ccb0: 3d 20 70 54 61 62 43 6f 6c 2d 3e 73 7a 45 73 74  = pTabCol->szEst
ccc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62  ;.  }.  if( pTab
ccd0: 2d 3e 69 50 4b 65 79 3c 30 20 29 20 77 54 61 62  ->iPKey<0 ) wTab
cce0: 6c 65 2b 2b 3b 0a 20 20 70 54 61 62 2d 3e 73 7a  le++;.  pTab->sz
ccf0: 54 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  TabRow = sqlite3
cd00: 4c 6f 67 45 73 74 28 77 54 61 62 6c 65 2a 34 29  LogEst(wTable*4)
cd10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  ;.}../*.** Estim
cd20: 61 74 65 20 74 68 65 20 61 76 65 72 61 67 65 20  ate the average 
cd30: 73 69 7a 65 20 6f 66 20 61 20 72 6f 77 20 66 6f  size of a row fo
cd40: 72 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  r an index..*/.s
cd50: 74 61 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d  tatic void estim
cd60: 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 49 6e  ateIndexWidth(In
cd70: 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e  dex *pIdx){.  un
cd80: 73 69 67 6e 65 64 20 77 49 6e 64 65 78 20 3d 20  signed wIndex = 
cd90: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  0;.  int i;.  co
cda0: 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  nst Column *aCol
cdb0: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
cdc0: 3e 61 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30  >aCol;.  for(i=0
cdd0: 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; i<pIdx->nColum
cde0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 31 36  n; i++){.    i16
cdf0: 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   x = pIdx->aiCol
ce00: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65  umn[i];.    asse
ce10: 72 74 28 20 78 3c 70 49 64 78 2d 3e 70 54 61 62  rt( x<pIdx->pTab
ce20: 6c 65 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  le->nCol );.    
ce30: 77 49 6e 64 65 78 20 2b 3d 20 78 3c 30 20 3f 20  wIndex += x<0 ? 
ce40: 31 20 3a 20 61 43 6f 6c 5b 70 49 64 78 2d 3e 61  1 : aCol[pIdx->a
ce50: 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73  iColumn[i]].szEs
ce60: 74 3b 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e 73  t;.  }.  pIdx->s
ce70: 7a 49 64 78 52 6f 77 20 3d 20 73 71 6c 69 74 65  zIdxRow = sqlite
ce80: 33 4c 6f 67 45 73 74 28 77 49 6e 64 65 78 2a 34  3LogEst(wIndex*4
ce90: 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  );.}../* Return 
cea0: 74 72 75 65 20 69 66 20 76 61 6c 75 65 20 78 20  true if value x 
ceb0: 69 73 20 66 6f 75 6e 64 20 61 6e 79 20 6f 66 20  is found any of 
cec0: 74 68 65 20 66 69 72 73 74 20 6e 43 6f 6c 20 65  the first nCol e
ced0: 6e 74 72 69 65 73 20 6f 66 20 61 69 43 6f 6c 5b  ntries of aiCol[
cee0: 5d 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ].*/.static int 
cef0: 68 61 73 43 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20  hasColumn(const 
cf00: 69 31 36 20 2a 61 69 43 6f 6c 2c 20 69 6e 74 20  i16 *aiCol, int 
cf10: 6e 43 6f 6c 2c 20 69 6e 74 20 78 29 7b 0a 20 20  nCol, int x){.  
cf20: 77 68 69 6c 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20  while( nCol-- > 
cf30: 30 20 29 20 69 66 28 20 78 3d 3d 2a 28 61 69 43  0 ) if( x==*(aiC
cf40: 6f 6c 2b 2b 29 20 29 20 72 65 74 75 72 6e 20 31  ol++) ) return 1
cf50: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
cf60: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
cf70: 69 6e 65 20 72 75 6e 73 20 61 74 20 74 68 65 20  ine runs at the 
cf80: 65 6e 64 20 6f 66 20 70 61 72 73 69 6e 67 20 61  end of parsing a
cf90: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
cfa0: 61 74 65 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20  atement that.** 
cfb0: 68 61 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f  has a WITHOUT RO
cfc0: 57 49 44 20 63 6c 61 75 73 65 2e 20 20 54 68 65  WID clause.  The
cfd0: 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75   job of this rou
cfe0: 74 69 6e 65 20 69 73 20 74 6f 20 63 6f 6e 76 65  tine is to conve
cff0: 72 74 20 62 6f 74 68 0a 2a 2a 20 69 6e 74 65 72  rt both.** inter
d000: 6e 61 6c 20 73 63 68 65 6d 61 20 64 61 74 61 20  nal schema data 
d010: 73 74 72 75 63 74 75 72 65 73 20 61 6e 64 20 74  structures and t
d020: 68 65 20 67 65 6e 65 72 61 74 65 64 20 56 44 42  he generated VDB
d030: 45 20 63 6f 64 65 20 73 6f 20 74 68 61 74 20 74  E code so that t
d040: 68 65 79 0a 2a 2a 20 61 72 65 20 61 70 70 72 6f  hey.** are appro
d050: 70 72 69 61 74 65 20 66 6f 72 20 61 20 57 49 54  priate for a WIT
d060: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
d070: 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 72 6f   instead of a ro
d080: 77 69 64 20 74 61 62 6c 65 2e 0a 2a 2a 20 43 68  wid table..** Ch
d090: 61 6e 67 65 73 20 69 6e 63 6c 75 64 65 3a 0a 2a  anges include:.*
d0a0: 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 43 6f  *.**     (1)  Co
d0b0: 6e 76 65 72 74 20 74 68 65 20 4f 50 5f 43 72 65  nvert the OP_Cre
d0c0: 61 74 65 54 61 62 6c 65 20 69 6e 74 6f 20 61 6e  ateTable into an
d0d0: 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2e   OP_CreateIndex.
d0e0: 20 20 54 68 65 72 65 20 69 73 0a 2a 2a 20 20 20    There is.**   
d0f0: 20 20 20 20 20 20 20 6e 6f 20 72 6f 77 69 64 20         no rowid 
d100: 62 74 72 65 65 20 66 6f 72 20 61 20 57 49 54 48  btree for a WITH
d110: 4f 55 54 20 52 4f 57 49 44 2e 20 20 49 6e 73 74  OUT ROWID.  Inst
d120: 65 61 64 2c 20 74 68 65 20 63 61 6e 6f 6e 69 63  ead, the canonic
d130: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 64  al.**          d
d140: 61 74 61 20 73 74 6f 72 61 67 65 20 69 73 20 61  ata storage is a
d150: 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
d160: 62 74 72 65 65 2e 0a 2a 2a 20 20 20 20 20 28 32  btree..**     (2
d170: 29 20 20 42 79 70 61 73 73 20 74 68 65 20 63 72  )  Bypass the cr
d180: 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71  eation of the sq
d190: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
d1a0: 65 20 65 6e 74 72 79 0a 2a 2a 20 20 20 20 20 20  e entry.**      
d1b0: 20 20 20 20 66 6f 72 20 74 68 65 20 50 52 49 4d      for the PRIM
d1c0: 41 52 59 20 4b 45 59 20 61 73 20 74 68 65 20 70  ARY KEY as the p
d1d0: 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78  rimary key index
d1e0: 20 69 73 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20   is now.**      
d1f0: 20 20 20 20 69 64 65 6e 74 69 66 69 65 64 20 62      identified b
d200: 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  y the sqlite_mas
d210: 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72 79 20  ter table entry 
d220: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 74 73  of the table its
d230: 65 6c 66 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20  elf..**     (3) 
d240: 20 53 65 74 20 74 68 65 20 49 6e 64 65 78 2e 74   Set the Index.t
d250: 6e 75 6d 20 6f 66 20 74 68 65 20 50 52 49 4d 41  num of the PRIMA
d260: 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a  RY KEY Index obj
d270: 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20  ect in the.**   
d280: 20 20 20 20 20 20 20 73 63 68 65 6d 61 20 74 6f         schema to
d290: 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 72   the rootpage fr
d2a0: 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  om the main tabl
d2b0: 65 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 53  e..**     (4)  S
d2c0: 65 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  et all columns o
d2d0: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
d2e0: 59 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20  Y schema object 
d2f0: 74 6f 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a  to be NOT NULL..
d300: 2a 2a 20 20 20 20 20 28 35 29 20 20 41 64 64 20  **     (5)  Add 
d310: 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  all table column
d320: 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59  s to the PRIMARY
d330: 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63   KEY Index objec
d340: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f  t.**          so
d350: 20 74 68 61 74 20 74 68 65 20 50 52 49 4d 41 52   that the PRIMAR
d360: 59 20 4b 45 59 20 69 73 20 61 20 63 6f 76 65 72  Y KEY is a cover
d370: 69 6e 67 20 69 6e 64 65 78 2e 20 20 54 68 65 20  ing index.  The 
d380: 73 75 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20 20  surplus.**      
d390: 20 20 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20      columns are 
d3a0: 70 61 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f 2e  part of KeyInfo.
d3b0: 6e 58 46 69 65 6c 64 20 61 6e 64 20 61 72 65 20  nXField and are 
d3c0: 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  not used for.** 
d3d0: 20 20 20 20 20 20 20 20 20 73 6f 72 74 69 6e 67           sorting
d3e0: 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72 20 75 6e   or lookup or un
d3f0: 69 71 75 65 6e 65 73 73 20 63 68 65 63 6b 73 2e  iqueness checks.
d400: 0a 2a 2a 20 20 20 20 20 28 36 29 20 20 52 65 70  .**     (6)  Rep
d410: 6c 61 63 65 20 74 68 65 20 72 6f 77 69 64 20 74  lace the rowid t
d420: 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75 74 6f 6d  ail on all autom
d430: 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74  atically generat
d440: 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20 20 20 20  ed UNIQUE.**    
d450: 20 20 20 20 20 20 69 6e 64 69 63 65 73 20 77 69        indices wi
d460: 74 68 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  th the PRIMARY K
d470: 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73  EY columns..*/.s
d480: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 76 65  tatic void conve
d490: 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64  rtToWithoutRowid
d4a0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
d4b0: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
d4c0: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  ){.  Index *pIdx
d4d0: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b 0a  ;.  Index *pPk;.
d4e0: 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20 69 6e 74    int nPk;.  int
d4f0: 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33   i, j;.  sqlite3
d500: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d510: 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  b;.  Vdbe *v = p
d520: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20  Parse->pVdbe;.. 
d530: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
d540: 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 6f  OP_CreateTable o
d550: 70 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64  pcode that would
d560: 20 6e 6f 72 6d 61 6c 6c 79 20 63 72 65 61 74 65   normally create
d570: 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6f 74 2d 70   the.  ** root-p
d580: 61 67 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c  age for the tabl
d590: 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 43 72 65  e into an OP_Cre
d5a0: 61 74 65 49 6e 64 65 78 20 6f 70 63 6f 64 65 2e  ateIndex opcode.
d5b0: 20 20 54 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a    The index.  **
d5c0: 20 63 72 65 61 74 65 64 20 77 69 6c 6c 20 62 65   created will be
d5d0: 63 6f 6d 65 20 74 68 65 20 50 52 49 4d 41 52 59  come the PRIMARY
d5e0: 20 4b 45 59 20 69 6e 64 65 78 2e 0a 20 20 2a 2f   KEY index..  */
d5f0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61  .  if( pParse->a
d600: 64 64 72 43 72 54 61 62 20 29 7b 0a 20 20 20 20  ddrCrTab ){.    
d610: 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 20  assert( v );.   
d620: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
d630: 70 28 76 2c 20 70 50 61 72 73 65 2d 3e 61 64 64  p(v, pParse->add
d640: 72 43 72 54 61 62 29 2d 3e 6f 70 63 6f 64 65 20  rCrTab)->opcode 
d650: 3d 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78  = OP_CreateIndex
d660: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
d670: 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  te the PRIMARY K
d680: 45 59 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20 69  EY index.  Or, i
d690: 66 20 74 68 69 73 20 74 61 62 6c 65 20 77 61 73  f this table was
d6a0: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
d6b0: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
d6c0: 41 52 59 20 4b 45 59 20 74 61 62 6c 65 2c 20 63  ARY KEY table, c
d6d0: 72 65 61 74 65 20 61 20 6e 65 77 20 50 52 49 4d  reate a new PRIM
d6e0: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 0a  ARY KEY index. .
d6f0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d    */.  if( pTab-
d700: 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20  >iPKey>=0 ){.   
d710: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
d720: 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  ;.    pList = sq
d730: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
d740: 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30  end(pParse, 0, 0
d750: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
d760: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
d770: 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e    pList->a[0].zN
d780: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
d790: 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  trDup(pParse->db
d7a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7c0: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
d7d0: 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79  aCol[pTab->iPKey
d7e0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c  ].zName);.    pL
d7f0: 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72  ist->a[0].sortOr
d800: 64 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 69 50  der = pParse->iP
d810: 6b 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  kSortOrder;.    
d820: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
d830: 70 4e 65 77 54 61 62 6c 65 3d 3d 70 54 61 62 20  pNewTable==pTab 
d840: 29 3b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c  );.    pPk = sql
d850: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
d860: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c  pParse, 0, 0, 0,
d870: 20 70 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b 65   pList, pTab->ke
d880: 79 43 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c 20  yConf, 0, 0, 0, 
d890: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 50 6b 3d  0);.    if( pPk=
d8a0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
d8b0: 20 70 50 6b 2d 3e 69 64 78 54 79 70 65 20 3d 20   pPk->idxType = 
d8c0: 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50  SQLITE_IDXTYPE_P
d8d0: 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20 20 20 70  RIMARYKEY;.    p
d8e0: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
d8f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
d900: 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
d910: 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
d920: 3b 0a 0a 20 20 20 20 2f 2a 20 42 79 70 61 73 73  ;..    /* Bypass
d930: 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66   the creation of
d940: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
d950: 20 62 74 72 65 65 20 61 6e 64 20 74 68 65 20 73   btree and the s
d960: 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 20  qlite_master.   
d970: 20 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e   ** table entry.
d980: 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 72 65   This is only re
d990: 71 75 69 72 65 64 20 69 66 20 63 75 72 72 65 6e  quired if curren
d9a0: 74 6c 79 20 67 65 6e 65 72 61 74 69 6e 67 20 56  tly generating V
d9b0: 44 42 45 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20  DBE.    ** code 
d9c0: 66 6f 72 20 61 20 43 52 45 41 54 45 20 54 41 42  for a CREATE TAB
d9d0: 4c 45 20 28 6e 6f 74 20 77 68 65 6e 20 70 61 72  LE (not when par
d9e0: 73 69 6e 67 20 6f 6e 65 20 61 73 20 70 61 72 74  sing one as part
d9f0: 20 6f 66 20 72 65 61 64 69 6e 67 0a 20 20 20 20   of reading.    
da00: 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 73 63  ** a database sc
da10: 68 65 6d 61 29 2e 20 20 2a 2f 0a 20 20 20 20 69  hema).  */.    i
da20: 66 28 20 76 20 29 7b 0a 20 20 20 20 20 20 61 73  f( v ){.      as
da30: 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62  sert( db->init.b
da40: 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  usy==0 );.      
da50: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
da60: 28 76 2c 20 70 50 6b 2d 3e 74 6e 75 6d 29 2d 3e  (v, pPk->tnum)->
da70: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 47 6f 74 6f  opcode = OP_Goto
da80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
da90: 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 61 6c      ** Remove al
daa0: 6c 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75  l redundant colu
dab0: 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 50 52 49  mns from the PRI
dac0: 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72 20 65  MARY KEY.  For e
dad0: 78 61 6d 70 6c 65 2c 20 63 68 61 6e 67 65 0a 20  xample, change. 
dae0: 20 20 20 2a 2a 20 22 50 52 49 4d 41 52 59 20 4b     ** "PRIMARY K
daf0: 45 59 28 61 2c 62 2c 61 2c 62 2c 63 2c 62 2c 63  EY(a,b,a,b,c,b,c
db00: 2c 64 29 22 20 69 6e 74 6f 20 6a 75 73 74 20 22  ,d)" into just "
db10: 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c  PRIMARY KEY(a,b,
db20: 63 2c 64 29 22 2e 20 20 4c 61 74 65 72 0a 20 20  c,d)".  Later.  
db30: 20 20 2a 2a 20 63 6f 64 65 20 61 73 73 75 6d 65    ** code assume
db40: 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  s the PRIMARY KE
db50: 59 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 65  Y contains no re
db60: 70 65 61 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a  peated columns..
db70: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
db80: 3d 6a 3d 31 3b 20 69 3c 70 50 6b 2d 3e 6e 4b 65  =j=1; i<pPk->nKe
db90: 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
dba0: 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28    if( hasColumn(
dbb0: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a  pPk->aiColumn, j
dbc0: 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  , pPk->aiColumn[
dbd0: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  i]) ){.        p
dbe0: 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 0a 20  Pk->nColumn--;. 
dbf0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
dc00: 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d      pPk->aiColum
dc10: 6e 5b 6a 2b 2b 5d 20 3d 20 70 50 6b 2d 3e 61 69  n[j++] = pPk->ai
dc20: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
dc30: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 6b   }.    }.    pPk
dc40: 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6a 3b 0a 20  ->nKeyCol = j;. 
dc50: 20 7d 0a 20 20 70 50 6b 2d 3e 69 73 43 6f 76 65   }.  pPk->isCove
dc60: 72 69 6e 67 20 3d 20 31 3b 0a 20 20 61 73 73 65  ring = 1;.  asse
dc70: 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20  rt( pPk!=0 );.  
dc80: 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43  nPk = pPk->nKeyC
dc90: 6f 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  ol;..  /* Make s
dca0: 75 72 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e  ure every column
dcb0: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
dcc0: 4b 45 59 20 69 73 20 4e 4f 54 20 4e 55 4c 4c 2e  KEY is NOT NULL.
dcd0: 20 20 28 45 78 63 65 70 74 2c 0a 20 20 2a 2a 20    (Except,.  ** 
dce0: 64 6f 20 6e 6f 74 20 65 6e 66 6f 72 63 65 20 74  do not enforce t
dcf0: 68 69 73 20 66 6f 72 20 69 6d 70 6f 73 74 65 72  his for imposter
dd00: 20 74 61 62 6c 65 73 2e 29 20 2a 2f 0a 20 20 69   tables.) */.  i
dd10: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 69 6d 70  f( !db->init.imp
dd20: 6f 73 74 65 72 54 61 62 6c 65 20 29 7b 0a 20 20  osterTable ){.  
dd30: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b    for(i=0; i<nPk
dd40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 54  ; i++){.      pT
dd50: 61 62 2d 3e 61 43 6f 6c 5b 70 50 6b 2d 3e 61 69  ab->aCol[pPk->ai
dd60: 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75  Column[i]].notNu
dd70: 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ll = 1;.    }.  
dd80: 20 20 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e 75    pPk->uniqNotNu
dd90: 6c 6c 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  ll = 1;.  }..  /
dda0: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
ddb0: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
ddc0: 45 59 20 69 73 20 74 68 65 20 74 61 62 6c 65 20  EY is the table 
ddd0: 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20 70  root page */.  p
dde0: 50 6b 2d 3e 74 6e 75 6d 20 3d 20 70 54 61 62 2d  Pk->tnum = pTab-
ddf0: 3e 74 6e 75 6d 3b 0a 0a 20 20 2f 2a 20 55 70 64  >tnum;..  /* Upd
de00: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
de10: 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
de20: 20 6f 66 20 61 6c 6c 20 55 4e 49 51 55 45 20 69   of all UNIQUE i
de30: 6e 64 69 63 65 73 20 62 79 20 63 6f 6e 76 65 72  ndices by conver
de40: 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 69  ting.  ** the fi
de50: 6e 61 6c 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e  nal rowid column
de60: 20 69 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72   into one or mor
de70: 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
de80: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 20 20   PRIMARY KEY..  
de90: 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54  */.  for(pIdx=pT
dea0: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
deb0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
dec0: 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  xt){.    int n;.
ded0: 20 20 20 20 69 66 28 20 49 73 50 72 69 6d 61 72      if( IsPrimar
dee0: 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20  yKeyIndex(pIdx) 
def0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
df00: 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 6e 50 6b  for(i=n=0; i<nPk
df10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
df20: 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64  ( !hasColumn(pId
df30: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64  x->aiColumn, pId
df40: 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d  x->nKeyCol, pPk-
df50: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 20  >aiColumn[i]) ) 
df60: 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n++;.    }.    i
df70: 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
df80: 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69   /* This index i
df90: 73 20 61 20 73 75 70 65 72 73 65 74 20 6f 66 20  s a superset of 
dfa0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
dfb0: 2a 2f 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 6e  */.      pIdx->n
dfc0: 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 6e  Column = pIdx->n
dfd0: 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 63 6f  KeyCol;.      co
dfe0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
dff0: 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65    if( resizeInde
e000: 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 49 64 78  xObject(db, pIdx
e010: 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b  , pIdx->nKeyCol+
e020: 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  n) ) return;.   
e030: 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 49 64 78   for(i=0, j=pIdx
e040: 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b  ->nKeyCol; i<nPk
e050: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
e060: 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64  ( !hasColumn(pId
e070: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64  x->aiColumn, pId
e080: 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d  x->nKeyCol, pPk-
e090: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b  >aiColumn[i]) ){
e0a0: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
e0b0: 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 50 6b  iColumn[j] = pPk
e0c0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
e0d0: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
e0e0: 6f 6c 6c 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a  oll[j] = pPk->az
e0f0: 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Coll[i];.       
e100: 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   j++;.      }.  
e110: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
e120: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70  pIdx->nColumn>=p
e130: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 20 29  Idx->nKeyCol+n )
e140: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
e150: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  dx->nColumn>=j )
e160: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  ;.  }..  /* Add 
e170: 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  all table column
e180: 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59  s to the PRIMARY
e190: 20 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a 2f 0a   KEY index.  */.
e1a0: 20 20 69 66 28 20 6e 50 6b 3c 70 54 61 62 2d 3e    if( nPk<pTab->
e1b0: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  nCol ){.    if( 
e1c0: 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63  resizeIndexObjec
e1d0: 74 28 64 62 2c 20 70 50 6b 2c 20 70 54 61 62 2d  t(db, pPk, pTab-
e1e0: 3e 6e 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 3b  >nCol) ) return;
e1f0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d  .    for(i=0, j=
e200: 6e 50 6b 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  nPk; i<pTab->nCo
e210: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
e220: 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 50  f( !hasColumn(pP
e230: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20  k->aiColumn, j, 
e240: 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  i) ){.        as
e250: 73 65 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f  sert( j<pPk->nCo
e260: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  lumn );.        
e270: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  pPk->aiColumn[j]
e280: 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 50   = i;.        pP
e290: 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 22  k->azColl[j] = "
e2a0: 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20  BINARY";.       
e2b0: 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   j++;.      }.  
e2c0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
e2d0: 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20  pPk->nColumn==j 
e2e0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
e2f0: 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a  Tab->nCol==j );.
e300: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b    }else{.    pPk
e310: 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62  ->nColumn = pTab
e320: 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ->nCol;.  }.}../
e330: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
e340: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  e is called to r
e350: 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20  eport the final 
e360: 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61  ")" that termina
e370: 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20  tes.** a CREATE 
e380: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
e390: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  .**.** The table
e3a0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
e3b0: 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75  other action rou
e3c0: 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20  tines have been 
e3d0: 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61  building.** is a
e3e0: 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65  dded to the inte
e3f0: 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73  rnal hash tables
e400: 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72  , assuming no er
e410: 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63  rors have.** occ
e420: 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  urred..**.** An 
e430: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61  entry for the ta
e440: 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74  ble is made in t
e450: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
e460: 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a  on disk, unless.
e470: 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  ** this is a tem
e480: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20  porary table or 
e490: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
e4a0: 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74  .  When db->init
e4b0: 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d  .busy==1.** it m
e4c0: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
e4d0: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ing the sqlite_m
e4e0: 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61  aster table beca
e4f0: 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63  use we just.** c
e500: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20  onnected to the 
e510: 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61  database or beca
e520: 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  use the sqlite_m
e530: 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a  aster table has.
e540: 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e  ** recently chan
e550: 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74 72  ged, so the entr
e560: 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65  y for this table
e570: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
e580: 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  in.** the sqlite
e590: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20  _master table.  
e5a0: 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  We do not want t
e5b0: 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69  o create it agai
e5c0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
e5d0: 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74  pSelect argument
e5e0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74   is not NULL, it
e5f0: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
e600: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20   routine.** was 
e610: 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
e620: 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74   a table generat
e630: 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43  ed from a .** "C
e640: 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20  REATE TABLE ... 
e650: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73  AS SELECT ..." s
e660: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63  tatement.  The c
e670: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a  olumn names of.*
e680: 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * the new table 
e690: 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72  will match the r
e6a0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
e6b0: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64   SELECT..*/.void
e6c0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
e6d0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e6e0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
e6f0: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
e700: 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20    Token *pCons, 
e710: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
e720: 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72   ',' token after
e730: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
e740: 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65   defn. */.  Toke
e750: 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20  n *pEnd,        
e760: 20 20 20 20 2f 2a 20 54 68 65 20 27 29 27 20 62      /* The ')' b
e770: 65 66 6f 72 65 20 6f 70 74 69 6f 6e 73 20 69 6e  efore options in
e780: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
e790: 45 20 2a 2f 0a 20 20 75 38 20 74 61 62 4f 70 74  E */.  u8 tabOpt
e7a0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
e7b0: 2a 20 45 78 74 72 61 20 74 61 62 6c 65 20 6f 70  * Extra table op
e7c0: 74 69 6f 6e 73 2e 20 55 73 75 61 6c 6c 79 20 30  tions. Usually 0
e7d0: 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  . */.  Select *p
e7e0: 53 65 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f  Select         /
e7f0: 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20  * Select from a 
e800: 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53  "CREATE ... AS S
e810: 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54  ELECT" */.){.  T
e820: 61 62 6c 65 20 2a 70 3b 20 20 20 20 20 20 20 20  able *p;        
e830: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
e840: 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  new table */.  s
e850: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
e860: 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20  rse->db; /* The 
e870: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
e880: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ion */.  int iDb
e890: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e8a0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69     /* Database i
e8b0: 6e 20 77 68 69 63 68 20 74 68 65 20 74 61 62 6c  n which the tabl
e8c0: 65 20 6c 69 76 65 73 20 2a 2f 0a 20 20 49 6e 64  e lives */.  Ind
e8d0: 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
e8e0: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6d 70         /* An imp
e8f0: 6c 69 65 64 20 69 6e 64 65 78 20 6f 66 20 74 68  lied index of th
e900: 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66  e table */..  if
e910: 28 20 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65  ( pEnd==0 && pSe
e920: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  lect==0 ){.    r
e930: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
e940: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
e950: 46 61 69 6c 65 64 20 29 3b 0a 20 20 70 20 3d 20  Failed );.  p = 
e960: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
e970: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  e;.  if( p==0 ) 
e980: 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
e990: 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
e9a0: 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b  y || !pSelect );
e9b0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  ..  /* If the db
e9c0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31  ->init.busy is 1
e9d0: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
e9e0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c   reading the SQL
e9f0: 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73   off the.  ** "s
ea00: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72  qlite_master" or
ea10: 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61   "sqlite_temp_ma
ea20: 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74  ster" table on t
ea30: 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f  he disk..  ** So
ea40: 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f   do not write to
ea50: 20 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e   the disk again.
ea60: 20 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f    Extract the ro
ea70: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  ot page number. 
ea80: 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c   ** for the tabl
ea90: 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69  e from the db->i
eaa0: 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c  nit.newTnum fiel
eab0: 64 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e 75  d.  (The page nu
eac0: 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  mber.  ** should
ead0: 20 68 61 76 65 20 62 65 65 6e 20 70 75 74 20 74   have been put t
eae0: 68 65 72 65 20 62 79 20 74 68 65 20 73 71 6c 69  here by the sqli
eaf0: 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65  teOpenCb routine
eb00: 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  .).  */.  if( db
eb10: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
eb20: 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d     p->tnum = db-
eb30: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
eb40: 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c   }..  /* Special
eb50: 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
eb60: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 54 61  WITHOUT ROWID Ta
eb70: 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20 74 61  bles */.  if( ta
eb80: 62 4f 70 74 73 20 26 20 54 46 5f 57 69 74 68 6f  bOpts & TF_Witho
eb90: 75 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69  utRowid ){.    i
eba0: 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20  f( (p->tabFlags 
ebb0: 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
ebc0: 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  nt) ){.      sql
ebd0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
ebe0: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22  rse,.          "
ebf0: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6e 6f  AUTOINCREMENT no
ec00: 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 57 49 54  t allowed on WIT
ec10: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
ec20: 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  s");.      retur
ec30: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  n;.    }.    if(
ec40: 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20   (p->tabFlags & 
ec50: 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79  TF_HasPrimaryKey
ec60: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
ec70: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
ec80: 61 72 73 65 2c 20 22 50 52 49 4d 41 52 59 20 4b  arse, "PRIMARY K
ec90: 45 59 20 6d 69 73 73 69 6e 67 20 6f 6e 20 74 61  EY missing on ta
eca0: 62 6c 65 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d  ble %s", p->zNam
ecb0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
ecc0: 20 20 20 20 20 70 2d 3e 74 61 62 46 6c 61 67 73       p->tabFlags
ecd0: 20 7c 3d 20 54 46 5f 57 69 74 68 6f 75 74 52 6f   |= TF_WithoutRo
ece0: 77 69 64 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62  wid | TF_NoVisib
ecf0: 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 63  leRowid;.      c
ed00: 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52  onvertToWithoutR
ed10: 6f 77 69 64 54 61 62 6c 65 28 70 50 61 72 73 65  owidTable(pParse
ed20: 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , p);.    }.  }.
ed30: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
ed40: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
ed50: 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a  , p->pSchema);..
ed60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ed70: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52  MIT_CHECK.  /* R
ed80: 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20  esolve names in 
ed90: 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  all CHECK constr
eda0: 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73  aint expressions
edb0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
edc0: 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 73 71  pCheck ){.    sq
edd0: 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66  lite3ResolveSelf
ede0: 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65  Reference(pParse
edf0: 2c 20 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b 2c  , p, NC_IsCheck,
ee00: 20 30 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b 0a   0, p->pCheck);.
ee10: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64    }.#endif /* !d
ee20: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
ee30: 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20  IT_CHECK) */..  
ee40: 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  /* Estimate the 
ee50: 61 76 65 72 61 67 65 20 72 6f 77 20 73 69 7a 65  average row size
ee60: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61   for the table a
ee70: 6e 64 20 66 6f 72 20 61 6c 6c 20 69 6d 70 6c 69  nd for all impli
ee80: 65 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  ed indices */.  
ee90: 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64  estimateTableWid
eea0: 74 68 28 70 29 3b 0a 20 20 66 6f 72 28 70 49 64  th(p);.  for(pId
eeb0: 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  x=p->pIndex; pId
eec0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
eed0: 65 78 74 29 7b 0a 20 20 20 20 65 73 74 69 6d 61  ext){.    estima
eee0: 74 65 49 6e 64 65 78 57 69 64 74 68 28 70 49 64  teIndexWidth(pId
eef0: 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  x);.  }..  /* If
ef00: 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   not initializin
ef10: 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  g, then create a
ef20: 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20   record for the 
ef30: 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69  new table.  ** i
ef40: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  n the SQLITE_MAS
ef50: 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65  TER table of the
ef60: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a   database..  **.
ef70: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
ef80: 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c  a TEMPORARY tabl
ef90: 65 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e 74  e, write the ent
efa0: 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69  ry into the auxi
efb0: 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20  liary.  ** file 
efc0: 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20  instead of into 
efd0: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
efe0: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  e file..  */.  i
eff0: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
f000: 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  y ){.    int n;.
f010: 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20      Vdbe *v;.   
f020: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20   char *zType;   
f030: 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74   /* "view" or "t
f040: 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61  able" */.    cha
f050: 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20  r *zType2;   /* 
f060: 22 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45  "VIEW" or "TABLE
f070: 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  " */.    char *z
f080: 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74  Stmt;    /* Text
f090: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
f0a0: 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56  ABLE or CREATE V
f0b0: 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  IEW statement */
f0c0: 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ..    v = sqlite
f0d0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
f0e0: 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
f0f0: 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  v==0) ) return;.
f100: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f110: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
f120: 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20  se, 0);..    /* 
f130: 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69  .    ** Initiali
f140: 7a 65 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65  ze zType for the
f150: 20 6e 65 77 20 76 69 65 77 20 6f 72 20 74 61 62   new view or tab
f160: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
f170: 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  f( p->pSelect==0
f180: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72   ){.      /* A r
f190: 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a  egular table */.
f1a0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74        zType = "t
f1b0: 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79  able";.      zTy
f1c0: 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23  pe2 = "TABLE";.#
f1d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f1e0: 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73  IT_VIEW.    }els
f1f0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69  e{.      /* A vi
f200: 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70  ew */.      zTyp
f210: 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20  e = "view";.    
f220: 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57    zType2 = "VIEW
f230: 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  ";.#endif.    }.
f240: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
f250: 69 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  is a CREATE TABL
f260: 45 20 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e  E xx AS SELECT .
f270: 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65 20  .., execute the 
f280: 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74  SELECT.    ** st
f290: 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c  atement to popul
f2a0: 61 74 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c  ate the new tabl
f2b0: 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65  e. The root-page
f2c0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a   number for the.
f2d0: 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65      ** new table
f2e0: 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72 20   is in register 
f2f0: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e  pParse->regRoot.
f300: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
f310: 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54 20 68  nce the SELECT h
f320: 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79  as been coded by
f330: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
f340: 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20  , it is in a.   
f350: 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61   ** suitable sta
f360: 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20  te to query for 
f370: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
f380: 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65   and types to be
f390: 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20   used.    ** by 
f3a0: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20  the new table.. 
f3b0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73     **.    ** A s
f3c0: 68 61 72 65 64 2d 63 61 63 68 65 20 77 72 69 74  hared-cache writ
f3d0: 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  e-lock is not re
f3e0: 71 75 69 72 65 64 20 74 6f 20 77 72 69 74 65 20  quired to write 
f3f0: 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  to the new table
f400: 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63  ,.    ** as a sc
f410: 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68  hema-lock must h
f420: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
f430: 20 6f 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65   obtained to cre
f440: 61 74 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20  ate it. Since.  
f450: 20 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f    ** a schema-lo
f460: 63 6b 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20  ck excludes all 
f470: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 75  other database u
f480: 73 65 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d  sers, the write-
f490: 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a  lock would.    *
f4a0: 2a 20 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a  * be redundant..
f4b0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
f4c0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
f4d0: 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
f4e0: 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 68 65      /* Where the
f4f0: 20 53 45 4c 45 43 54 20 73 68 6f 75 6c 64 20 73   SELECT should s
f500: 74 6f 72 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a  tore results */.
f510: 20 20 20 20 20 20 69 6e 74 20 72 65 67 59 69 65        int regYie
f520: 6c 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 67  ld;       /* Reg
f530: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f  ister holding co
f540: 2d 72 6f 75 74 69 6e 65 20 65 6e 74 72 79 2d 70  -routine entry-p
f550: 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  oint */.      in
f560: 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20  t addrTop;      
f570: 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
f580: 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  co-routine */.  
f590: 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 3b 20      int regRec; 
f5a0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 63          /* A rec
f5b0: 6f 72 64 20 74 6f 20 62 65 20 69 6e 73 65 72 74  ord to be insert
f5c0: 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 74 61   into the new ta
f5d0: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ble */.      int
f5e0: 20 72 65 67 52 6f 77 69 64 3b 20 20 20 20 20 20   regRowid;      
f5f0: 20 2f 2a 20 52 6f 77 69 64 20 6f 66 20 74 68 65   /* Rowid of the
f600: 20 6e 65 78 74 20 72 6f 77 20 74 6f 20 69 6e 73   next row to ins
f610: 65 72 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ert */.      int
f620: 20 61 64 64 72 49 6e 73 4c 6f 6f 70 3b 20 20 20   addrInsLoop;   
f630: 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c   /* Top of the l
f640: 6f 6f 70 20 66 6f 72 20 69 6e 73 65 72 74 69 6e  oop for insertin
f650: 67 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20  g rows */.      
f660: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20  Table *pSelTab; 
f670: 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 74      /* A table t
f680: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
f690: 65 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73  e SELECT results
f6a0: 20 2a 2f 0a 0a 20 20 20 20 20 20 72 65 67 59 69   */..      regYi
f6b0: 65 6c 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  eld = ++pParse->
f6c0: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52  nMem;.      regR
f6d0: 65 63 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ec = ++pParse->n
f6e0: 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 6f  Mem;.      regRo
f6f0: 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  wid = ++pParse->
f700: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65  nMem;.      asse
f710: 72 74 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d  rt(pParse->nTab=
f720: 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  =1);.      sqlit
f730: 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  e3MayAbort(pPars
f740: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
f750: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
f760: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20  P_OpenWrite, 1, 
f770: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c  pParse->regRoot,
f780: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
f790: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
f7a0: 28 76 2c 20 4f 50 46 4c 41 47 5f 50 32 49 53 52  (v, OPFLAG_P2ISR
f7b0: 45 47 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  EG);.      pPars
f7c0: 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20  e->nTab = 2;.   
f7d0: 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c     addrTop = sql
f7e0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
f7f0: 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 20 20  ddr(v) + 1;.    
f800: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f810: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
f820: 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c  routine, regYiel
f830: 64 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a  d, 0, addrTop);.
f840: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
f850: 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
f860: 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t, SRT_Coroutine
f870: 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20  , regYield);.   
f880: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
f890: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
f8a0: 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
f8b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f8c0: 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75  1(v, OP_EndCorou
f8d0: 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 29 3b  tine, regYield);
f8e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f8f0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
f900: 64 72 54 6f 70 20 2d 20 31 29 3b 0a 20 20 20 20  drTop - 1);.    
f910: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
f920: 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  rr ) return;.   
f930: 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
f940: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
f950: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
f960: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 69 66  elect);.      if
f970: 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72  ( pSelTab==0 ) r
f980: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 61 73 73  eturn;.      ass
f990: 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20  ert( p->aCol==0 
f9a0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c  );.      p->nCol
f9b0: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c   = pSelTab->nCol
f9c0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20  ;.      p->aCol 
f9d0: 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
f9e0: 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  .      pSelTab->
f9f0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
fa00: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  pSelTab->aCol = 
fa10: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
fa20: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
fa30: 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20  pSelTab);.      
fa40: 61 64 64 72 49 6e 73 4c 6f 6f 70 20 3d 20 73 71  addrInsLoop = sq
fa50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
fa60: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 64 65 73  v, OP_Yield, des
fa70: 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  t.iSDParm);.    
fa80: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
fa90: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
faa0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
fab0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 64 65 73  _MakeRecord, des
fac0: 74 2e 69 53 64 73 74 2c 20 64 65 73 74 2e 6e 53  t.iSdst, dest.nS
fad0: 64 73 74 2c 20 72 65 67 52 65 63 29 3b 0a 20 20  dst, regRec);.  
fae0: 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
faf0: 41 66 66 69 6e 69 74 79 28 76 2c 20 70 2c 20 30  Affinity(v, p, 0
fb00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fb10: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
fb20: 5f 4e 65 77 52 6f 77 69 64 2c 20 31 2c 20 72 65  _NewRowid, 1, re
fb30: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
fb40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
fb50: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 31  (v, OP_Insert, 1
fb60: 2c 20 72 65 67 52 65 63 2c 20 72 65 67 52 6f 77  , regRec, regRow
fb70: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
fb80: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
fb90: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
fba0: 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  InsLoop);.      
fbb0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
fbc0: 65 72 65 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f  ere(v, addrInsLo
fbd0: 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  op);.      sqlit
fbe0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
fbf0: 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20  OP_Close, 1);.  
fc00: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70    }..    /* Comp
fc10: 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ute the complete
fc20: 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
fc30: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ATE statement */
fc40: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
fc50: 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   ){.      zStmt 
fc60: 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d  = createTableStm
fc70: 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65  t(db, p);.    }e
fc80: 6c 73 65 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e  lse{.      Token
fc90: 20 2a 70 45 6e 64 32 20 3d 20 74 61 62 4f 70 74   *pEnd2 = tabOpt
fca0: 73 20 3f 20 26 70 50 61 72 73 65 2d 3e 73 4c 61  s ? &pParse->sLa
fcb0: 73 74 54 6f 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a  stToken : pEnd;.
fcc0: 20 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 28        n = (int)(
fcd0: 70 45 6e 64 32 2d 3e 7a 20 2d 20 70 50 61 72 73  pEnd2->z - pPars
fce0: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29  e->sNameToken.z)
fcf0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 6e 64  ;.      if( pEnd
fd00: 32 2d 3e 7a 5b 30 5d 21 3d 27 3b 27 20 29 20 6e  2->z[0]!=';' ) n
fd10: 20 2b 3d 20 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20   += pEnd2->n;.  
fd20: 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69      zStmt = sqli
fd30: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a  te3MPrintf(db, .
fd40: 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
fd50: 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70  E %s %.*s", zTyp
fd60: 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73  e2, n, pParse->s
fd70: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20  NameToken.z.    
fd80: 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
fd90: 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68  /* A slot for th
fda0: 65 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72  e record has alr
fdb0: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
fdc0: 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20  ted in the .    
fdd0: 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ** SQLITE_MASTER
fde0: 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74   table.  We just
fdf0: 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65 20   need to update 
fe00: 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61  that slot with a
fe10: 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  ll.    ** the in
fe20: 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20  formation we've 
fe30: 63 6f 6c 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a  collected..    *
fe40: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  /.    sqlite3Nes
fe50: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
fe60: 0a 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25  .      "UPDATE %
fe70: 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 20  Q.%s ".         
fe80: 22 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20  "SET type='%s', 
fe90: 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d  name=%Q, tbl_nam
fea0: 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23  e=%Q, rootpage=#
feb0: 25 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20  %d, sql=%Q ".   
fec0: 20 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64      "WHERE rowid
fed0: 3d 23 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d  =#%d",.      db-
fee0: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
fef0: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
ff00: 62 29 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c  b),.      zType,
ff10: 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c  .      p->zName,
ff20: 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c  .      p->zName,
ff30: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
ff40: 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53  egRoot,.      zS
ff50: 74 6d 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73  tmt,.      pPars
ff60: 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20  e->regRowid.    
ff70: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
ff80: 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b  Free(db, zStmt);
ff90: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
ffa0: 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
ffb0: 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
ffc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
ffd0: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a  INCREMENT.    /*
ffe0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
fff0: 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61   we need to crea
10000 74 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71  te an sqlite_seq
10010 75 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a  uence table for.
10020 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74      ** keeping t
10030 72 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72  rack of autoincr
10040 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20  ement keys..    
10050 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 61  */.    if( p->ta
10060 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
10070 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20  increment ){.   
10080 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
10090 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20  ->aDb[iDb];.    
100a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
100b0 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
100c0 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
100d0 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70        if( pDb->p
100e0 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d  Schema->pSeqTab=
100f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
10100 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
10110 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
10120 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
10130 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65   %Q.sqlite_seque
10140 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a  nce(name,seq)",.
10150 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a            pDb->z
10160 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a  Name.        );.
10170 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
10180 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70  ndif..    /* Rep
10190 61 72 73 65 20 65 76 65 72 79 74 68 69 6e 67 20  arse everything 
101a0 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e  to update our in
101b0 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75  ternal data stru
101c0 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71  ctures */.    sq
101d0 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73  lite3VdbeAddPars
101e0 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62  eSchemaOp(v, iDb
101f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
10200 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
10210 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 20 41  "tbl_name='%q' A
10220 4e 44 20 74 79 70 65 21 3d 27 74 72 69 67 67 65  ND type!='trigge
10230 72 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b  r'", p->zName));
10240 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20  .  }...  /* Add 
10250 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65  the table to the
10260 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
10270 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
10280 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
10290 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
102a0 75 73 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  usy ){.    Table
102b0 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65   *pOld;.    Sche
102c0 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d  ma *pSchema = p-
102d0 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73  >pSchema;.    as
102e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
102f0 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
10300 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
10310 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61  pOld = sqlite3Ha
10320 73 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d  shInsert(&pSchem
10330 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a  a->tblHash, p->z
10340 4e 61 6d 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  Name, p);.    if
10350 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  ( pOld ){.      
10360 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20  assert( p==pOld 
10370 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75  );  /* Malloc mu
10380 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 69  st have failed i
10390 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65 72 74  nside HashInsert
103a0 28 29 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e  () */.      db->
103b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
103c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
103d0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
103e0 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b  ->pNewTable = 0;
103f0 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
10400 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
10410 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66  hanges;..#ifndef
10420 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54   SQLITE_OMIT_ALT
10430 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ERTABLE.    if( 
10440 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  !p->pSelect ){. 
10450 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
10460 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  *zName = (const 
10470 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 73  char *)pParse->s
10480 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20  NameToken.z;.   
10490 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20     int nName;.  
104a0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53 65      assert( !pSe
104b0 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26 26  lect && pCons &&
104c0 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 69   pEnd );.      i
104d0 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29  f( pCons->z==0 )
104e0 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73 20  {.        pCons 
104f0 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  = pEnd;.      }.
10500 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69        nName = (i
10510 6e 74 29 28 28 63 6f 6e 73 74 20 63 68 61 72 20  nt)((const char 
10520 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61  *)pCons->z - zNa
10530 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  me);.      p->ad
10540 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 20  dColOffset = 13 
10550 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43 68 61  + sqlite3Utf8Cha
10560 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  rLen(zName, nNam
10570 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
10580 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
10590 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
105a0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  ./*.** The parse
105b0 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
105c0 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  tine in order to
105d0 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49   create a new VI
105e0 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  EW.*/.void sqlit
105f0 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 20  e3CreateView(.  
10600 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
10610 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
10620 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
10630 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20  oken *pBegin,   
10640 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
10650 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
10660 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  s the statement 
10670 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
10680 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e1,     /* The t
10690 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
106a0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
106b0 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  view */.  Token 
106c0 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20  *pName2,     /* 
106d0 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
106e0 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
106f0 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53   the view */.  S
10700 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
10710 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74    /* A SELECT st
10720 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c  atement that wil
10730 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
10740 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
10750 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a  sTemp,        /*
10760 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50   TRUE for a TEMP
10770 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20  ORARY view */.  
10780 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20  int noErr       
10790 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65     /* Suppress e
107a0 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66  rror messages if
107b0 20 56 49 45 57 20 61 6c 72 65 61 64 79 20 65 78   VIEW already ex
107c0 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ists */.){.  Tab
107d0 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a  le *p;.  int n;.
107e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
107f0 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20  .  Token sEnd;. 
10800 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20   DbFixer sFix;. 
10810 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20   Token *pName = 
10820 30 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20  0;.  int iDb;.  
10830 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
10840 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
10850 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20   pParse->nVar>0 
10860 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
10870 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
10880 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e  parameters are n
10890 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69  ot allowed in vi
108a0 65 77 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  ews");.    sqlit
108b0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
108c0 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  b, pSelect);.   
108d0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
108e0 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
108f0 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
10900 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c   pName2, isTemp,
10910 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20   1, 0, noErr);. 
10920 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
10930 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
10940 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
10950 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
10960 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
10970 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
10980 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
10990 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
109a0 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
109b0 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
109c0 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  ;.  iDb = sqlite
109d0 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
109e0 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  b, p->pSchema);.
109f0 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74    sqlite3FixInit
10a00 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20  (&sFix, pParse, 
10a10 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61  iDb, "view", pNa
10a20 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  me);.  if( sqlit
10a30 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46 69  e3FixSelect(&sFi
10a40 78 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20  x, pSelect) ){. 
10a50 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
10a60 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65  Delete(db, pSele
10a70 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ct);.    return;
10a80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
10a90 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e  a copy of the en
10aa0 74 69 72 65 20 53 45 4c 45 43 54 20 73 74 61 74  tire SELECT stat
10ab0 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e  ement that defin
10ac0 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a  es the view..  *
10ad0 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63  * This will forc
10ae0 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74  e all the Expr.t
10af0 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f  oken.z values to
10b00 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a   be dynamically.
10b10 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72    ** allocated r
10b20 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74  ather than point
10b30 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74   to the input st
10b40 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61  ring - which mea
10b50 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  ns that.  ** the
10b60 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61  y will persist a
10b70 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74  fter the current
10b80 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20   sqlite3_exec() 
10b90 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20  call returns..  
10ba0 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20  */.  p->pSelect 
10bb0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
10bc0 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c 20  up(db, pSelect, 
10bd0 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b  EXPRDUP_REDUCE);
10be0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
10bf0 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65  Delete(db, pSele
10c00 63 74 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ct);.  if( db->m
10c10 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
10c20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
10c30 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
10c40 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54  end of the CREAT
10c50 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74  E VIEW statement
10c60 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69  .  Make sEnd poi
10c70 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65  nt to.  ** the e
10c80 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20  nd..  */.  sEnd 
10c90 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54  = pParse->sLastT
10ca0 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 41 4c 57 41  oken;.  if( ALWA
10cb0 59 53 28 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 29  YS(sEnd.z[0]!=0)
10cc0 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27   && sEnd.z[0]!='
10cd0 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a  ;' ){.    sEnd.z
10ce0 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a   += sEnd.n;.  }.
10cf0 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20    sEnd.n = 0;.  
10d00 6e 20 3d 20 28 69 6e 74 29 28 73 45 6e 64 2e 7a  n = (int)(sEnd.z
10d10 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20   - pBegin->z);. 
10d20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a   z = pBegin->z;.
10d30 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
10d40 6e 3e 30 29 20 26 26 20 73 71 6c 69 74 65 33 49  n>0) && sqlite3I
10d50 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 20 29  sspace(z[n-1]) )
10d60 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e  { n--; }.  sEnd.
10d70 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73  z = &z[n-1];.  s
10d80 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a  End.n = 1;..  /*
10d90 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54   Use sqlite3EndT
10da0 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68  able() to add th
10db0 65 20 76 69 65 77 20 74 6f 20 74 68 65 20 53 51  e view to the SQ
10dc0 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
10dd0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e  e */.  sqlite3En
10de0 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30  dTable(pParse, 0
10df0 2c 20 26 73 45 6e 64 2c 20 30 2c 20 30 29 3b 0a  , &sEnd, 0, 0);.
10e00 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64    return;.}.#end
10e10 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
10e20 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21  T_VIEW */..#if !
10e30 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
10e40 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
10e50 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
10e60 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
10e70 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  /*.** The Table 
10e80 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65  structure pTable
10e90 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45   is really a VIE
10ea0 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  W.  Fill in the 
10eb0 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
10ec0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76  columns of the v
10ed0 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c  iew in the pTabl
10ee0 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  e structure.  Re
10ef0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a  turn the number.
10f00 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  ** of errors.  I
10f10 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65  f an error is se
10f20 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  en leave an erro
10f30 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
10f40 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f  rse->zErrMsg..*/
10f50 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77  .int sqlite3View
10f60 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50  GetColumnNames(P
10f70 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
10f80 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
10f90 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20  Table *pSelTab; 
10fa0 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c    /* A fake tabl
10fb0 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20  e from which we 
10fc0 67 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 73  get the result s
10fd0 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  et */.  Select *
10fe0 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70  pSel;     /* Cop
10ff0 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  y of the SELECT 
11000 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
11010 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  the view */.  in
11020 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20  t nErr = 0;     
11030 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72  /* Number of err
11040 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ors encountered 
11050 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
11060 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
11070 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20  arily holds the 
11080 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  number of cursor
11090 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20  s assigned */.  
110a0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
110b0 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61  arse->db;  /* Da
110c0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
110d0 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72  n for malloc err
110e0 6f 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ors */.  sqlite3
110f0 5f 78 61 75 74 68 20 78 41 75 74 68 3b 20 20 20  _xauth xAuth;   
11100 20 20 20 20 2f 2a 20 53 61 76 65 64 20 78 41 75      /* Saved xAu
11110 74 68 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20  th pointer */.. 
11120 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20   assert( pTable 
11130 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
11140 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
11150 41 42 4c 45 0a 20 20 69 66 28 20 73 71 6c 69 74  ABLE.  if( sqlit
11160 65 33 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63  e3VtabCallConnec
11170 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  t(pParse, pTable
11180 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
11190 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
111a0 7d 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  }.  if( IsVirtua
111b0 6c 28 70 54 61 62 6c 65 29 20 29 20 72 65 74 75  l(pTable) ) retu
111c0 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  rn 0;.#endif..#i
111d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
111e0 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f  T_VIEW.  /* A po
111f0 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e  sitive nCol mean
11200 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61  s the columns na
11210 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65  mes for this vie
11220 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61  w are.  ** alrea
11230 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20  dy known..  */. 
11240 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
11250 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  l>0 ) return 0;.
11260 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65  .  /* A negative
11270 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69   nCol is a speci
11280 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e  al marker meanin
11290 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75  g that we are cu
112a0 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79  rrently.  ** try
112b0 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  ing to compute t
112c0 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  he column names.
112d0 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68    If we enter th
112e0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a  is routine with.
112f0 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20    ** a negative 
11300 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  nCol, it means t
11310 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73  wo or more views
11320 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69   form a loop, li
11330 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  ke this:.  **.  
11340 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
11350 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54  EW one AS SELECT
11360 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a   * FROM two;.  *
11370 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
11380 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20  W two AS SELECT 
11390 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a  * FROM one;.  **
113a0 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  .  ** Actually, 
113b0 74 68 65 20 65 72 72 6f 72 20 61 62 6f 76 65 20  the error above 
113c0 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72  is now caught pr
113d0 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20  ior to reaching 
113e0 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a  this point..  **
113f0 20 42 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69   But the followi
11400 6e 67 20 74 65 73 74 20 69 73 20 73 74 69 6c 6c  ng test is still
11410 20 69 6d 70 6f 72 74 61 6e 74 20 61 73 20 69 74   important as it
11420 20 64 6f 65 73 20 63 6f 6d 65 20 75 70 0a 20 20   does come up.  
11430 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ** in the follow
11440 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ing:.  ** .  ** 
11450 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
11460 20 6d 61 69 6e 2e 65 78 31 28 61 29 3b 0a 20 20   main.ex1(a);.  
11470 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 45  **     CREATE TE
11480 4d 50 20 56 49 45 57 20 65 78 31 20 41 53 20 53  MP VIEW ex1 AS S
11490 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 65 78 31  ELECT a FROM ex1
114a0 3b 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  ;.  **     SELEC
114b0 54 20 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 65 78  T * FROM temp.ex
114c0 31 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  1;.  */.  if( pT
114d0 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a  able->nCol<0 ){.
114e0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
114f0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65  Msg(pParse, "vie
11500 77 20 25 73 20 69 73 20 63 69 72 63 75 6c 61 72  w %s is circular
11510 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61  ly defined", pTa
11520 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  ble->zName);.   
11530 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
11540 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
11550 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f  >nCol>=0 );..  /
11560 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
11570 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77   far, it means w
11580 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74  e need to comput
11590 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  e the table name
115a0 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  s..  ** Note tha
115b0 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  t the call to sq
115c0 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
115d0 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78  Select() will ex
115e0 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a  pand any.  ** "*
115f0 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  " elements in th
11600 65 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66  e results set of
11610 20 74 68 65 20 76 69 65 77 20 61 6e 64 20 77 69   the view and wi
11620 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72  ll assign cursor
11630 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c  s.  ** to the el
11640 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52  ements of the FR
11650 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20  OM clause.  But 
11660 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  we do not want t
11670 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a  hese changes.  *
11680 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e  * to be permanen
11690 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75  t.  So the compu
116a0 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f  tation is done o
116b0 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  n a copy of the 
116c0 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74  SELECT.  ** stat
116d0 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e  ement that defin
116e0 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a  es the view..  *
116f0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  /.  assert( pTab
11700 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20  le->pSelect );. 
11710 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53   pSel = sqlite3S
11720 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61  electDup(db, pTa
11730 62 6c 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29  ble->pSelect, 0)
11740 3b 0a 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a  ;.  if( pSel ){.
11750 20 20 20 20 75 38 20 65 6e 61 62 6c 65 4c 6f 6f      u8 enableLoo
11760 6b 61 73 69 64 65 20 3d 20 64 62 2d 3e 6c 6f 6f  kaside = db->loo
11770 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 3b  kaside.bEnabled;
11780 0a 20 20 20 20 6e 20 3d 20 70 50 61 72 73 65 2d  .    n = pParse-
11790 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c 69 74  >nTab;.    sqlit
117a0 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
117b0 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
117c0 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20  Sel->pSrc);.    
117d0 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d  pTable->nCol = -
117e0 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  1;.    db->looka
117f0 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20  side.bEnabled = 
11800 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
11810 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
11820 54 49 4f 4e 0a 20 20 20 20 78 41 75 74 68 20 3d  TION.    xAuth =
11830 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20   db->xAuth;.    
11840 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20  db->xAuth = 0;. 
11850 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
11860 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
11870 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
11880 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75  el);.    db->xAu
11890 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73  th = xAuth;.#els
118a0 65 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20  e.    pSelTab = 
118b0 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
118c0 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
118d0 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20   pSel);.#endif. 
118e0 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
118f0 2e 62 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62  .bEnabled = enab
11900 6c 65 4c 6f 6f 6b 61 73 69 64 65 3b 0a 20 20 20  leLookaside;.   
11910 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
11920 6e 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 54  n;.    if( pSelT
11930 61 62 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ab ){.      asse
11940 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  rt( pTable->aCol
11950 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61  ==0 );.      pTa
11960 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c  ble->nCol = pSel
11970 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
11980 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
11990 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
119a0 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43       pSelTab->nC
119b0 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53  ol = 0;.      pS
119c0 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
119d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
119e0 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53  leteTable(db, pS
119f0 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 61 73  elTab);.      as
11a00 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
11a10 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
11a20 20 30 2c 20 70 54 61 62 6c 65 2d 3e 70 53 63 68   0, pTable->pSch
11a30 65 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 70 54  ema) );.      pT
11a40 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 73  able->pSchema->s
11a50 63 68 65 6d 61 46 6c 61 67 73 20 7c 3d 20 44 42  chemaFlags |= DB
11a60 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 20  _UnresetViews;. 
11a70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11a80 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
11a90 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  ;.      nErr++;.
11aa0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
11ab0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
11ac0 2c 20 70 53 65 6c 29 3b 0a 20 20 7d 20 65 6c 73  , pSel);.  } els
11ad0 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  e {.    nErr++;.
11ae0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
11af0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
11b00 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  /.  return nErr;
11b10 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21    .}.#endif /* !
11b20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
11b30 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
11b40 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
11b50 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
11b60 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
11b70 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
11b80 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c  ** Clear the col
11b90 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65  umn names from e
11ba0 76 65 72 79 20 56 49 45 57 20 69 6e 20 64 61 74  very VIEW in dat
11bb0 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74  abase idx..*/.st
11bc0 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
11bd0 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c  ViewResetAll(sql
11be0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64  ite3 *db, int id
11bf0 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  x){.  HashElem *
11c00 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  i;.  assert( sql
11c10 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
11c20 65 6c 64 28 64 62 2c 20 69 64 78 2c 20 30 29 20  eld(db, idx, 0) 
11c30 29 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73 50  );.  if( !DbHasP
11c40 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c  roperty(db, idx,
11c50 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
11c60 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  ) ) return;.  fo
11c70 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
11c80 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78  rst(&db->aDb[idx
11c90 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ].pSchema->tblHa
11ca0 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48  sh); i;i=sqliteH
11cb0 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
11cc0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
11cd0 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29  qliteHashData(i)
11ce0 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
11cf0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
11d00 20 73 71 6c 69 74 65 44 65 6c 65 74 65 43 6f 6c   sqliteDeleteCol
11d10 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54 61  umnNames(db, pTa
11d20 62 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  b);.      pTab->
11d30 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  aCol = 0;.      
11d40 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  pTab->nCol = 0;.
11d50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c      }.  }.  DbCl
11d60 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20  earProperty(db, 
11d70 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56  idx, DB_UnresetV
11d80 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  iews);.}.#else.#
11d90 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69   define sqliteVi
11da0 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a  ewResetAll(A,B).
11db0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11dc0 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f  _OMIT_VIEW */../
11dd0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
11de0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
11df0 74 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75  the VDBE to adju
11e00 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  st the internal 
11e10 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62  schema.** used b
11e20 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68  y SQLite when th
11e30 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f  e btree layer mo
11e40 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74  ves a table root
11e50 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f   page. The.** ro
11e60 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62  ot-page of a tab
11e70 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64  le or index in d
11e80 61 74 61 62 61 73 65 20 69 44 62 20 68 61 73 20  atabase iDb has 
11e90 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72  changed from iFr
11ea0 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a  om.** to iTo..**
11eb0 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31 37 32 38  .** Ticket #1728
11ec0 3a 20 20 54 68 65 20 73 79 6d 62 6f 6c 20 74 61  :  The symbol ta
11ed0 62 6c 65 20 6d 69 67 68 74 20 73 74 69 6c 6c 20  ble might still 
11ee0 63 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74  contain informat
11ef0 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73  ion.** on tables
11f00 20 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73 20   and/or indices 
11f10 74 68 61 74 20 61 72 65 20 74 68 65 20 70 72 6f  that are the pro
11f20 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 64 65  cess of being de
11f30 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75  leted..** If you
11f40 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e   are unlucky, on
11f50 65 20 6f 66 20 74 68 6f 73 65 20 64 65 6c 65 74  e of those delet
11f60 65 64 20 69 6e 64 69 63 65 73 20 6f 72 20 74 61  ed indices or ta
11f70 62 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61  bles might.** ha
11f80 76 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74  ve the same root
11f90 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 74  page number as t
11fa0 68 65 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72  he real table or
11fb0 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a 2a   index that is.*
11fc0 2a 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20  * being moved.  
11fd0 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f  So we cannot sto
11fe0 70 20 73 65 61 72 63 68 69 6e 67 20 61 66 74 65  p searching afte
11ff0 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  r the first matc
12000 68 20 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68  h .** because th
12010 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 6d 69  e first match mi
12020 67 68 74 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f  ght be for one o
12030 66 20 74 68 65 20 64 65 6c 65 74 65 64 20 69 6e  f the deleted in
12040 64 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c  dices.** or tabl
12050 65 73 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74  es and not the t
12060 61 62 6c 65 2f 69 6e 64 65 78 20 74 68 61 74 20  able/index that 
12070 69 73 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  is actually bein
12080 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d  g moved..** We m
12090 75 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f  ust continue loo
120a0 70 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74  ping until all t
120b0 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65  ables and indice
120c0 73 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61  s with.** rootpa
120d0 67 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20 62  ge==iFrom have b
120e0 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 74 6f  een converted to
120f0 20 68 61 76 65 20 61 20 72 6f 6f 74 70 61 67 65   have a rootpage
12100 20 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72   of iTo.** in or
12110 64 65 72 20 74 6f 20 62 65 20 63 65 72 74 61 69  der to be certai
12120 6e 20 74 68 61 74 20 77 65 20 67 6f 74 20 74 68  n that we got th
12130 65 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a  e right one..*/.
12140 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12150 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76  MIT_AUTOVACUUM.v
12160 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50  oid sqlite3RootP
12170 61 67 65 4d 6f 76 65 64 28 73 71 6c 69 74 65 33  ageMoved(sqlite3
12180 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69   *db, int iDb, i
12190 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
121a0 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  o){.  HashElem *
121b0 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70  pElem;.  Hash *p
121c0 48 61 73 68 3b 0a 20 20 44 62 20 2a 70 44 62 3b  Hash;.  Db *pDb;
121d0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
121e0 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
121f0 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
12200 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
12210 44 62 5b 69 44 62 5d 3b 0a 20 20 70 48 61 73 68  Db[iDb];.  pHash
12220 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61   = &pDb->pSchema
12230 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72  ->tblHash;.  for
12240 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
12250 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70  hFirst(pHash); p
12260 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
12270 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
12280 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  )){.    Table *p
12290 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
122a0 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
122b0 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d   if( pTab->tnum=
122c0 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
122d0 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f  pTab->tnum = iTo
122e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48  ;.    }.  }.  pH
122f0 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68  ash = &pDb->pSch
12300 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20  ema->idxHash;.  
12310 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65  for(pElem=sqlite
12320 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29  HashFirst(pHash)
12330 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
12340 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
12350 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78  lem)){.    Index
12360 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48   *pIdx = sqliteH
12370 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
12380 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e      if( pIdx->tn
12390 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  um==iFrom ){.   
123a0 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20     pIdx->tnum = 
123b0 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  iTo;.    }.  }.}
123c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
123d0 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61  rite code to era
123e0 73 65 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  se the table wit
123f0 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
12400 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  le from database
12410 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72   iDb..** Also wr
12420 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69  ite code to modi
12430 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  fy the sqlite_ma
12440 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69  ster table and i
12450 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a  nternal schema.*
12460 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65  * if a root-page
12470 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   of another tabl
12480 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68  e is moved by th
12490 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68  e btree-layer wh
124a0 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20  ilst.** erasing 
124b0 69 54 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e  iTable (this can
124c0 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20   happen with an 
124d0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
124e0 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69  base)..*/ .stati
124f0 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f  c void destroyRo
12500 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a 70 50  otPage(Parse *pP
12510 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65  arse, int iTable
12520 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
12530 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
12540 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
12550 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
12560 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
12570 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rse);.  sqlite3V
12580 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
12590 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c  Destroy, iTable,
125a0 20 72 31 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c   r1, iDb);.  sql
125b0 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
125c0 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  rse);.#ifndef SQ
125d0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
125e0 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73  CUUM.  /* OP_Des
125f0 74 72 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69  troy stores an i
12600 6e 20 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66  n integer r1. If
12610 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20   this integer.  
12620 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ** is non-zero, 
12630 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72  then it is the r
12640 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
12650 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64  of a table moved
12660 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f   to.  ** locatio
12670 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f  n iTable. The fo
12680 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64  llowing code mod
12690 69 66 69 65 73 20 74 68 65 20 73 71 6c 69 74 65  ifies the sqlite
126a0 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f  _master table to
126b0 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68  .  ** reflect th
126c0 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  is..  **.  ** Th
126d0 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20  e "#NNN" in the 
126e0 53 51 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c  SQL is a special
126f0 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d   constant that m
12700 65 61 6e 73 20 77 68 61 74 65 76 65 72 20 76 61  eans whatever va
12710 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72  lue.  ** is in r
12720 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65  egister NNN.  Se
12730 65 20 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 20  e grammar rules 
12740 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
12750 74 68 65 20 54 4b 5f 52 45 47 49 53 54 45 52 0a  the TK_REGISTER.
12760 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61    ** token for a
12770 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
12780 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71  ation..  */.  sq
12790 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
127a0 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22  (pParse, .     "
127b0 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54  UPDATE %Q.%s SET
127c0 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45   rootpage=%d WHE
127d0 52 45 20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70  RE #%d AND rootp
127e0 61 67 65 3d 23 25 64 22 2c 0a 20 20 20 20 20 70  age=#%d",.     p
127f0 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
12800 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
12810 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69 54  A_TABLE(iDb), iT
12820 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23  able, r1, r1);.#
12830 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 52  endif.  sqlite3R
12840 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
12850 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a  arse, r1);.}../*
12860 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20 63  .** Write VDBE c
12870 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61 62  ode to erase tab
12880 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20  le pTab and all 
12890 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63  associated indic
128a0 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43  es on disk..** C
128b0 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74 68  ode to update th
128c0 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
128d0 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72  tables and inter
128e0 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e  nal schema defin
128f0 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73  itions.** in cas
12900 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65  e a root-page be
12910 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68  longing to anoth
12920 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
12930 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 6c  d by the btree l
12940 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20  ayer.** is also 
12950 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e 20  added (this can 
12960 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61  happen with an a
12970 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
12980 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ase)..*/.static 
12990 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c  void destroyTabl
129a0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
129b0 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23   Table *pTab){.#
129c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
129d0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 49  T_AUTOVACUUM.  I
129e0 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e  ndex *pIdx;.  in
129f0 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
12a00 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
12a10 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
12a20 53 63 68 65 6d 61 29 3b 0a 20 20 64 65 73 74 72  Schema);.  destr
12a30 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
12a40 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69  e, pTab->tnum, i
12a50 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  Db);.  for(pIdx=
12a60 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
12a70 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
12a80 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74 72  Next){.    destr
12a90 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
12aa0 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  e, pIdx->tnum, i
12ab0 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  Db);.  }.#else. 
12ac0 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
12ad0 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d  ase may be auto-
12ae0 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28  vacuum capable (
12af0 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  if SQLITE_OMIT_A
12b00 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69  UTOVACUUM.  ** i
12b10 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20  s not defined), 
12b20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72  then it is impor
12b30 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f  tant to call OP_
12b40 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20  Destroy on the. 
12b50 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e   ** table and in
12b60 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69  dex root-pages i
12b70 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e  n order, startin
12b80 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72  g with the numer
12b90 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72  ically .  ** lar
12ba0 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
12bb0 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61 72  umber. This guar
12bc0 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65  antees that none
12bd0 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   of the root-pag
12be0 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65  es.  ** to be de
12bf0 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63  stroyed is reloc
12c00 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ated by an earli
12c10 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69  er OP_Destroy. i
12c20 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  .e. if the.  ** 
12c30 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63  following were c
12c40 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  oded:.  **.  ** 
12c50 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20  OP_Destroy 4 0. 
12c60 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f   ** ....  ** OP_
12c70 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a  Destroy 5 0.  **
12c80 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70  .  ** and root p
12c90 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20 74  age 5 happened t
12ca0 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73 74  o be the largest
12cb0 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
12cc0 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  r in the.  ** da
12cd0 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f  tabase, then roo
12ce0 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62  t page 5 would b
12cf0 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20  e moved to page 
12d00 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22  4 by the .  ** "
12d10 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20  OP_Destroy 4 0" 
12d20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73  opcode. The subs
12d30 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72  equent "OP_Destr
12d40 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69  oy 5 0" would hi
12d50 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69  t.  ** a free-li
12d60 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  st page..  */.  
12d70 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d  int iTab = pTab-
12d80 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65  >tnum;.  int iDe
12d90 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20  stroyed = 0;..  
12da0 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
12db0 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
12dc0 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20   int iLargest = 
12dd0 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73  0;..    if( iDes
12de0 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61  troyed==0 || iTa
12df0 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a  b<iDestroyed ){.
12e00 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d        iLargest =
12e10 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20   iTab;.    }.   
12e20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
12e30 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
12e40 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
12e50 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20  .      int iIdx 
12e60 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20  = pIdx->tnum;.  
12e70 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
12e80 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
12e90 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
12ea0 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79 65    if( (iDestroye
12eb0 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44  d==0 || (iIdx<iD
12ec0 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69 49  estroyed)) && iI
12ed0 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20  dx>iLargest ){. 
12ee0 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20         iLargest 
12ef0 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a  = iIdx;.      }.
12f00 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c      }.    if( iL
12f10 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20  argest==0 ){.   
12f20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
12f30 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
12f40 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
12f50 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
12f60 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
12f70 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 61 73 73  hema);.      ass
12f80 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
12f90 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e  Db<pParse->db->n
12fa0 44 62 20 29 3b 0a 20 20 20 20 20 20 64 65 73 74  Db );.      dest
12fb0 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
12fc0 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69 44  se, iLargest, iD
12fd0 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74 72  b);.      iDestr
12fe0 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b  oyed = iLargest;
12ff0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
13000 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  f.}../*.** Remov
13010 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74  e entries from t
13020 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20  he sqlite_statN 
13030 74 61 62 6c 65 73 20 28 66 6f 72 20 4e 20 69 6e  tables (for N in
13040 20 28 31 2c 32 2c 33 29 29 0a 2a 2a 20 61 66 74   (1,2,3)).** aft
13050 65 72 20 61 20 44 52 4f 50 20 49 4e 44 45 58 20  er a DROP INDEX 
13060 6f 72 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f  or DROP TABLE co
13070 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  mmand..*/.static
13080 20 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65   void sqlite3Cle
13090 61 72 53 74 61 74 54 61 62 6c 65 73 28 0a 20 20  arStatTables(.  
130a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
130b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
130c0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
130d0 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20  .  int iDb,     
130e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
130f0 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   database number
13100 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
13110 20 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a 20   *zType,     /* 
13120 22 69 64 78 22 20 6f 72 20 22 74 62 6c 22 20 2a  "idx" or "tbl" *
13130 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
13140 7a 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20 4e 61  zName      /* Na
13150 6d 65 20 6f 66 20 69 6e 64 65 78 20 6f 72 20 74  me of index or t
13160 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  able */.){.  int
13170 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   i;.  const char
13180 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 70 50 61 72   *zDbName = pPar
13190 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
131a0 2e 7a 4e 61 6d 65 3b 0a 20 20 66 6f 72 28 69 3d  .zName;.  for(i=
131b0 31 3b 20 69 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20  1; i<=4; i++){. 
131c0 20 20 20 63 68 61 72 20 7a 54 61 62 5b 32 34 5d     char zTab[24]
131d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
131e0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54  printf(sizeof(zT
131f0 61 62 29 2c 7a 54 61 62 2c 22 73 71 6c 69 74 65  ab),zTab,"sqlite
13200 5f 73 74 61 74 25 64 22 2c 69 29 3b 0a 20 20 20  _stat%d",i);.   
13210 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
13220 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
13230 2c 20 7a 54 61 62 2c 20 7a 44 62 4e 61 6d 65 29  , zTab, zDbName)
13240 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13250 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
13260 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45  rse,.        "DE
13270 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
13280 57 48 45 52 45 20 25 73 3d 25 51 22 2c 0a 20 20  WHERE %s=%Q",.  
13290 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a        zDbName, z
132a0 54 61 62 2c 20 7a 54 79 70 65 2c 20 7a 4e 61 6d  Tab, zType, zNam
132b0 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  e.      );.    }
132c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
132d0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64  nerate code to d
132e0 72 6f 70 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a  rop a table..*/.
132f0 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
13300 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20  DropTable(Parse 
13310 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
13320 70 54 61 62 2c 20 69 6e 74 20 69 44 62 2c 20 69  pTab, int iDb, i
13330 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20 56 64  nt isView){.  Vd
13340 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33  be *v;.  sqlite3
13350 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
13360 62 3b 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54  b;.  Trigger *pT
13370 72 69 67 67 65 72 3b 0a 20 20 44 62 20 2a 70 44  rigger;.  Db *pD
13380 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
13390 5d 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  ];..  v = sqlite
133a0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
133b0 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
133c0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67   );.  sqlite3Beg
133d0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
133e0 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
133f0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
13400 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
13410 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74  BLE.  if( IsVirt
13420 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
13430 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13440 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29  p0(v, OP_VBegin)
13450 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
13460 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67  /* Drop all trig
13470 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  gers associated 
13480 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62  with the table b
13490 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f  eing dropped. Co
134a0 64 65 0a 20 20 2a 2a 20 69 73 20 67 65 6e 65 72  de.  ** is gener
134b0 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65  ated to remove e
134c0 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69  ntries from sqli
134d0 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72  te_master and/or
134e0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d  .  ** sqlite_tem
134f0 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71 75  p_master if requ
13500 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 72  ired..  */.  pTr
13510 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54  igger = sqlite3T
13520 72 69 67 67 65 72 4c 69 73 74 28 70 50 61 72 73  riggerList(pPars
13530 65 2c 20 70 54 61 62 29 3b 0a 20 20 77 68 69 6c  e, pTab);.  whil
13540 65 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20  e( pTrigger ){. 
13550 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
13560 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  ger->pSchema==pT
13570 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a  ab->pSchema || .
13580 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72          pTrigger
13590 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61  ->pSchema==db->a
135a0 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b  Db[1].pSchema );
135b0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70  .    sqlite3Drop
135c0 54 72 69 67 67 65 72 50 74 72 28 70 50 61 72 73  TriggerPtr(pPars
135d0 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20  e, pTrigger);.  
135e0 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72    pTrigger = pTr
135f0 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  igger->pNext;.  
13600 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
13610 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
13620 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65  MENT.  /* Remove
13630 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20   any entries of 
13640 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65  the sqlite_seque
13650 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69  nce table associ
13660 61 74 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74  ated with.  ** t
13670 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
13680 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69 73 20  ropped. This is 
13690 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20  done before the 
136a0 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65 64  table is dropped
136b0 0a 20 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72  .  ** at the btr
136c0 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73  ee level, in cas
136d0 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71  e the sqlite_seq
136e0 75 65 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64  uence table need
136f0 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20 61  s to.  ** move a
13700 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
13710 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70  e drop (can happ
13720 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  en in auto-vacuu
13730 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20 20  m mode)..  */.  
13740 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61  if( pTab->tabFla
13750 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72  gs & TF_Autoincr
13760 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c  ement ){.    sql
13770 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
13780 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 44  pParse,.      "D
13790 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 73 71  ELETE FROM %Q.sq
137a0 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48  lite_sequence WH
137b0 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20  ERE name=%Q",.  
137c0 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20      pDb->zName, 
137d0 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  pTab->zName.    
137e0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
137f0 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c   /* Drop all SQL
13800 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
13810 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69   and index entri
13820 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  es that refer to
13830 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 2e   the.  ** table.
13840 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d   The program nam
13850 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  e loops through 
13860 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
13870 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 2a   and deletes.  *
13880 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74  * every row that
13890 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
138a0 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  le of the same n
138b0 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62  ame as the one b
138c0 65 69 6e 67 0a 20 20 2a 2a 20 64 72 6f 70 70 65  eing.  ** droppe
138d0 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20  d. Triggers are 
138e0 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65  handled separate
138f0 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69  ly because a tri
13900 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 2a 2a  gger can be.  **
13910 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
13920 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 74 68  temp database th
13930 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  at refers to a t
13940 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a  able in another.
13950 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20    ** database.. 
13960 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73   */.  sqlite3Nes
13970 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
13980 20 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20   .      "DELETE 
13990 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45  FROM %Q.%s WHERE
139a0 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64   tbl_name=%Q and
139b0 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27   type!='trigger'
139c0 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  ",.      pDb->zN
139d0 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
139e0 45 28 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e  E(iDb), pTab->zN
139f0 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 69 73 56  ame);.  if( !isV
13a00 69 65 77 20 26 26 20 21 49 73 56 69 72 74 75 61  iew && !IsVirtua
13a10 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 64  l(pTab) ){.    d
13a20 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72  estroyTable(pPar
13a30 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a 0a  se, pTab);.  }..
13a40 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
13a50 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d  table entry from
13a60 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e   SQLite's intern
13a70 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f  al schema and mo
13a80 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20 73 63  dify.  ** the sc
13a90 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a  hema cookie..  *
13aa0 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
13ab0 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73  l(pTab) ){.    s
13ac0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
13ad0 28 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c  (v, OP_VDestroy,
13ae0 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62   iDb, 0, 0, pTab
13af0 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d  ->zName, 0);.  }
13b00 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
13b10 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54  dOp4(v, OP_DropT
13b20 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c  able, iDb, 0, 0,
13b30 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
13b40 3b 0a 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67  ;.  sqlite3Chang
13b50 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
13b60 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 56 69  iDb);.  sqliteVi
13b70 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69  ewResetAll(db, i
13b80 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Db);.}../*.** Th
13b90 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
13ba0 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77  lled to do the w
13bb0 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41  ork of a DROP TA
13bc0 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
13bd0 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e  * pName is the n
13be0 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
13bf0 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a   to be dropped..
13c00 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
13c10 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  ropTable(Parse *
13c20 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
13c30 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69  *pName, int isVi
13c40 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a  ew, int noErr){.
13c50 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
13c60 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
13c70 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
13c80 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b  ->db;.  int iDb;
13c90 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
13ca0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
13cb0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
13cc0 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  able;.  }.  asse
13cd0 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
13ce0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
13cf0 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20   pName->nSrc==1 
13d00 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
13d10 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
13d20 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 64  e) ) goto exit_d
13d30 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 69 66 28  rop_table;.  if(
13d40 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70   noErr ) db->sup
13d50 70 72 65 73 73 45 72 72 2b 2b 3b 0a 20 20 70 54  pressErr++;.  pT
13d60 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
13d70 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72  teTableItem(pPar
13d80 73 65 2c 20 69 73 56 69 65 77 2c 20 26 70 4e 61  se, isView, &pNa
13d90 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 69 66 28  me->a[0]);.  if(
13da0 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70   noErr ) db->sup
13db0 70 72 65 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69  pressErr--;..  i
13dc0 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
13dd0 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 73 71    if( noErr ) sq
13de0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e  lite3CodeVerifyN
13df0 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72 73  amedSchema(pPars
13e00 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
13e10 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 67  Database);.    g
13e20 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
13e30 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d  ble;.  }.  iDb =
13e40 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
13e50 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
13e60 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65  pSchema);.  asse
13e70 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
13e80 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20  b<db->nDb );..  
13e90 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20 61 20  /* If pTab is a 
13ea0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 63  virtual table, c
13eb0 61 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c 75 6d  all ViewGetColum
13ec0 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e 73 75  nNames() to ensu
13ed0 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 69 6e  re.  ** it is in
13ee0 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
13ef0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
13f00 70 54 61 62 29 20 26 26 20 73 71 6c 69 74 65 33  pTab) && sqlite3
13f10 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
13f20 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
13f30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
13f40 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
13f50 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
13f60 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
13f70 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ION.  {.    int 
13f80 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  code;.    const 
13f90 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48  char *zTab = SCH
13fa0 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a  EMA_TABLE(iDb);.
13fb0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
13fc0 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
13fd0 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  b].zName;.    co
13fe0 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20  nst char *zArg2 
13ff0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  = 0;.    if( sql
14000 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
14010 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
14020 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
14030 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  b)){.      goto 
14040 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
14050 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
14060 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
14070 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
14080 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
14090 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
140a0 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45  TE_DROP_TEMP_VIE
140b0 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  W;.      }else{.
140c0 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
140d0 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b  QLITE_DROP_VIEW;
140e0 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
140f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
14100 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65  TUALTABLE.    }e
14110 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61  lse if( IsVirtua
14120 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
14130 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
14140 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20  ROP_VTABLE;.    
14150 20 20 7a 41 72 67 32 20 3d 20 73 71 6c 69 74 65    zArg2 = sqlite
14160 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
14170 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d  Tab)->pMod->zNam
14180 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  e;.#endif.    }e
14190 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
141a0 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
141b0 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
141c0 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
141d0 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a  ROP_TEMP_TABLE;.
141e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
141f0 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
14200 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20  TE_DROP_TABLE;. 
14210 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
14220 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
14230 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
14240 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  de, pTab->zName,
14250 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a   zArg2, zDb) ){.
14260 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
14270 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
14280 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
14290 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
142a0 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
142b0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
142c0 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
142d0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
142e0 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  able;.    }.  }.
142f0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c  #endif.  if( sql
14300 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61  ite3StrNICmp(pTa
14310 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  b->zName, "sqlit
14320 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20  e_", 7)==0 .    
14330 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
14340 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  mp(pTab->zName, 
14350 22 73 71 6c 69 74 65 5f 73 74 61 74 22 2c 20 31  "sqlite_stat", 1
14360 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  1)!=0 ){.    sql
14370 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14380 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
14390 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  ay not be droppe
143a0 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
143b0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
143c0 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
143d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
143e0 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45  OMIT_VIEW.  /* E
143f0 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45  nsure DROP TABLE
14400 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20   is not used on 
14410 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50  a view, and DROP
14420 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65   VIEW is not use
14430 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c  d.  ** on a tabl
14440 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  e..  */.  if( is
14450 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53  View && pTab->pS
14460 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
14470 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
14480 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
14490 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74  P TABLE to delet
144a0 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61  e table %s", pTa
144b0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
144c0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
144d0 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  ble;.  }.  if( !
144e0 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e  isView && pTab->
144f0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
14500 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
14510 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50  Parse, "use DROP
14520 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20   VIEW to delete 
14530 76 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e  view %s", pTab->
14540 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
14550 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
14560 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
14570 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
14580 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74   to remove the t
14590 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61  able from the ma
145a0 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20  ster table.  ** 
145b0 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
145c0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
145d0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
145e0 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
145f0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
14600 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
14610 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
14620 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65  e3ClearStatTable
14630 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  s(pParse, iDb, "
14640 74 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  tbl", pTab->zNam
14650 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  e);.    sqlite3F
14660 6b 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73  kDropTable(pPars
14670 65 2c 20 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b  e, pName, pTab);
14680 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
14690 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65  DropTable(pParse
146a0 2c 20 70 54 61 62 2c 20 69 44 62 2c 20 69 73 56  , pTab, iDb, isV
146b0 69 65 77 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f  iew);.  }..exit_
146c0 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71  drop_table:.  sq
146d0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
146e0 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d  te(db, pName);.}
146f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
14700 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
14710 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66  o create a new f
14720 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68  oreign key on th
14730 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65  e table.** curre
14740 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
14750 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43  ruction.  pFromC
14760 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  ol determines wh
14770 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69  ich columns.** i
14780 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  n the current ta
14790 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ble point to the
147a0 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49   foreign key.  I
147b0 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68  f pFromCol==0 th
147c0 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68  en.** connect th
147d0 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73  e key to the las
147e0 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65  t column inserte
147f0 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e  d.  pTo is the n
14800 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61  ame of.** the ta
14810 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 20  ble referred to 
14820 28 61 2e 6b 2e 61 20 74 68 65 20 22 70 61 72 65  (a.k.a the "pare
14830 6e 74 22 20 74 61 62 6c 65 29 2e 20 20 70 54 6f  nt" table).  pTo
14840 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a  Col is a list.**
14850 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
14860 65 20 70 61 72 65 6e 74 20 70 54 6f 20 74 61 62  e parent pTo tab
14870 6c 65 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61  le.  flags conta
14880 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72  ins all.** infor
14890 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
148a0 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   conflict resolu
148b0 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20  tion algorithms 
148c0 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20  specified.** in 
148d0 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f  the ON DELETE, O
148e0 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20  N UPDATE and ON 
148f0 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a  INSERT clauses..
14900 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74  **.** An FKey st
14910 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74  ructure is creat
14920 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20  ed and added to 
14930 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
14940 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e  tly.** under con
14950 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65  struction in the
14960 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
14970 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20  le field..**.** 
14980 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  The foreign key 
14990 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44  is set for IMMED
149a0 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e  IATE processing.
149b0 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63    A subsequent c
149c0 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  all.** to sqlite
149d0 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
149e0 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  () might change 
149f0 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45 44  this to DEFERRED
14a00 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14a10 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65  3CreateForeignKe
14a20 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
14a30 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
14a40 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
14a50 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f    ExprList *pFro
14a60 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e  mCol,  /* Column
14a70 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20  s in this table 
14a80 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74  that point to ot
14a90 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54  her table */.  T
14aa0 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20  oken *pTo,      
14ab0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
14ac0 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
14ad0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54  /.  ExprList *pT
14ae0 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75  oCol,    /* Colu
14af0 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  mns in the other
14b00 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
14b10 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
14b20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73   /* Conflict res
14b30 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
14b40 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ms. */.){.  sqli
14b50 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
14b60 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51  ->db;.#ifndef SQ
14b70 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
14b80 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46  N_KEY.  FKey *pF
14b90 4b 65 79 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20  Key = 0;.  FKey 
14ba0 2a 70 4e 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c  *pNextTo;.  Tabl
14bb0 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *p = pParse->p
14bc0 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20  NewTable;.  int 
14bd0 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  nByte;.  int i;.
14be0 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68    int nCol;.  ch
14bf0 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74  ar *z;..  assert
14c00 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66  ( pTo!=0 );.  if
14c10 28 20 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43  ( p==0 || IN_DEC
14c20 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f  LARE_VTAB ) goto
14c30 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70   fk_end;.  if( p
14c40 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  FromCol==0 ){.  
14c50 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
14c60 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20  nCol-1;.    if( 
14c70 4e 45 56 45 52 28 69 43 6f 6c 3c 30 29 20 29 20  NEVER(iCol<0) ) 
14c80 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
14c90 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70   if( pToCol && p
14ca0 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20  ToCol->nExpr!=1 
14cb0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14cc0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
14cd0 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e   "foreign key on
14ce0 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22 20   %s".         " 
14cf0 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65  should reference
14d00 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e   only one column
14d10 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20   of table %T",. 
14d20 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b          p->aCol[
14d30 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f  iCol].zName, pTo
14d40 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b  );.      goto fk
14d50 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
14d60 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  nCol = 1;.  }els
14d70 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20  e if( pToCol && 
14d80 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70  pToCol->nExpr!=p
14d90 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29  FromCol->nExpr )
14da0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
14db0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
14dc0 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66        "number of
14dd0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65   columns in fore
14de0 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74  ign key does not
14df0 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65   match the numbe
14e00 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22  r of ".        "
14e10 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
14e20 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22  eferenced table"
14e30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  );.    goto fk_e
14e40 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  nd;.  }else{.   
14e50 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c   nCol = pFromCol
14e60 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e  ->nExpr;.  }.  n
14e70 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
14e80 46 4b 65 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29  FKey) + (nCol-1)
14e90 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61  *sizeof(pFKey->a
14ea0 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e  Col[0]) + pTo->n
14eb0 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43   + 1;.  if( pToC
14ec0 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
14ed0 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78  0; i<pToCol->nEx
14ee0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
14ef0 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33  nByte += sqlite3
14f00 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d  Strlen30(pToCol-
14f10 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31  >a[i].zName) + 1
14f20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46  ;.    }.  }.  pF
14f30 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Key = sqlite3DbM
14f40 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
14f50 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b  yte );.  if( pFK
14f60 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74  ey==0 ){.    got
14f70 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  o fk_end;.  }.  
14f80 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70  pFKey->pFrom = p
14f90 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  ;.  pFKey->pNext
14fa0 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b  From = p->pFKey;
14fb0 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70  .  z = (char*)&p
14fc0 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d  FKey->aCol[nCol]
14fd0 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d  ;.  pFKey->zTo =
14fe0 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20   z;.  memcpy(z, 
14ff0 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b  pTo->z, pTo->n);
15000 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30  .  z[pTo->n] = 0
15010 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f  ;.  sqlite3Dequo
15020 74 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54  te(z);.  z += pT
15030 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d  o->n+1;.  pFKey-
15040 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  >nCol = nCol;.  
15050 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20  if( pFromCol==0 
15060 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43  ){.    pFKey->aC
15070 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d  ol[0].iFrom = p-
15080 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65  >nCol-1;.  }else
15090 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
150a0 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
150b0 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
150c0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43  for(j=0; j<p->nC
150d0 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
150e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
150f0 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ICmp(p->aCol[j].
15100 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d  zName, pFromCol-
15110 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  >a[i].zName)==0 
15120 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b  ){.          pFK
15130 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f  ey->aCol[i].iFro
15140 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  m = j;.         
15150 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
15160 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
15170 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29  if( j>=p->nCol )
15180 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
15190 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
151a0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e  , .          "un
151b0 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25  known column \"%
151c0 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b  s\" in foreign k
151d0 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20  ey definition", 
151e0 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d  .          pFrom
151f0 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
15200 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
15210 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  k_end;.      }. 
15220 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
15230 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72  ToCol ){.    for
15240 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
15250 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  +){.      int n 
15260 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
15270 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  0(pToCol->a[i].z
15280 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b  Name);.      pFK
15290 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c  ey->aCol[i].zCol
152a0 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63   = z;.      memc
152b0 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b  py(z, pToCol->a[
152c0 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20  i].zName, n);.  
152d0 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20      z[n] = 0;.  
152e0 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20      z += n+1;.  
152f0 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d    }.  }.  pFKey-
15300 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b  >isDeferred = 0;
15310 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f  .  pFKey->aActio
15320 6e 5b 30 5d 20 3d 20 28 75 38 29 28 66 6c 61 67  n[0] = (u8)(flag
15330 73 20 26 20 30 78 66 66 29 3b 20 20 20 20 20 20  s & 0xff);      
15340 20 20 20 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45        /* ON DELE
15350 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70  TE action */.  p
15360 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d  FKey->aAction[1]
15370 20 3d 20 28 75 38 29 28 28 66 6c 61 67 73 20 3e   = (u8)((flags >
15380 3e 20 38 20 29 20 26 20 30 78 66 66 29 3b 20 20  > 8 ) & 0xff);  
15390 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20 61    /* ON UPDATE a
153a0 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65  ction */..  asse
153b0 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
153c0 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30  aMutexHeld(db, 0
153d0 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b  , p->pSchema) );
153e0 0a 20 20 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b  .  pNextTo = (FK
153f0 65 79 20 2a 29 73 71 6c 69 74 65 33 48 61 73 68  ey *)sqlite3Hash
15400 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63 68 65  Insert(&p->pSche
15410 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20  ma->fkeyHash, . 
15420 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c       pFKey->zTo,
15430 20 28 76 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20   (void *)pFKey. 
15440 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 78 74 54   );.  if( pNextT
15450 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a 20 20 20 20  o==pFKey ){.    
15460 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
15470 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 66   = 1;.    goto f
15480 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  k_end;.  }.  if(
15490 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20 20 20   pNextTo ){.    
154a0 61 73 73 65 72 74 28 20 70 4e 65 78 74 54 6f 2d  assert( pNextTo-
154b0 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20  >pPrevTo==0 );. 
154c0 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54     pFKey->pNextT
154d0 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20  o = pNextTo;.   
154e0 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54   pNextTo->pPrevT
154f0 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a  o = pFKey;.  }..
15500 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f    /* Link the fo
15510 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65  reign key to the
15520 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61   table as the la
15530 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20  st step..  */.  
15540 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79  p->pFKey = pFKey
15550 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a  ;.  pFKey = 0;..
15560 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65  fk_end:.  sqlite
15570 33 44 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65  3DbFree(db, pFKe
15580 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  y);.#endif /* !d
15590 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
155a0 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20  IT_FOREIGN_KEY) 
155b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
155c0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
155d0 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  FromCol);.  sqli
155e0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
155f0 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d  e(db, pToCol);.}
15600 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
15610 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
15620 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59  hen an INITIALLY
15630 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e   IMMEDIATE or IN
15640 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
15650 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65  .** clause is se
15660 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  en as part of a 
15670 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
15680 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44  nition.  The isD
15690 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d  eferred.** param
156a0 65 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e  eter is 1 for IN
156b0 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
156c0 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49   and 0 for INITI
156d0 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a  ALLY IMMEDIATE..
156e0 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20  ** The behavior 
156f0 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
15700 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72  ntly created for
15710 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75  eign key is adju
15720 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e  sted.** accordin
15730 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  gly..*/.void sql
15740 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
15750 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  Key(Parse *pPars
15760 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65  e, int isDeferre
15770 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  d){.#ifndef SQLI
15780 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
15790 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  KEY.  Table *pTa
157a0 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  b;.  FKey *pFKey
157b0 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20  ;.  if( (pTab = 
157c0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
157d0 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20  e)==0 || (pFKey 
157e0 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d  = pTab->pFKey)==
157f0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
15800 73 65 72 74 28 20 69 73 44 65 66 65 72 72 65 64  sert( isDeferred
15810 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65 72 72 65  ==0 || isDeferre
15820 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52  d==1 ); /* EV: R
15830 2d 33 30 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a  -30323-21917 */.
15840 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72    pFKey->isDefer
15850 72 65 64 20 3d 20 28 75 38 29 69 73 44 65 66 65  red = (u8)isDefe
15860 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rred;.#endif.}..
15870 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
15880 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72  ode that will er
15890 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69  ase and refill i
158a0 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69  ndex *pIdx.  Thi
158b0 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  s is.** used to 
158c0 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77  initialize a new
158d0 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 65 78  ly created index
158e0 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65   or to recompute
158f0 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
15900 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72  of an index in r
15910 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49  esponse to a REI
15920 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  NDEX command..**
15930 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61  .** if memRootPa
15940 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69  ge is not negati
15950 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ve, it means tha
15960 74 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e  t the index is n
15970 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e  ewly.** created.
15980 20 20 54 68 65 20 72 65 67 69 73 74 65 72 20 73    The register s
15990 70 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52  pecified by memR
159a0 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  ootPage contains
159b0 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
159c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
159d0 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f  index.  If memRo
159e0 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  otPage is negati
159f0 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ve, then.** the 
15a00 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
15a10 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65  ists and must be
15a20 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20   cleared before 
15a30 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61  being refilled a
15a40 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70  nd.** the root p
15a50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
15a60 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e  e index is taken
15a70 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e   from pIndex->tn
15a80 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  um..*/.static vo
15a90 69 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c  id sqlite3Refill
15aa0 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
15ab0 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64  rse, Index *pInd
15ac0 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50  ex, int memRootP
15ad0 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  age){.  Table *p
15ae0 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54  Tab = pIndex->pT
15af0 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61  able;  /* The ta
15b00 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64 65  ble that is inde
15b10 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  xed */.  int iTa
15b20 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
15b30 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65  ++;     /* Btree
15b40 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   cursor used for
15b50 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69   pTab */.  int i
15b60 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
15b70 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72  ab++;     /* Btr
15b80 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
15b90 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69  or pIndex */.  i
15ba0 6e 74 20 69 53 6f 72 74 65 72 3b 20 20 20 20 20  nt iSorter;     
15bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15bc0 20 43 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 62   Cursor opened b
15bd0 79 20 4f 70 65 6e 53 6f 72 74 65 72 20 28 69 66  y OpenSorter (if
15be0 20 69 6e 20 75 73 65 29 20 2a 2f 0a 20 20 69 6e   in use) */.  in
15bf0 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20  t addr1;        
15c00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15c10 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f  Address of top o
15c20 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  f loop */.  int 
15c30 61 64 64 72 32 3b 20 20 20 20 20 20 20 20 20 20  addr2;          
15c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
15c50 64 72 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f  dress to jump to
15c60 20 66 6f 72 20 6e 65 78 74 20 69 74 65 72 61 74   for next iterat
15c70 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75  ion */.  int tnu
15c80 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
15c90 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
15ca0 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  page of index */
15cb0 0a 20 20 69 6e 74 20 69 50 61 72 74 49 64 78 4c  .  int iPartIdxL
15cc0 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  abel;           
15cd0 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69    /* Jump to thi
15ce0 73 20 6c 61 62 65 6c 20 74 6f 20 73 6b 69 70 20  s label to skip 
15cf0 61 20 72 6f 77 20 2a 2f 0a 20 20 56 64 62 65 20  a row */.  Vdbe 
15d00 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
15d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
15d20 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
15d30 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
15d40 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  hine */.  KeyInf
15d50 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20  o *pKey;        
15d60 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49           /* KeyI
15d70 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f  nfo for index */
15d80 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
15d90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15da0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
15db0 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c 65 64 20  lding assembled 
15dc0 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a  index record */.
15dd0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
15de0 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
15df0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
15e00 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
15e10 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
15e20 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
15e30 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  db, pIndex->pSch
15e40 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ema);..#ifndef S
15e50 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
15e60 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73  RIZATION.  if( s
15e70 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
15e80 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52  pParse, SQLITE_R
15e90 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e  EINDEX, pIndex->
15ea0 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20  zName, 0,.      
15eb0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
15ec0 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75  me ) ){.    retu
15ed0 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
15ee0 20 20 2f 2a 20 52 65 71 75 69 72 65 20 61 20 77    /* Require a w
15ef0 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
15f00 20 74 61 62 6c 65 20 74 6f 20 70 65 72 66 6f 72   table to perfor
15f10 6d 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  m this operation
15f20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61 62   */.  sqlite3Tab
15f30 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
15f40 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
15f50 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  1, pTab->zName);
15f60 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
15f70 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
15f80 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
15f90 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f  urn;.  if( memRo
15fa0 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  otPage>=0 ){.   
15fb0 20 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50   tnum = memRootP
15fc0 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
15fd0 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d    tnum = pIndex-
15fe0 3e 74 6e 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65  >tnum;.  }.  pKe
15ff0 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  y = sqlite3KeyIn
16000 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65  foOfIndex(pParse
16010 2c 20 70 49 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a  , pIndex);..  /*
16020 20 4f 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72   Open the sorter
16030 20 63 75 72 73 6f 72 20 69 66 20 77 65 20 61 72   cursor if we ar
16040 65 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f  e to use one. */
16050 0a 20 20 69 53 6f 72 74 65 72 20 3d 20 70 50 61  .  iSorter = pPa
16060 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73  rse->nTab++;.  s
16070 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
16080 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  (v, OP_SorterOpe
16090 6e 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c 20 70  n, iSorter, 0, p
160a0 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20  Index->nKeyCol, 
160b0 28 63 68 61 72 2a 29 0a 20 20 20 20 20 20 20 20  (char*).        
160c0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
160d0 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
160e0 65 79 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  ey), P4_KEYINFO)
160f0 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
16100 20 74 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72   table. Loop thr
16110 6f 75 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66  ough all rows of
16120 20 74 68 65 20 74 61 62 6c 65 2c 20 69 6e 73 65   the table, inse
16130 72 74 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a  rting index.  **
16140 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 74 68   records into th
16150 65 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73  e sorter. */.  s
16160 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
16170 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44  pParse, iTab, iD
16180 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
16190 52 65 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d  Read);.  addr1 =
161a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
161b0 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
161c0 20 69 54 61 62 2c 20 30 29 3b 20 56 64 62 65 43   iTab, 0); VdbeC
161d0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 72 65  overage(v);.  re
161e0 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
161f0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
16200 73 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47  se);..  sqlite3G
16210 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
16220 70 50 61 72 73 65 2c 70 49 6e 64 65 78 2c 69 54  pParse,pIndex,iT
16230 61 62 2c 72 65 67 52 65 63 6f 72 64 2c 30 2c 26  ab,regRecord,0,&
16240 69 50 61 72 74 49 64 78 4c 61 62 65 6c 2c 30 2c  iPartIdxLabel,0,
16250 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
16260 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
16270 72 74 65 72 49 6e 73 65 72 74 2c 20 69 53 6f 72  rterInsert, iSor
16280 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  ter, regRecord);
16290 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  .  sqlite3Resolv
162a0 65 50 61 72 74 49 64 78 4c 61 62 65 6c 28 70 50  ePartIdxLabel(pP
162b0 61 72 73 65 2c 20 69 50 61 72 74 49 64 78 4c 61  arse, iPartIdxLa
162c0 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  bel);.  sqlite3V
162d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
162e0 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
162f0 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  1+1); VdbeCovera
16300 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
16310 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
16320 61 64 64 72 31 29 3b 0a 20 20 69 66 28 20 6d 65  addr1);.  if( me
16330 6d 52 6f 6f 74 50 61 67 65 3c 30 20 29 20 73 71  mRootPage<0 ) sq
16340 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16350 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75  v, OP_Clear, tnu
16360 6d 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74  m, iDb);.  sqlit
16370 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
16380 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49  OP_OpenWrite, iI
16390 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a  dx, tnum, iDb, .
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163b0 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65 79      (char *)pKey
163c0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
163d0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
163e0 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42  geP5(v, OPFLAG_B
163f0 55 4c 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74  ULKCSR|((memRoot
16400 50 61 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f  Page>=0)?OPFLAG_
16410 50 32 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20  P2ISREG:0));..  
16420 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
16430 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16440 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 53 6f 72  SorterSort, iSor
16450 74 65 72 2c 20 30 29 3b 20 56 64 62 65 43 6f 76  ter, 0); VdbeCov
16460 65 72 61 67 65 28 76 29 3b 0a 20 20 61 73 73 65  erage(v);.  asse
16470 72 74 28 20 70 4b 65 79 21 3d 30 20 7c 7c 20 64  rt( pKey!=0 || d
16480 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
16490 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
164a0 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75  );.  if( IsUniqu
164b0 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20 26  eIndex(pIndex) &
164c0 26 20 70 4b 65 79 21 3d 30 20 29 7b 0a 20 20 20  & pKey!=0 ){.   
164d0 20 69 6e 74 20 6a 32 20 3d 20 73 71 6c 69 74 65   int j2 = sqlite
164e0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
164f0 28 76 29 20 2b 20 33 3b 0a 20 20 20 20 73 71 6c  (v) + 3;.    sql
16500 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16510 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6a 32  , OP_Goto, 0, j2
16520 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73  );.    addr2 = s
16530 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
16540 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71  tAddr(v);.    sq
16550 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
16560 6e 74 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 43  nt(v, OP_SorterC
16570 6f 6d 70 61 72 65 2c 20 69 53 6f 72 74 65 72 2c  ompare, iSorter,
16580 20 6a 32 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a   j2, regRecord,.
16590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165a0 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d           pIndex-
165b0 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65 43  >nKeyCol); VdbeC
165c0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
165d0 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e  sqlite3UniqueCon
165e0 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20  straint(pParse, 
165f0 4f 45 5f 41 62 6f 72 74 2c 20 70 49 6e 64 65 78  OE_Abort, pIndex
16600 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
16610 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
16620 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
16630 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
16640 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
16650 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69 53 6f  _SorterData, iSo
16660 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 2c  rter, regRecord,
16670 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65   iIdx);.  sqlite
16680 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
16690 50 5f 4c 61 73 74 2c 20 69 49 64 78 2c 20 30 2c  P_Last, iIdx, 0,
166a0 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   -1);.  sqlite3V
166b0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
166c0 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c  IdxInsert, iIdx,
166d0 20 72 65 67 52 65 63 6f 72 64 2c 20 30 29 3b 0a   regRecord, 0);.
166e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
166f0 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
16700 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
16710 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
16720 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
16730 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
16740 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16750 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  v, OP_SorterNext
16760 2c 20 69 53 6f 72 74 65 72 2c 20 61 64 64 72 32  , iSorter, addr2
16770 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
16780 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
16790 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
167a0 72 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56  r1);..  sqlite3V
167b0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
167c0 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20 20  Close, iTab);.  
167d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
167e0 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
167f0 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Idx);.  sqlite3V
16800 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
16810 43 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72 29 3b  Close, iSorter);
16820 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
16830 74 65 20 68 65 61 70 20 73 70 61 63 65 20 74 6f  te heap space to
16840 20 68 6f 6c 64 20 61 6e 20 49 6e 64 65 78 20 6f   hold an Index o
16850 62 6a 65 63 74 20 77 69 74 68 20 6e 43 6f 6c 20  bject with nCol 
16860 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  columns..**.** I
16870 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f  ncrease the allo
16880 63 61 74 69 6f 6e 20 73 69 7a 65 20 74 6f 20 70  cation size to p
16890 72 6f 76 69 64 65 20 61 6e 20 65 78 74 72 61 20  rovide an extra 
168a0 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20  nExtra bytes.** 
168b0 6f 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65  of 8-byte aligne
168c0 64 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68  d space after th
168d0 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 61  e Index object a
168e0 6e 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20 70  nd return a.** p
168f0 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 65  ointer to this e
16900 78 74 72 61 20 73 70 61 63 65 20 69 6e 20 2a 70  xtra space in *p
16910 70 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78  pExtra..*/.Index
16920 20 2a 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74   *sqlite3Allocat
16930 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 0a 20 20  eIndexObject(.  
16940 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
16950 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
16960 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
16970 20 69 31 36 20 6e 43 6f 6c 2c 20 20 20 20 20 20   i16 nCol,      
16980 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
16990 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
169a0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   in the index */
169b0 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
169c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
169d0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 65 78  r of bytes of ex
169e0 74 72 61 20 73 70 61 63 65 20 74 6f 20 61 6c 6c  tra space to all
169f0 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  oc */.  char **p
16a00 70 45 78 74 72 61 20 20 20 20 20 20 20 2f 2a 20  pExtra       /* 
16a10 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  Pointer to the "
16a20 65 78 74 72 61 22 20 73 70 61 63 65 20 2a 2f 0a  extra" space */.
16a30 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 20 20  ){.  Index *p;  
16a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
16a50 6f 63 61 74 65 64 20 69 6e 64 65 78 20 6f 62 6a  ocated index obj
16a60 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  ect */.  int nBy
16a70 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te;           /*
16a80 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   Bytes of space 
16a90 66 6f 72 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  for Index object
16aa0 20 2b 20 61 72 72 61 79 73 20 2a 2f 0a 0a 20 20   + arrays */..  
16ab0 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73  nByte = ROUND8(s
16ac0 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 20 2b 20  izeof(Index)) + 
16ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16ae0 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
16af0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52 4f   */.          RO
16b00 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72  UND8(sizeof(char
16b10 2a 29 2a 6e 43 6f 6c 29 20 2b 20 20 20 20 20 20  *)*nCol) +      
16b20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f     /* Index.azCo
16b30 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  ll     */.      
16b40 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f      ROUND8(sizeo
16b50 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b  f(LogEst)*(nCol+
16b60 31 29 20 2b 20 20 20 20 20 2f 2a 20 49 6e 64 65  1) +     /* Inde
16b70 78 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20 20 20  x.aiRowLogEst   
16b80 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
16b90 20 20 20 20 73 69 7a 65 6f 66 28 69 31 36 29 2a      sizeof(i16)*
16ba0 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20  nCol +          
16bb0 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c    /* Index.aiCol
16bc0 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 20  umn   */.       
16bd0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
16be0 28 75 38 29 2a 6e 43 6f 6c 29 3b 20 20 20 20 20  (u8)*nCol);     
16bf0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
16c00 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20  .aSortOrder */. 
16c10 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
16c20 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
16c30 74 65 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20  te + nExtra);.  
16c40 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63 68 61  if( p ){.    cha
16c50 72 20 2a 70 45 78 74 72 61 20 3d 20 28 28 63 68  r *pExtra = ((ch
16c60 61 72 2a 29 70 29 2b 52 4f 55 4e 44 38 28 73 69  ar*)p)+ROUND8(si
16c70 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20  zeof(Index));.  
16c80 20 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63    p->azColl = (c
16c90 68 61 72 2a 2a 29 70 45 78 74 72 61 3b 20 20 20  har**)pExtra;   
16ca0 20 20 20 20 70 45 78 74 72 61 20 2b 3d 20 52 4f      pExtra += RO
16cb0 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72  UND8(sizeof(char
16cc0 2a 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 70 2d  *)*nCol);.    p-
16cd0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20 28  >aiRowLogEst = (
16ce0 4c 6f 67 45 73 74 2a 29 70 45 78 74 72 61 3b 20  LogEst*)pExtra; 
16cf0 70 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66  pExtra += sizeof
16d00 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31  (LogEst)*(nCol+1
16d10 29 3b 0a 20 20 20 20 70 2d 3e 61 69 43 6f 6c 75  );.    p->aiColu
16d20 6d 6e 20 3d 20 28 69 31 36 2a 29 70 45 78 74 72  mn = (i16*)pExtr
16d30 61 3b 20 20 20 20 20 20 20 70 45 78 74 72 61 20  a;       pExtra 
16d40 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e  += sizeof(i16)*n
16d50 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 53 6f 72  Col;.    p->aSor
16d60 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 70 45  tOrder = (u8*)pE
16d70 78 74 72 61 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f  xtra;.    p->nCo
16d80 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20  lumn = nCol;.   
16d90 20 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43   p->nKeyCol = nC
16da0 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 2a 70 70 45  ol - 1;.    *ppE
16db0 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70  xtra = ((char*)p
16dc0 29 20 2b 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20  ) + nByte;.  }. 
16dd0 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
16de0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
16df0 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51   index for an SQ
16e00 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31  L table.  pName1
16e10 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65 20 6e  .pName2 is the n
16e20 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
16e30 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73   .** and pTblLis
16e40 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  t is the name of
16e50 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
16e60 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  is to be indexed
16e70 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a  .  Both will .**
16e80 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70   be NULL for a p
16e90 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e  rimary key or an
16ea0 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 63   index that is c
16eb0 72 65 61 74 65 64 20 74 6f 20 73 61 74 69 73 66  reated to satisf
16ec0 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f  y a.** UNIQUE co
16ed0 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54  nstraint.  If pT
16ee0 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20  able and pIndex 
16ef0 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50  are NULL, use pP
16f00 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a  arse->pNewTable.
16f10 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 20  ** as the table 
16f20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
16f30 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
16f40 65 20 69 73 20 61 20 74 61 62 6c 65 20 74 68 61  e is a table tha
16f50 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  t is.** currentl
16f60 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  y being construc
16f70 74 65 64 20 62 79 20 61 20 43 52 45 41 54 45 20  ted by a CREATE 
16f80 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
16f90 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20  .**.** pList is 
16fa0 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  a list of column
16fb0 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
16fc0 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20    pList will be 
16fd0 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20  NULL if this.** 
16fe0 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  is a primary key
16ff0 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74   or unique-const
17000 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73  raint on the mos
17010 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20  t recent column 
17020 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  added.** to the 
17030 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
17040 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
17050 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  on.  .**.** If t
17060 68 65 20 69 6e 64 65 78 20 69 73 20 63 72 65 61  he index is crea
17070 74 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ted successfully
17080 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  , return a point
17090 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 49 6e  er to the new In
170a0 64 65 78 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  dex.** structure
170b0 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62  . This is used b
170c0 79 20 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d  y sqlite3AddPrim
170d0 61 72 79 4b 65 79 28 29 20 74 6f 20 6d 61 72 6b  aryKey() to mark
170e0 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 73   the index.** as
170f0 20 74 68 65 20 74 61 62 6c 65 73 20 70 72 69 6d   the tables prim
17100 61 72 79 20 6b 65 79 20 28 49 6e 64 65 78 2e 69  ary key (Index.i
17110 64 78 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49  dxType==SQLITE_I
17120 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45  DXTYPE_PRIMARYKE
17130 59 29 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c  Y).*/.Index *sql
17140 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
17150 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
17160 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66  ,     /* All inf
17170 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
17180 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54  his parse */.  T
17190 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
171a0 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20    /* First part 
171b0 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d  of index name. M
171c0 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
171d0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
171e0 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72     /* Second par
171f0 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e  t of index name.
17200 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
17210 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e    SrcList *pTblN
17220 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f  ame, /* Table to
17230 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72   index. Use pPar
17240 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66  se->pNewTable if
17250 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74   0 */.  ExprList
17260 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20   *pList,   /* A 
17270 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
17280 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
17290 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
172a0 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72        /* OE_Abor
172b0 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45  t, OE_Ignore, OE
172c0 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f  _Replace, or OE_
172d0 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  None */.  Token 
172e0 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20  *pStart,     /* 
172f0 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
17300 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 69   that begins thi
17310 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  s statement */. 
17320 20 45 78 70 72 20 2a 70 50 49 57 68 65 72 65 2c   Expr *pPIWhere,
17330 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61      /* WHERE cla
17340 75 73 65 20 66 6f 72 20 70 61 72 74 69 61 6c 20  use for partial 
17350 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74  indices */.  int
17360 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20 20   sortOrder,     
17370 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f 66  /* Sort order of
17380 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68 65   primary key whe
17390 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f  n pList==NULL */
173a0 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69 73  .  int ifNotExis
173b0 74 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72  t     /* Omit er
173c0 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c 72  ror if index alr
173d0 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29  eady exists */.)
173e0 7b 0a 20 20 49 6e 64 65 78 20 2a 70 52 65 74 20  {.  Index *pRet 
173f0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e  = 0;     /* Poin
17400 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ter to return */
17410 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
17420 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65   0;     /* Table
17430 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
17440 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
17450 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  x = 0;   /* The 
17460 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61  index to be crea
17470 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ted */.  char *z
17480 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  Name = 0;     /*
17490 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   Name of the ind
174a0 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  ex */.  int nNam
174b0 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
174c0 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
174d0 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f  ters in zName */
174e0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 44  .  int i, j;.  D
174f0 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20  bFixer sFix;    
17500 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67      /* For assig
17510 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61  ning database na
17520 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f  mes to pTable */
17530 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
17540 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20  Mask;   /* 1 to 
17550 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e  honor DESC in in
17560 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72  dex.  0 to ignor
17570 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  e. */.  sqlite3 
17580 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
17590 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  ;.  Db *pDb;    
175a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
175b0 73 70 65 63 69 66 69 63 20 74 61 62 6c 65 20 63  specific table c
175c0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e  ontaining the in
175d0 64 65 78 65 64 20 64 61 74 61 62 61 73 65 20 2a  dexed database *
175e0 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
175f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
17600 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
17610 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  e that is being 
17620 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b  written */.  Tok
17630 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20  en *pName = 0;  
17640 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64    /* Unqualified
17650 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
17660 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  ex to create */.
17670 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
17680 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65  t_item *pListIte
17690 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  m; /* For loopin
176a0 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a  g over pList */.
176b0 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a    const Column *
176c0 70 54 61 62 43 6f 6c 3b 20 20 20 20 20 20 20 20  pTabCol;        
176d0 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 69     /* A column i
176e0 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
176f0 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b   int nExtra = 0;
17700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17710 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63    /* Space alloc
17720 61 74 65 64 20 66 6f 72 20 7a 45 78 74 72 61 5b  ated for zExtra[
17730 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  ] */.  int nExtr
17740 61 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  aCol;           
17750 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17760 72 20 6f 66 20 65 78 74 72 61 20 63 6f 6c 75 6d  r of extra colum
17770 6e 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 63  ns needed */.  c
17780 68 61 72 20 2a 7a 45 78 74 72 61 20 3d 20 30 3b  har *zExtra = 0;
17790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177a0 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65 20 61  /* Extra space a
177b0 66 74 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f  fter the Index o
177c0 62 6a 65 63 74 20 2a 2f 0a 20 20 49 6e 64 65 78  bject */.  Index
177d0 20 2a 70 50 6b 20 3d 20 30 3b 20 20 20 20 20 20   *pPk = 0;      
177e0 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  /* PRIMARY KEY i
177f0 6e 64 65 78 20 66 6f 72 20 57 49 54 48 4f 55 54  ndex for WITHOUT
17800 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a 2f   ROWID tables */
17810 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
17820 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49 4e 5f 44  ocFailed || IN_D
17830 45 43 4c 41 52 45 5f 56 54 41 42 20 7c 7c 20 70  ECLARE_VTAB || p
17840 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b  Parse->nErr>0 ){
17850 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
17860 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
17870 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
17880 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
17890 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
178a0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
178b0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a  ate_index;.  }..
178c0 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
178d0 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
178e0 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
178f0 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66   Return early if
17900 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
17910 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21  .  if( pTblName!
17920 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73  =0 ){..    /* Us
17930 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69  e the two-part i
17940 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74  ndex name to det
17950 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62  ermine the datab
17960 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73  ase .    ** to s
17970 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74 61  earch for the ta
17980 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20 74  ble. 'Fix' the t
17990 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69  able name to thi
179a0 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f  s db.    ** befo
179b0 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68  re looking up th
179c0 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
179d0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
179e0 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a  e1 && pName2 );.
179f0 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
17a00 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
17a10 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
17a20 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
17a30 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f    if( iDb<0 ) go
17a40 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
17a50 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
17a60 28 20 70 4e 61 6d 65 20 26 26 20 70 4e 61 6d 65  ( pName && pName
17a70 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ->z );..#ifndef 
17a80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50  SQLITE_OMIT_TEMP
17a90 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  DB.    /* If the
17aa0 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20   index name was 
17ab0 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65  unqualified, che
17ac0 63 6b 20 69 66 20 74 68 65 20 74 61 62 6c 65 0a  ck if the table.
17ad0 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70      ** is a temp
17ae0 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73   table. If so, s
17af0 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
17b00 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20  to 1. Do not do 
17b10 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69  this.    ** if i
17b20 6e 69 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61  nitialising a da
17b30 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20  tabase schema.. 
17b40 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64     */.    if( !d
17b50 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
17b60 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c        pTab = sql
17b70 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75  ite3SrcListLooku
17b80 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61  p(pParse, pTblNa
17b90 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  me);.      if( p
17ba0 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70  Name2->n==0 && p
17bb0 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63  Tab && pTab->pSc
17bc0 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d  hema==db->aDb[1]
17bd0 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  .pSchema ){.    
17be0 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20      iDb = 1;.   
17bf0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
17c00 66 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  f..    sqlite3Fi
17c10 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61  xInit(&sFix, pPa
17c20 72 73 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78  rse, iDb, "index
17c30 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  ", pName);.    i
17c40 66 28 20 73 71 6c 69 74 65 33 46 69 78 53 72 63  f( sqlite3FixSrc
17c50 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c  List(&sFix, pTbl
17c60 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  Name) ){.      /
17c70 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 70 61  * Because the pa
17c80 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20  rser constructs 
17c90 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20  pTblName from a 
17ca0 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65  single identifie
17cb0 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  r,.      ** sqli
17cc0 74 65 33 46 69 78 53 72 63 4c 69 73 74 20 63 61  te3FixSrcList ca
17cd0 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f  n never fail. */
17ce0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29  .      assert(0)
17cf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
17d00 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
17d10 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65  TableItem(pParse
17d20 2c 20 30 2c 20 26 70 54 62 6c 4e 61 6d 65 2d 3e  , 0, &pTblName->
17d30 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  a[0]);.    asser
17d40 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
17d50 6c 65 64 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d  led==0 || pTab==
17d60 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  0 );.    if( pTa
17d70 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  b==0 ) goto exit
17d80 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
17d90 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 26 26     if( iDb==1 &&
17da0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
17db0 63 68 65 6d 61 21 3d 70 54 61 62 2d 3e 70 53 63  chema!=pTab->pSc
17dc0 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71  hema ){.      sq
17dd0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
17de0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
17df0 20 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65    "cannot create
17e00 20 61 20 54 45 4d 50 20 69 6e 64 65 78 20 6f 6e   a TEMP index on
17e10 20 6e 6f 6e 2d 54 45 4d 50 20 74 61 62 6c 65 20   non-TEMP table 
17e20 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20  \"%s\"",.       
17e30 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29      pTab->zName)
17e40 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
17e50 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
17e60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 48      }.    if( !H
17e70 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20  asRowid(pTab) ) 
17e80 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
17e90 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
17ea0 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b);.  }else{.   
17eb0 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d   assert( pName==
17ec0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
17ed0 20 70 53 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20   pStart==0 );.  
17ee0 20 20 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d    pTab = pParse-
17ef0 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20  >pNewTable;.    
17f00 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f  if( !pTab ) goto
17f10 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
17f20 65 78 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  ex;.    iDb = sq
17f30 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
17f40 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
17f50 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62  hema);.  }.  pDb
17f60 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
17f70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  ;..  assert( pTa
17f80 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
17f90 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
17fa0 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
17fb0 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d  e3StrNICmp(pTab-
17fc0 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
17fd0 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 20 20  ", 7)==0 .      
17fe0 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   && db->init.bus
17ff0 79 3d 3d 30 0a 23 69 66 20 53 51 4c 49 54 45 5f  y==0.#if SQLITE_
18000 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
18010 49 4f 4e 0a 20 20 20 20 20 20 20 26 26 20 73 71  ION.       && sq
18020 6c 69 74 65 33 55 73 65 72 41 75 74 68 54 61 62  lite3UserAuthTab
18030 6c 65 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3d  le(pTab->zName)=
18040 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  =0.#endif.      
18050 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
18060 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65  Cmp(&pTab->zName
18070 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c  [7],"altertab_",
18080 39 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  9)!=0 ){.    sql
18090 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
180a0 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
180b0 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
180c0 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
180d0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
180e0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
180f0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
18100 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28  _OMIT_VIEW.  if(
18110 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
18120 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
18130 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
18140 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  iews may not be 
18150 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67  indexed");.    g
18160 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18170 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69  index;.  }.#endi
18180 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
18190 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
181a0 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  LE.  if( IsVirtu
181b0 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
181c0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
181d0 70 50 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c  pParse, "virtual
181e0 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20   tables may not 
181f0 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20  be indexed");.  
18200 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18210 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65  te_index;.  }.#e
18220 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ndif..  /*.  ** 
18230 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66  Find the name of
18240 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b   the index.  Mak
18250 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
18260 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74  not already anot
18270 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  her.  ** index o
18280 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  r table with the
18290 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20   same name.  .  
182a0 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f  **.  ** Exceptio
182b0 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65  n:  If we are re
182c0 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20  ading the names 
182d0 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64  of permanent ind
182e0 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  ices from the.  
182f0 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ** sqlite_master
18300 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20   table (because 
18310 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
18320 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73  ss changed the s
18330 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20  chema) and.  ** 
18340 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  one of the index
18350 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20   names collides 
18360 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66  with the name of
18370 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
18380 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78  le or.  ** index
18390 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63  , then we will c
183a0 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65  ontinue to proce
183b0 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  ss this index.. 
183c0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d   **.  ** If pNam
183d0 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
183e0 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64  at we are.  ** d
183f0 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72  ealing with a pr
18400 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49  imary key or UNI
18410 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
18420 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65   We have to inve
18430 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20  nt our.  ** own 
18440 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  name..  */.  if(
18450 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e   pName ){.    zN
18460 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
18470 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
18480 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  Name);.    if( z
18490 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65  Name==0 ) goto e
184a0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
184b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
184c0 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  ame->z!=0 );.   
184d0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
184e0 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
184f0 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
18500 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67  Name) ){.      g
18510 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18520 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
18530 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
18540 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28  usy ){.      if(
18550 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
18560 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21  e(db, zName, 0)!
18570 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
18580 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
18590 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20  arse, "there is 
185a0 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20  already a table 
185b0 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
185c0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
185d0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
185e0 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
185f0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
18600 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
18610 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29  ame, pDb->zName)
18620 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
18630 20 21 69 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a   !ifNotExist ){.
18640 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
18650 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
18660 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64  "index %s alread
18670 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65  y exists", zName
18680 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
18690 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
186a0 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
186b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
186c0 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
186d0 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
186e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
186f0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18700 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ndex;.    }.  }e
18710 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  lse{.    int n;.
18720 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70      Index *pLoop
18730 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ;.    for(pLoop=
18740 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d  pTab->pIndex, n=
18750 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  1; pLoop; pLoop=
18760 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b  pLoop->pNext, n+
18770 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  +){}.    zName =
18780 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
18790 64 62 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f  db, "sqlite_auto
187a0 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c 20 70 54  index_%s_%d", pT
187b0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  ab->zName, n);. 
187c0 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
187d0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
187e0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
187f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
18800 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f   Check for autho
18810 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61  rization to crea
18820 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a  te an index..  *
18830 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
18840 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
18850 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73  ION.  {.    cons
18860 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44  t char *zDb = pD
18870 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  b->zName;.    if
18880 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
18890 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
188a0 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41  E_INSERT, SCHEMA
188b0 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30 2c 20  _TABLE(iDb), 0, 
188c0 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
188d0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
188e0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
188f0 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
18900 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  E_INDEX;.    if(
18910 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
18920 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20 53 51   iDb==1 ) i = SQ
18930 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
18940 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
18950 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
18960 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d  (pParse, i, zNam
18970 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
18980 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
18990 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
189a0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
189b0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
189c0 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61  pList==0, it mea
189d0 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ns this routine 
189e0 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61  was called to ma
189f0 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a  ke a primary.  *
18a00 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65  * key out of the
18a10 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64   last column add
18a20 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ed to the table 
18a30 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
18a40 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61  on..  ** So crea
18a50 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74  te a fake list t
18a60 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e  o simulate this.
18a70 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73  .  */.  if( pLis
18a80 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
18a90 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
18aa0 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
18ab0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
18ac0 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f   pList==0 ) goto
18ad0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18ae0 65 78 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  ex;.    pList->a
18af0 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [0].zName = sqli
18b00 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61 72  te3DbStrDup(pPar
18b10 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  se->db,.        
18b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b40 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
18b50 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 29 3b  >nCol-1].zName);
18b60 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  .    pList->a[0]
18b70 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  .sortOrder = (u8
18b80 29 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a  )sortOrder;.  }.
18b90 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
18ba0 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20   how many bytes 
18bb0 6f 66 20 73 70 61 63 65 20 61 72 65 20 72 65 71  of space are req
18bc0 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 65  uired to store e
18bd0 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73  xplicitly.  ** s
18be0 70 65 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 69  pecified collati
18bf0 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
18c00 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
18c10 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
18c20 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
18c30 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74  r *pExpr = pList
18c40 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
18c50 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20    if( pExpr ){. 
18c60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
18c70 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41  pr->op==TK_COLLA
18c80 54 45 20 29 3b 0a 20 20 20 20 20 20 6e 45 78 74  TE );.      nExt
18c90 72 61 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74  ra += (1 + sqlit
18ca0 65 33 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72  e3Strlen30(pExpr
18cb0 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20  ->u.zToken));.  
18cc0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20    }.  }..  /* . 
18cd0 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   ** Allocate the
18ce0 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
18cf0 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20  . .  */.  nName 
18d00 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
18d10 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 45 78 74  0(zName);.  nExt
18d20 72 61 43 6f 6c 20 3d 20 70 50 6b 20 3f 20 70 50  raCol = pPk ? pP
18d30 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a  k->nKeyCol : 1;.
18d40 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
18d50 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f  e3AllocateIndexO
18d60 62 6a 65 63 74 28 64 62 2c 20 70 4c 69 73 74 2d  bject(db, pList-
18d70 3e 6e 45 78 70 72 20 2b 20 6e 45 78 74 72 61 43  >nExpr + nExtraC
18d80 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol,.            
18d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18da0 20 20 20 20 20 20 20 20 20 20 6e 4e 61 6d 65 20            nName 
18db0 2b 20 6e 45 78 74 72 61 20 2b 20 31 2c 20 26 7a  + nExtra + 1, &z
18dc0 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 64 62  Extra);.  if( db
18dd0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
18de0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
18df0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18e00 7d 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  }.  assert( EIGH
18e10 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
18e20 28 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 4c 6f  (pIndex->aiRowLo
18e30 67 45 73 74 29 20 29 3b 0a 20 20 61 73 73 65 72  gEst) );.  asser
18e40 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
18e50 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e  IGNMENT(pIndex->
18e60 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20 20 70 49 6e  azColl) );.  pIn
18e70 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 45 78  dex->zName = zEx
18e80 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d  tra;.  zExtra +=
18e90 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 6d 65   nName + 1;.  me
18ea0 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61  mcpy(pIndex->zNa
18eb0 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  me, zName, nName
18ec0 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70  +1);.  pIndex->p
18ed0 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20  Table = pTab;.  
18ee0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
18ef0 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20  = (u8)onError;. 
18f00 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74   pIndex->uniqNot
18f10 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 21 3d  Null = onError!=
18f20 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 70 49 6e 64 65  OE_None;.  pInde
18f30 78 2d 3e 69 64 78 54 79 70 65 20 3d 20 70 4e 61  x->idxType = pNa
18f40 6d 65 20 3f 20 53 51 4c 49 54 45 5f 49 44 58 54  me ? SQLITE_IDXT
18f50 59 50 45 5f 41 50 50 44 45 46 20 3a 20 53 51 4c  YPE_APPDEF : SQL
18f60 49 54 45 5f 49 44 58 54 59 50 45 5f 55 4e 49 51  ITE_IDXTYPE_UNIQ
18f70 55 45 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53  UE;.  pIndex->pS
18f80 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
18f90 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  iDb].pSchema;.  
18fa0 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20  pIndex->nKeyCol 
18fb0 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
18fc0 20 20 69 66 28 20 70 50 49 57 68 65 72 65 20 29    if( pPIWhere )
18fd0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
18fe0 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63  olveSelfReferenc
18ff0 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
19000 4e 43 5f 50 61 72 74 49 64 78 2c 20 70 50 49 57  NC_PartIdx, pPIW
19010 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 70 49  here, 0);.    pI
19020 6e 64 65 78 2d 3e 70 50 61 72 74 49 64 78 57 68  ndex->pPartIdxWh
19030 65 72 65 20 3d 20 70 50 49 57 68 65 72 65 3b 0a  ere = pPIWhere;.
19040 20 20 20 20 70 50 49 57 68 65 72 65 20 3d 20 30      pPIWhere = 0
19050 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
19060 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
19070 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
19080 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  0) );..  /* Chec
19090 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 73  k to see if we s
190a0 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43  hould honor DESC
190b0 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64   requests on ind
190c0 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a  ex columns.  */.
190d0 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
190e0 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  ma->file_format>
190f0 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72  =4 ){.    sortOr
19100 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20  derMask = -1;   
19110 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f  /* Honor DESC */
19120 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f  .  }else{.    so
19130 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b  rtOrderMask = 0;
19140 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45      /* Ignore DE
19150 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20  SC */.  }..  /* 
19160 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  Scan the names o
19170 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  f the columns of
19180 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
19190 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a   indexed and.  *
191a0 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d  * load the colum
191b0 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74  n indices into t
191c0 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  he Index structu
191d0 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65  re.  Report an e
191e0 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79  rror.  ** if any
191f0 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66   column is not f
19200 6f 75 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ound..  **.  ** 
19210 54 4f 44 4f 3a 20 20 41 64 64 20 61 20 74 65 73  TODO:  Add a tes
19220 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  t to make sure t
19230 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 6f 6c  hat the same col
19240 75 6d 6e 20 69 73 20 6e 6f 74 20 6e 61 6d 65 64  umn is not named
19250 0a 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20  .  ** more than 
19260 6f 6e 63 65 20 77 69 74 68 69 6e 20 74 68 65 20  once within the 
19270 73 61 6d 65 20 69 6e 64 65 78 2e 20 20 4f 6e 6c  same index.  Onl
19280 79 20 74 68 65 20 66 69 72 73 74 20 69 6e 73 74  y the first inst
19290 61 6e 63 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65  ance of.  ** the
192a0 20 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65   column will eve
192b0 72 20 62 65 20 75 73 65 64 20 62 79 20 74 68 65  r be used by the
192c0 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74   optimizer.  Not
192d0 65 20 74 68 61 74 20 75 73 69 6e 67 20 74 68 65  e that using the
192e0 0a 20 20 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d  .  ** same colum
192f0 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  n more than once
19300 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 65 72   cannot be an er
19310 72 6f 72 20 62 65 63 61 75 73 65 20 74 68 61 74  ror because that
19320 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 62 72 65   would .  ** bre
19330 61 6b 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  ak backwards com
19340 70 61 74 69 62 69 6c 69 74 79 20 2d 20 69 74 20  patibility - it 
19350 6e 65 65 64 73 20 74 6f 20 62 65 20 61 20 77 61  needs to be a wa
19360 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f  rning..  */.  fo
19370 72 28 69 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d  r(i=0, pListItem
19380 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69  =pList->a; i<pLi
19390 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  st->nExpr; i++, 
193a0 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20  pListItem++){.  
193b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
193c0 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69 73 74 49 74  olName = pListIt
193d0 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  em->zName;.    i
193e0 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f 72 74  nt requestedSort
193f0 4f 72 64 65 72 3b 0a 20 20 20 20 63 68 61 72 20  Order;.    char 
19400 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *zColl;         
19410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
19420 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
19430 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72  name */..    for
19440 28 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54  (j=0, pTabCol=pT
19450 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62  ab->aCol; j<pTab
19460 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61  ->nCol; j++, pTa
19470 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69  bCol++){.      i
19480 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
19490 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62  p(zColName, pTab
194a0 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29  Col->zName)==0 )
194b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
194c0 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e    if( j>=pTab->n
194d0 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Col ){.      sql
194e0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
194f0 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68  rse, "table %s h
19500 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d  as no column nam
19510 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  ed %s",.        
19520 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pTab->zName, zCo
19530 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 50  lName);.      pP
19540 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
19550 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  a = 1;.      got
19560 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
19570 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  dex;.    }.    a
19580 73 73 65 72 74 28 20 6a 3c 3d 30 78 37 66 66 66  ssert( j<=0x7fff
19590 20 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e   );.    pIndex->
195a0 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 28 69  aiColumn[i] = (i
195b0 31 36 29 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c  16)j;.    if( pL
195c0 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 20 29  istItem->pExpr )
195d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c  {.      int nCol
195e0 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  l;.      assert(
195f0 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
19600 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  r->op==TK_COLLAT
19610 45 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  E );.      zColl
19620 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45   = pListItem->pE
19630 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
19640 20 20 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c       nColl = sql
19650 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f  ite3Strlen30(zCo
19660 6c 6c 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 61  ll) + 1;.      a
19670 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e  ssert( nExtra>=n
19680 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65  Coll );.      me
19690 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f  mcpy(zExtra, zCo
196a0 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20  ll, nColl);.    
196b0 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61    zColl = zExtra
196c0 3b 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20 2b  ;.      zExtra +
196d0 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e  = nColl;.      n
196e0 45 78 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a  Extra -= nColl;.
196f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19700 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61   zColl = pTab->a
19710 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20  Col[j].zColl;.  
19720 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29      if( !zColl )
19730 20 7a 43 6f 6c 6c 20 3d 20 22 42 49 4e 41 52 59   zColl = "BINARY
19740 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  ";.    }.    if(
19750 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
19760 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63 61 74  && !sqlite3Locat
19770 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
19780 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   zColl) ){.     
19790 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
197a0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
197b0 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c     pIndex->azCol
197c0 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20  l[i] = zColl;.  
197d0 20 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f    requestedSortO
197e0 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74 65 6d  rder = pListItem
197f0 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20 73 6f  ->sortOrder & so
19800 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20  rtOrderMask;.   
19810 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72   pIndex->aSortOr
19820 64 65 72 5b 69 5d 20 3d 20 28 75 38 29 72 65 71  der[i] = (u8)req
19830 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b  uestedSortOrder;
19840 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61  .    if( pTab->a
19850 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d  Col[j].notNull==
19860 30 20 29 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71  0 ) pIndex->uniq
19870 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 7d  NotNull = 0;.  }
19880 0a 20 20 69 66 28 20 70 50 6b 20 29 7b 0a 20 20  .  if( pPk ){.  
19890 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b    for(j=0; j<pPk
198a0 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b  ->nKeyCol; j++){
198b0 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70  .      int x = p
198c0 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  Pk->aiColumn[j];
198d0 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 43 6f  .      if( hasCo
198e0 6c 75 6d 6e 28 70 49 6e 64 65 78 2d 3e 61 69 43  lumn(pIndex->aiC
198f0 6f 6c 75 6d 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e  olumn, pIndex->n
19900 4b 65 79 43 6f 6c 2c 20 78 29 20 29 7b 0a 20 20  KeyCol, x) ){.  
19910 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 43        pIndex->nC
19920 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20 20 20 20 20 20  olumn--; .      
19930 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
19940 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
19950 69 5d 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20  i] = x;.        
19960 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
19970 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b  ] = pPk->azColl[
19980 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64  j];.        pInd
19990 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ex->aSortOrder[i
199a0 5d 20 3d 20 70 50 6b 2d 3e 61 53 6f 72 74 4f 72  ] = pPk->aSortOr
199b0 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  der[j];.        
199c0 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i++;.      }.   
199d0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69   }.    assert( i
199e0 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  ==pIndex->nColum
199f0 6e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n );.  }else{.  
19a00 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
19a10 6d 6e 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  mn[i] = -1;.    
19a20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
19a30 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  ] = "BINARY";.  
19a40 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 66 61 75  }.  sqlite3Defau
19a50 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65 78 29  ltRowEst(pIndex)
19a60 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
19a70 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 20 65  pNewTable==0 ) e
19a80 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74  stimateIndexWidt
19a90 68 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20 69 66  h(pIndex);..  if
19aa0 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e  ( pTab==pParse->
19ab0 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20  pNewTable ){.   
19ac0 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
19ad0 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
19ae0 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75   to create an au
19af0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73  tomatic index as
19b00 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74   a.    ** result
19b10 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45   of a PRIMARY KE
19b20 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75  Y or UNIQUE clau
19b30 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64  se on a column d
19b40 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20  efinition, or.  
19b50 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b    ** a PRIMARY K
19b60 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61  EY or UNIQUE cla
19b70 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  use following th
19b80 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  e column definit
19b90 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65  ions..    ** i.e
19ba0 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a  . one of:.    **
19bb0 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54  .    ** CREATE T
19bc0 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59  ABLE t(x PRIMARY
19bd0 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a   KEY, y);.    **
19be0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
19bf0 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20  x, y, UNIQUE(x, 
19c00 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  y));.    **.    
19c10 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 63  ** Either way, c
19c20 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
19c30 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  he table already
19c40 20 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64   has such an ind
19c50 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f  ex. If.    ** so
19c60 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63  , don't bother c
19c70 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65  reating this one
19c80 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c  . This only appl
19c90 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75  ies to.    ** au
19ca0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61  tomatically crea
19cb0 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65  ted indices. Use
19cc0 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65  rs can do as the
19cd0 79 20 77 69 73 68 20 77 69 74 68 0a 20 20 20 20  y wish with.    
19ce0 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69  ** explicit indi
19cf0 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ces..    **.    
19d00 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45 20 6f 72  ** Two UNIQUE or
19d10 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
19d20 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 6e  straints are con
19d30 73 69 64 65 72 65 64 20 65 71 75 69 76 61 6c 65  sidered equivale
19d40 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64 20 74  nt.    ** (and t
19d50 68 75 73 20 73 75 70 70 72 65 73 73 69 6e 67 20  hus suppressing 
19d60 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20  the second one) 
19d70 65 76 65 6e 20 69 66 20 74 68 65 79 20 68 61 76  even if they hav
19d80 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20  e different.    
19d90 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a  ** sort orders..
19da0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
19db0 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65   there are diffe
19dc0 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  rent collating s
19dd0 65 71 75 65 6e 63 65 73 20 6f 72 20 69 66 20 74  equences or if t
19de0 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20  he columns of.  
19df0 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72 61    ** the constra
19e00 69 6e 74 20 6f 63 63 75 72 20 69 6e 20 64 69 66  int occur in dif
19e10 66 65 72 65 6e 74 20 6f 72 64 65 72 73 2c 20 74  ferent orders, t
19e20 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69  hen the constrai
19e30 6e 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 63  nts are.    ** c
19e40 6f 6e 73 69 64 65 72 65 64 20 64 69 73 74 69 6e  onsidered distin
19e50 63 74 20 61 6e 64 20 62 6f 74 68 20 72 65 73 75  ct and both resu
19e60 6c 74 20 69 6e 20 73 65 70 61 72 61 74 65 20 69  lt in separate i
19e70 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20  ndices..    */. 
19e80 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
19e90 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
19ea0 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
19eb0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
19ec0 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b  t){.      int k;
19ed0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49  .      assert( I
19ee0 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64  sUniqueIndex(pId
19ef0 78 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  x) );.      asse
19f00 72 74 28 20 70 49 64 78 2d 3e 69 64 78 54 79 70  rt( pIdx->idxTyp
19f10 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50  e!=SQLITE_IDXTYP
19f20 45 5f 41 50 50 44 45 46 20 29 3b 0a 20 20 20 20  E_APPDEF );.    
19f30 20 20 61 73 73 65 72 74 28 20 49 73 55 6e 69 71    assert( IsUniq
19f40 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20  ueIndex(pIndex) 
19f50 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49  );..      if( pI
19f60 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e  dx->nKeyCol!=pIn
19f70 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63  dex->nKeyCol ) c
19f80 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66  ontinue;.      f
19f90 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e  or(k=0; k<pIdx->
19fa0 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20  nKeyCol; k++){. 
19fb0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
19fc0 72 20 2a 7a 31 3b 0a 20 20 20 20 20 20 20 20 63  r *z1;.        c
19fd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20  onst char *z2;. 
19fe0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
19ff0 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49  >aiColumn[k]!=pI
1a000 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  ndex->aiColumn[k
1a010 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
1a020 20 20 20 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a     z1 = pIdx->az
1a030 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20  Coll[k];.       
1a040 20 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a   z2 = pIndex->az
1a050 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20  Coll[k];.       
1a060 20 69 66 28 20 7a 31 21 3d 7a 32 20 26 26 20 73   if( z1!=z2 && s
1a070 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31  qlite3StrICmp(z1
1a080 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20  , z2) ) break;. 
1a090 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1a0a0 20 6b 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   k==pIdx->nKeyCo
1a0b0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  l ){.        if(
1a0c0 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
1a0d0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
1a0e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1a0f0 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  This constraint 
1a100 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65  creates the same
1a110 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76   index as a prev
1a120 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ious.          *
1a130 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65  * constraint spe
1a140 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65  cified somewhere
1a150 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54   in the CREATE T
1a160 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
1a170 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77            ** How
1a180 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46  ever the ON CONF
1a190 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65  LICT clauses are
1a1a0 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62   different. If b
1a1b0 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20  oth this .      
1a1c0 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
1a1d0 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f  t and the previo
1a1e0 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  us equivalent co
1a1f0 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78  nstraint have ex
1a200 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20  plicit.         
1a210 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20   ** ON CONFLICT 
1a220 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20  clauses this is 
1a230 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77  an error. Otherw
1a240 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20  ise, use the.   
1a250 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63         ** explic
1a260 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62  itly specified b
1a270 65 68 61 76 69 6f 72 20 66 6f 72 20 74 68 65 20  ehavior for the 
1a280 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20  index..         
1a290 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
1a2a0 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  ( !(pIdx->onErro
1a2b0 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c  r==OE_Default ||
1a2c0 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
1a2d0 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b  ==OE_Default) ){
1a2e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1a2f0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1a300 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
1a310 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69        "conflicti
1a320 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  ng ON CONFLICT c
1a330 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65 64  lauses specified
1a340 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ", 0);.         
1a350 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
1a360 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d   pIdx->onError==
1a370 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  OE_Default ){.  
1a380 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
1a390 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78  onError = pIndex
1a3a0 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20  ->onError;.     
1a3b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1a3c0 0a 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20  .        pRet = 
1a3d0 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 67 6f  pIdx;.        go
1a3e0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1a3f0 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
1a400 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69    }.  }..  /* Li
1a410 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78  nk the new Index
1a420 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74   structure to it
1a430 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74  s table and to t
1a440 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e  he other.  ** in
1a450 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1a460 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20   structures. .  
1a470 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
1a480 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e  t.busy ){.    In
1a490 64 65 78 20 2a 70 3b 0a 20 20 20 20 61 73 73 65  dex *p;.    asse
1a4a0 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
1a4b0 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30  aMutexHeld(db, 0
1a4c0 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  , pIndex->pSchem
1a4d0 61 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71  a) );.    p = sq
1a4e0 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
1a4f0 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61  &pIndex->pSchema
1a500 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20  ->idxHash, .    
1a510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a520 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
1a530 61 6d 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  ame, pIndex);.  
1a540 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
1a550 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64   assert( p==pInd
1a560 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ex );  /* Malloc
1a570 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
1a580 64 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d  d */.      db->m
1a590 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
1a5a0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
1a5b0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1a5c0 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61     }.    db->fla
1a5d0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
1a5e0 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20  ernChanges;.    
1a5f0 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
1a600 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
1a610 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74  >tnum = db->init
1a620 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a  .newTnum;.    }.
1a630 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
1a640 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  s is the initial
1a650 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
1a660 61 74 65 6d 65 6e 74 20 28 6f 72 20 43 52 45 41  atement (or CREA
1a670 54 45 20 54 41 42 4c 45 20 69 66 20 74 68 65 0a  TE TABLE if the.
1a680 20 20 2a 2a 20 69 6e 64 65 78 20 69 73 20 61 6e    ** index is an
1a690 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20 66   implied index f
1a6a0 6f 72 20 61 20 55 4e 49 51 55 45 20 6f 72 20 50  or a UNIQUE or P
1a6b0 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
1a6c0 72 61 69 6e 74 29 20 74 68 65 6e 0a 20 20 2a 2a  raint) then.  **
1a6d0 20 65 6d 69 74 20 63 6f 64 65 20 74 6f 20 61 6c   emit code to al
1a6e0 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  locate the index
1a6f0 20 72 6f 6f 74 70 61 67 65 20 6f 6e 20 64 69 73   rootpage on dis
1a700 6b 20 61 6e 64 20 6d 61 6b 65 20 61 6e 20 65 6e  k and make an en
1a710 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65  try for.  ** the
1a720 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 73 71   index in the sq
1a730 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
1a740 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 74  e and populate t
1a750 68 65 20 69 6e 64 65 78 20 77 69 74 68 0a 20 20  he index with.  
1a760 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74  ** content.  But
1a770 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73  , do not do this
1a780 20 69 66 20 77 65 20 61 72 65 20 73 69 6d 70 6c   if we are simpl
1a790 79 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71  y reading the sq
1a7a0 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a  lite_master.  **
1a7b0 20 74 61 62 6c 65 20 74 6f 20 70 61 72 73 65 20   table to parse 
1a7c0 74 68 65 20 73 63 68 65 6d 61 2c 20 6f 72 20 69  the schema, or i
1a7d0 66 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  f this index is 
1a7e0 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
1a7f0 69 6e 64 65 78 0a 20 20 2a 2a 20 6f 66 20 61 20  index.  ** of a 
1a800 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
1a810 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ble..  **.  ** I
1a820 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74  f pTblName==0 it
1a830 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65   means this inde
1a840 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61  x is generated a
1a850 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 50 52 49  s an implied PRI
1a860 4d 41 52 59 20 4b 45 59 0a 20 20 2a 2a 20 6f 72  MARY KEY.  ** or
1a870 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20 69 6e   UNIQUE index in
1a880 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
1a890 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63  statement.  Sinc
1a8a0 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a  e the table.  **
1a8b0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63   has just been c
1a8c0 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61  reated, it conta
1a8d0 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20  ins no data and 
1a8e0 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61  the index initia
1a8f0 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74  lization.  ** st
1a900 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65  ep can be skippe
1a910 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69  d..  */.  else i
1a920 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  f( pParse->nErr=
1a930 3d 30 20 26 26 20 28 48 61 73 52 6f 77 69 64 28  =0 && (HasRowid(
1a940 70 54 61 62 29 20 7c 7c 20 70 54 62 6c 4e 61 6d  pTab) || pTblNam
1a950 65 21 3d 30 29 20 29 7b 0a 20 20 20 20 56 64 62  e!=0) ){.    Vdb
1a960 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a  e *v;.    char *
1a970 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69  zStmt;.    int i
1a980 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
1a990 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76 20 3d 20 73  nMem;..    v = s
1a9a0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1a9b0 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
1a9c0 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
1a9d0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20  create_index;.. 
1a9e0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
1a9f0 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
1aa00 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a  arse, 1, iDb);..
1aa10 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
1aa20 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74  e rootpage for t
1aa30 68 65 20 69 6e 64 65 78 20 75 73 69 6e 67 20 43  he index using C
1aa40 72 65 61 74 65 49 6e 64 65 78 2e 20 42 75 74 20  reateIndex. But 
1aa50 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 64 6f  before.    ** do
1aa60 69 6e 67 20 73 6f 2c 20 63 6f 64 65 20 61 20 4e  ing so, code a N
1aa70 6f 6f 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  oop instruction 
1aa80 61 6e 64 20 73 74 6f 72 65 20 69 74 73 20 61 64  and store its ad
1aa90 64 72 65 73 73 20 69 6e 20 0a 20 20 20 20 2a 2a  dress in .    **
1aaa0 20 49 6e 64 65 78 2e 74 6e 75 6d 2e 20 54 68 69   Index.tnum. Thi
1aab0 73 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e  s is required in
1aac0 20 63 61 73 65 20 74 68 69 73 20 69 6e 64 65 78   case this index
1aad0 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 0a   is actually a .
1aae0 20 20 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b      ** PRIMARY K
1aaf0 45 59 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  EY and the table
1ab00 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 57   is actually a W
1ab10 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
1ab20 6c 65 2e 20 49 6e 20 0a 20 20 20 20 2a 2a 20 74  le. In .    ** t
1ab30 68 61 74 20 63 61 73 65 20 74 68 65 20 63 6f 6e  hat case the con
1ab40 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77  vertToWithoutRow
1ab50 69 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e  idTable() routin
1ab60 65 20 77 69 6c 6c 20 72 65 70 6c 61 63 65 0a 20  e will replace. 
1ab70 20 20 20 2a 2a 20 74 68 65 20 4e 6f 6f 70 20 77     ** the Noop w
1ab80 69 74 68 20 61 20 47 6f 74 6f 20 74 6f 20 6a 75  ith a Goto to ju
1ab90 6d 70 20 6f 76 65 72 20 74 68 65 20 56 44 42 45  mp over the VDBE
1aba0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
1abb0 62 65 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 70 49  below. */.    pI
1abc0 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c  ndex->tnum = sql
1abd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
1abe0 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20  , OP_Noop);.    
1abf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ac00 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e  2(v, OP_CreateIn
1ac10 64 65 78 2c 20 69 44 62 2c 20 69 4d 65 6d 29 3b  dex, iDb, iMem);
1ac20 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20  ..    /* Gather 
1ac30 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78  the complete tex
1ac40 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
1ac50 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
1ac60 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  into.    ** the 
1ac70 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20  zStmt variable. 
1ac80 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
1ac90 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  tart ){.      in
1aca0 74 20 6e 20 3d 20 28 69 6e 74 29 28 70 50 61 72  t n = (int)(pPar
1acb0 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a  se->sLastToken.z
1acc0 20 2d 20 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70   - pName->z) + p
1acd0 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
1ace0 6e 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  n.n;.      if( p
1acf0 4e 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b  Name->z[n-1]==';
1ad00 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 2f  ' ) n--;.      /
1ad10 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  * A named index 
1ad20 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74  with an explicit
1ad30 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
1ad40 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20  atement */.     
1ad50 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
1ad60 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43 52 45  MPrintf(db, "CRE
1ad70 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73  ATE%s INDEX %.*s
1ad80 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72  ",.        onErr
1ad90 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22  or==OE_None ? ""
1ada0 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 20 6e 2c   : " UNIQUE", n,
1adb0 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20   pName->z);.    
1adc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
1add0 41 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  An automatic ind
1ade0 65 78 20 63 72 65 61 74 65 64 20 62 79 20 61 20  ex created by a 
1adf0 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
1ae00 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
1ae10 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74   */.      /* zSt
1ae20 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
1ae30 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20  ntf(""); */.    
1ae40 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20    zStmt = 0;.   
1ae50 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61   }..    /* Add a
1ae60 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74  n entry in sqlit
1ae70 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69  e_master for thi
1ae80 73 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20  s index.    */. 
1ae90 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
1aea0 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
1aeb0 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49         "INSERT I
1aec0 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53  NTO %Q.%s VALUES
1aed0 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23  ('index',%Q,%Q,#
1aee0 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20  %d,%Q);",.      
1aef0 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
1af00 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
1af10 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20  LE(iDb),.       
1af20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a   pIndex->zName,.
1af30 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
1af40 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 69 4d 65  ame,.        iMe
1af50 6d 2c 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74  m,.        zStmt
1af60 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
1af70 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
1af80 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  tmt);..    /* Fi
1af90 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77 69 74  ll the index wit
1afa0 68 20 64 61 74 61 20 61 6e 64 20 72 65 70 61 72  h data and repar
1afb0 73 65 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43  se the schema. C
1afc0 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65  ode an OP_Expire
1afd0 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c  .    ** to inval
1afe0 69 64 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f  idate all pre-co
1aff0 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
1b000 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
1b010 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20  ( pTblName ){.  
1b020 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
1b030 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
1b040 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20  Index, iMem);.  
1b050 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
1b060 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
1b070 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
1b080 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53  te3VdbeAddParseS
1b090 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a  chemaOp(v, iDb,.
1b0a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1b0b0 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d  MPrintf(db, "nam
1b0c0 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65 3d  e='%q' AND type=
1b0d0 27 69 6e 64 65 78 27 22 2c 20 70 49 6e 64 65 78  'index'", pIndex
1b0e0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
1b0f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b100 70 31 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c  p1(v, OP_Expire,
1b110 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   0);.    }..    
1b120 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
1b130 65 72 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e 74  ere(v, pIndex->t
1b140 6e 75 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  num);.  }..  /* 
1b150 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69  When adding an i
1b160 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74  ndex to the list
1b170 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20   of indices for 
1b180 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20  a table, make.  
1b190 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69  ** sure all indi
1b1a0 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52  ces labeled OE_R
1b1b0 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65  eplace come afte
1b1c0 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65  r all those labe
1b1d0 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f  led.  ** OE_Igno
1b1e0 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  re.  This is nec
1b1f0 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63  essary for the c
1b200 6f 72 72 65 63 74 20 63 6f 6e 73 74 72 61 69 6e  orrect constrain
1b210 74 20 63 68 65 63 6b 0a 20 20 2a 2a 20 70 72 6f  t check.  ** pro
1b220 63 65 73 73 69 6e 67 20 28 69 6e 20 73 71 6c 69  cessing (in sqli
1b230 74 65 33 47 65 6e 65 72 61 74 65 43 6f 6e 73 74  te3GenerateConst
1b240 72 61 69 6e 74 43 68 65 63 6b 73 28 29 29 20 61  raintChecks()) a
1b250 73 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 55  s part of.  ** U
1b260 50 44 41 54 45 20 61 6e 64 20 49 4e 53 45 52 54  PDATE and INSERT
1b270 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 0a 20   statements.  . 
1b280 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
1b290 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e  it.busy || pTblN
1b2a0 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ame==0 ){.    if
1b2b0 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ( onError!=OE_Re
1b2c0 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70  place || pTab->p
1b2d0 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20  Index==0.       
1b2e0 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65    || pTab->pInde
1b2f0 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52  x->onError==OE_R
1b300 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70  eplace){.      p
1b310 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
1b320 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
1b330 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20     pTab->pIndex 
1b340 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65  = pIndex;.    }e
1b350 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
1b360 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d   *pOther = pTab-
1b370 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77  >pIndex;.      w
1b380 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e  hile( pOther->pN
1b390 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70  ext && pOther->p
1b3a0 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  Next->onError!=O
1b3b0 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20  E_Replace ){.   
1b3c0 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f       pOther = pO
1b3d0 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
1b3e0 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65     }.      pInde
1b3f0 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65  x->pNext = pOthe
1b400 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
1b410 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20  pOther->pNext = 
1b420 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  pIndex;.    }.  
1b430 20 20 70 52 65 74 20 3d 20 70 49 6e 64 65 78 3b    pRet = pIndex;
1b440 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b  .    pIndex = 0;
1b450 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e  .  }..  /* Clean
1b460 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69   up before exiti
1b470 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74  ng */.exit_creat
1b480 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70  e_index:.  if( p
1b490 49 6e 64 65 78 20 29 20 66 72 65 65 49 6e 64 65  Index ) freeInde
1b4a0 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
1b4b0 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1b4c0 74 65 28 64 62 2c 20 70 50 49 57 68 65 72 65 29  te(db, pPIWhere)
1b4d0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
1b4e0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
1b4f0 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
1b500 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
1b510 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71   pTblName);.  sq
1b520 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1b530 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
1b540 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
1b550 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e 61  Fill the Index.a
1b560 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79 20  iRowEst[] array 
1b570 77 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e 66  with default inf
1b580 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72  ormation - infor
1b590 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20  mation.** to be 
1b5a0 75 73 65 64 20 77 68 65 6e 20 77 65 20 68 61 76  used when we hav
1b5b0 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41 4e  e not run the AN
1b5c0 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  ALYZE command..*
1b5d0 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d  *.** aiRowEst[0]
1b5e0 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f 20   is supposed to 
1b5f0 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62  contain the numb
1b600 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
1b610 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20  n the index..** 
1b620 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20  Since we do not 
1b630 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d 69  know, guess 1 mi
1b640 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74  llion.  aiRowEst
1b650 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61  [1] is an estima
1b660 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d  te of the.** num
1b670 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
1b680 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61  he table that ma
1b690 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c  tch any particul
1b6a0 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a  ar value of the.
1b6b0 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20  ** first column 
1b6c0 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 61  of the index.  a
1b6d0 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61 6e  iRowEst[2] is an
1b6e0 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
1b6f0 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f   number.** of ro
1b700 77 73 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e  ws that match an
1b710 79 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d  y particular com
1b720 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  bination of the 
1b730 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a  first 2 columns.
1b740 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  ** of the index.
1b750 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20    And so forth. 
1b760 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73 20   It must always 
1b770 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
1b780 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .*.**           
1b790 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52  aiRowEst[N]<=aiR
1b7a0 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20  owEst[N-1].**   
1b7b0 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74          aiRowEst
1b7c0 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61  [N]>=1.**.** Apa
1b7d0 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77 65  rt from that, we
1b7e0 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f 20   have little to 
1b7f0 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69 6e  go on besides in
1b800 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a  tuition as to.**
1b810 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d 20   how aiRowEst[] 
1b820 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61  should be initia
1b830 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d 62  lized.  The numb
1b840 65 72 73 20 67 65 6e 65 72 61 74 65 64 20 68 65  ers generated he
1b850 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64 20  re.** are based 
1b860 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75 65  on typical value
1b870 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75 61  s found in actua
1b880 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f  l indices..*/.vo
1b890 69 64 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c  id sqlite3Defaul
1b8a0 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a 70  tRowEst(Index *p
1b8b0 49 64 78 29 7b 0a 20 20 2f 2a 20 20 20 20 20 20  Idx){.  /*      
1b8c0 20 20 20 20 20 20 20 20 20 20 31 30 2c 20 20 39            10,  9
1b8d0 2c 20 20 38 2c 20 20 37 2c 20 20 36 20 2a 2f 0a  ,  8,  7,  6 */.
1b8e0 20 20 4c 6f 67 45 73 74 20 61 56 61 6c 5b 5d 20    LogEst aVal[] 
1b8f0 3d 20 7b 20 33 33 2c 20 33 32 2c 20 33 30 2c 20  = { 33, 32, 30, 
1b900 32 38 2c 20 32 36 20 7d 3b 0a 20 20 4c 6f 67 45  28, 26 };.  LogE
1b910 73 74 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69  st *a = pIdx->ai
1b920 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 6e 74  RowLogEst;.  int
1b930 20 6e 43 6f 70 79 20 3d 20 4d 49 4e 28 41 72 72   nCopy = MIN(Arr
1b940 61 79 53 69 7a 65 28 61 56 61 6c 29 2c 20 70 49  aySize(aVal), pI
1b950 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20  dx->nKeyCol);.  
1b960 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 65 74  int i;..  /* Set
1b970 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1b980 20 28 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73   (number of rows
1b990 20 69 6e 20 74 68 65 20 69 6e 64 65 78 29 20 74   in the index) t
1b9a0 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  o the estimated 
1b9b0 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  .  ** number of 
1b9c0 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
1b9d0 65 2e 20 4f 72 20 31 30 2c 20 69 66 20 74 68 65  e. Or 10, if the
1b9e0 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   estimated numbe
1b9f0 72 20 6f 66 20 72 6f 77 73 20 0a 20 20 2a 2a 20  r of rows .  ** 
1ba00 69 6e 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  in the table is 
1ba10 6c 65 73 73 20 74 68 61 6e 20 74 68 61 74 2e 20  less than that. 
1ba20 20 2a 2f 0a 20 20 61 5b 30 5d 20 3d 20 70 49 64   */.  a[0] = pId
1ba30 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c  x->pTable->nRowL
1ba40 6f 67 45 73 74 3b 0a 20 20 69 66 28 20 61 5b 30  ogEst;.  if( a[0
1ba50 5d 3c 33 33 20 29 20 61 5b 30 5d 20 3d 20 33 33  ]<33 ) a[0] = 33
1ba60 3b 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  ;        assert(
1ba70 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   33==sqlite3LogE
1ba80 73 74 28 31 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  st(10) );..  /* 
1ba90 45 73 74 69 6d 61 74 65 20 74 68 61 74 20 61 5b  Estimate that a[
1baa0 31 5d 20 69 73 20 31 30 2c 20 61 5b 32 5d 20 69  1] is 10, a[2] i
1bab0 73 20 39 2c 20 61 5b 33 5d 20 69 73 20 38 2c 20  s 9, a[3] is 8, 
1bac0 61 5b 34 5d 20 69 73 20 37 2c 20 61 5b 35 5d 20  a[4] is 7, a[5] 
1bad0 69 73 0a 20 20 2a 2a 20 36 20 61 6e 64 20 65 61  is.  ** 6 and ea
1bae0 63 68 20 73 75 62 73 65 71 75 65 6e 74 20 76 61  ch subsequent va
1baf0 6c 75 65 20 28 69 66 20 61 6e 79 29 20 69 73 20  lue (if any) is 
1bb00 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  5.  */.  memcpy(
1bb10 26 61 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f  &a[1], aVal, nCo
1bb20 70 79 2a 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74  py*sizeof(LogEst
1bb30 29 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 70  ));.  for(i=nCop
1bb40 79 2b 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b  y+1; i<=pIdx->nK
1bb50 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  eyCol; i++){.   
1bb60 20 61 5b 69 5d 20 3d 20 32 33 3b 20 20 20 20 20   a[i] = 23;     
1bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1bb80 73 73 65 72 74 28 20 32 33 3d 3d 73 71 6c 69 74  ssert( 23==sqlit
1bb90 65 33 4c 6f 67 45 73 74 28 35 29 20 29 3b 0a 20  e3LogEst(5) );. 
1bba0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 30 3d   }..  assert( 0=
1bbb0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
1bbc0 29 20 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69  ) );.  if( IsUni
1bbd0 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29  queIndex(pIdx) )
1bbe0 20 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   a[pIdx->nKeyCol
1bbf0 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = 0;.}../*.** 
1bc00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
1bc10 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69  l drop an existi
1bc20 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20  ng named index. 
1bc30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
1bc40 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
1bc50 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65  DROP INDEX state
1bc60 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
1bc70 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50  lite3DropIndex(P
1bc80 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
1bc90 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e  cList *pName, in
1bca0 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49  t ifExists){.  I
1bcb0 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
1bcc0 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
1bcd0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1bce0 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
1bcf0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1bd00 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20  e->nErr==0 );   
1bd10 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20  /* Never called 
1bd20 77 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72  with prior error
1bd30 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d  s */.  if( db->m
1bd40 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
1bd50 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1bd60 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61  p_index;.  }.  a
1bd70 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
1bd80 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53  rc==1 );.  if( S
1bd90 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
1bda0 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
1bdb0 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  se) ){.    goto 
1bdc0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1bdd0 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20  .  }.  pIndex = 
1bde0 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
1bdf0 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  (db, pName->a[0]
1be00 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61  .zName, pName->a
1be10 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
1be20 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20    if( pIndex==0 
1be30 29 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45 78  ){.    if( !ifEx
1be40 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71  ists ){.      sq
1be50 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1be60 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69  arse, "no such i
1be70 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65  ndex: %S", pName
1be80 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
1be90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
1bea0 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68  deVerifyNamedSch
1beb0 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ema(pParse, pNam
1bec0 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
1bed0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  e);.    }.    pP
1bee0 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
1bef0 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  a = 1;.    goto 
1bf00 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1bf10 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65  .  }.  if( pInde
1bf20 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49  x->idxType!=SQLI
1bf30 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45  TE_IDXTYPE_APPDE
1bf40 46 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  F ){.    sqlite3
1bf50 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1bf60 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74   "index associat
1bf70 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22  ed with UNIQUE "
1bf80 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41  .      "or PRIMA
1bf90 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
1bfa0 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70  t cannot be drop
1bfb0 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f  ped", 0);.    go
1bfc0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1bfd0 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  ex;.  }.  iDb = 
1bfe0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
1bff0 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d  ndex(db, pIndex-
1c000 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64  >pSchema);.#ifnd
1c010 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1c020 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
1c030 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20  .    int code = 
1c040 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45  SQLITE_DROP_INDE
1c050 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  X;.    Table *pT
1c060 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61  ab = pIndex->pTa
1c070 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ble;.    const c
1c080 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
1c090 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
1c0a0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1c0b0 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42  Tab = SCHEMA_TAB
1c0c0 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69 66 28  LE(iDb);.    if(
1c0d0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1c0e0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1c0f0 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30  _DELETE, zTab, 0
1c100 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
1c110 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
1c120 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
1c130 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
1c140 20 26 26 20 69 44 62 20 29 20 63 6f 64 65 20 3d   && iDb ) code =
1c150 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
1c160 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
1c170 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1c180 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
1c190 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70  pIndex->zName, p
1c1a0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  Tab->zName, zDb)
1c1b0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
1c1c0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1c1d0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1c1e0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1c1f0 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
1c200 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f  he index and fro
1c210 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
1c220 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  le */.  v = sqli
1c230 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1c240 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
1c250 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
1c260 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
1c270 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20  arse, 1, iDb);. 
1c280 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
1c290 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
1c2a0 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
1c2b0 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61  M %Q.%s WHERE na
1c2c0 6d 65 3d 25 51 20 41 4e 44 20 74 79 70 65 3d 27  me=%Q AND type='
1c2d0 69 6e 64 65 78 27 22 2c 0a 20 20 20 20 20 20 20  index'",.       
1c2e0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
1c2f0 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
1c300 28 69 44 62 29 2c 20 70 49 6e 64 65 78 2d 3e 7a  (iDb), pIndex->z
1c310 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  Name.    );.    
1c320 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74  sqlite3ClearStat
1c330 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69  Tables(pParse, i
1c340 44 62 2c 20 22 69 64 78 22 2c 20 70 49 6e 64 65  Db, "idx", pInde
1c350 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  x->zName);.    s
1c360 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
1c370 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
1c380 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  .    destroyRoot
1c390 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Page(pParse, pIn
1c3a0 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  dex->tnum, iDb);
1c3b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1c3c0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f  AddOp4(v, OP_Dro
1c3d0 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20  pIndex, iDb, 0, 
1c3e0 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  0, pIndex->zName
1c3f0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f  , 0);.  }..exit_
1c400 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71  drop_index:.  sq
1c410 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1c420 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d  te(db, pName);.}
1c430 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69  ../*.** pArray i
1c440 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
1c450 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63  n array of objec
1c460 74 73 2e 20 45 61 63 68 20 6f 62 6a 65 63 74 20  ts. Each object 
1c470 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20  in the.** array 
1c480 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74 65 73  is szEntry bytes
1c490 20 69 6e 20 73 69 7a 65 2e 20 54 68 69 73 20 72   in size. This r
1c4a0 6f 75 74 69 6e 65 20 75 73 65 73 20 73 71 6c 69  outine uses sqli
1c4b0 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 29 0a 2a  te3DbRealloc().*
1c4c0 2a 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20  * to extend the 
1c4d0 61 72 72 61 79 20 73 6f 20 74 68 61 74 20 74 68  array so that th
1c4e0 65 72 65 20 69 73 20 73 70 61 63 65 20 66 6f 72  ere is space for
1c4f0 20 61 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 74   a new object at
1c500 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20   the end..**.** 
1c510 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
1c520 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70  on is called, *p
1c530 6e 45 6e 74 72 79 20 63 6f 6e 74 61 69 6e 73 20  nEntry contains 
1c540 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
1c550 20 6f 66 0a 2a 2a 20 74 68 65 20 61 72 72 61 79   of.** the array
1c560 20 28 69 6e 20 65 6e 74 72 69 65 73 20 2d 20 73   (in entries - s
1c570 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  o the allocation
1c580 20 69 73 20 28 28 2a 70 6e 45 6e 74 72 79 29 20   is ((*pnEntry) 
1c590 2a 20 73 7a 45 6e 74 72 79 29 20 62 79 74 65 73  * szEntry) bytes
1c5a0 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a  .** in total)..*
1c5b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 61 6c  *.** If the real
1c5c0 6c 6f 63 28 29 20 69 73 20 73 75 63 63 65 73 73  loc() is success
1c5d0 66 75 6c 20 28 69 2e 65 2e 20 69 66 20 6e 6f 20  ful (i.e. if no 
1c5e0 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 63  OOM condition oc
1c5f0 63 75 72 73 29 2c 20 74 68 65 0a 2a 2a 20 73 70  curs), the.** sp
1c600 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
1c610 72 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  r the new object
1c620 20 69 73 20 7a 65 72 6f 65 64 2c 20 2a 70 6e 45   is zeroed, *pnE
1c630 6e 74 72 79 20 75 70 64 61 74 65 64 20 74 6f 0a  ntry updated to.
1c640 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 65 20 6e  ** reflect the n
1c650 65 77 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  ew size of the a
1c660 72 72 61 79 20 61 6e 64 20 61 20 70 6f 69 6e 74  rray and a point
1c670 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 61 6c  er to the new al
1c680 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 72 65 74 75  location.** retu
1c690 72 6e 65 64 2e 20 2a 70 49 64 78 20 69 73 20 73  rned. *pIdx is s
1c6a0 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  et to the index 
1c6b0 6f 66 20 74 68 65 20 6e 65 77 20 61 72 72 61 79  of the new array
1c6c0 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20 63   entry in this c
1c6d0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ase..**.** Other
1c6e0 77 69 73 65 2c 20 69 66 20 74 68 65 20 72 65 61  wise, if the rea
1c6f0 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2c 20 2a 70  lloc() fails, *p
1c700 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 2d 31  Idx is set to -1
1c710 2c 20 2a 70 6e 45 6e 74 72 79 20 72 65 6d 61 69  , *pnEntry remai
1c720 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20  ns.** unchanged 
1c730 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 70 41  and a copy of pA
1c740 72 72 61 79 20 72 65 74 75 72 6e 65 64 2e 0a 2a  rray returned..*
1c750 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 41  /.void *sqlite3A
1c760 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
1c770 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1c780 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
1c790 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c  to notify of mal
1c7a0 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a  loc failures */.
1c7b0 20 20 76 6f 69 64 20 2a 70 41 72 72 61 79 2c 20    void *pArray, 
1c7c0 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
1c7d0 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67 68 74 20  objects.  Might 
1c7e0 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a  be reallocated *
1c7f0 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c  /.  int szEntry,
1c800 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1c810 20 65 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20   each object in 
1c820 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  the array */.  i
1c830 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20  nt *pnEntry,    
1c840 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62   /* Number of ob
1c850 6a 65 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20  jects currently 
1c860 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  in use */.  int 
1c870 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a  *pIdx         /*
1c880 20 57 72 69 74 65 20 74 68 65 20 69 6e 64 65 78   Write the index
1c890 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68   of a new slot h
1c8a0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ere */.){.  char
1c8b0 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 2a   *z;.  int n = *
1c8c0 70 6e 45 6e 74 72 79 3b 0a 20 20 69 66 28 20 28  pnEntry;.  if( (
1c8d0 6e 20 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29 7b  n & (n-1))==0 ){
1c8e0 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 28 6e  .    int sz = (n
1c8f0 3d 3d 30 29 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a  ==0) ? 1 : 2*n;.
1c900 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d      void *pNew =
1c910 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
1c920 63 28 64 62 2c 20 70 41 72 72 61 79 2c 20 73 7a  c(db, pArray, sz
1c930 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69  *szEntry);.    i
1c940 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
1c950 20 20 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a      *pIdx = -1;.
1c960 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 72        return pAr
1c970 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ray;.    }.    p
1c980 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20  Array = pNew;.  
1c990 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70  }.  z = (char*)p
1c9a0 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28  Array;.  memset(
1c9b0 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72 79 5d 2c  &z[n * szEntry],
1c9c0 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20   0, szEntry);.  
1c9d0 2a 70 49 64 78 20 3d 20 6e 3b 0a 20 20 2b 2b 2a  *pIdx = n;.  ++*
1c9e0 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74 75 72  pnEntry;.  retur
1c9f0 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a  n pArray;.}../*.
1ca00 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
1ca10 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67  element to the g
1ca20 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72  iven IdList.  Cr
1ca30 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73  eate a new IdLis
1ca40 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e  t if.** need be.
1ca50 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c  .**.** A new IdL
1ca60 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ist is returned,
1ca70 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c   or NULL if mall
1ca80 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49  oc() fails..*/.I
1ca90 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64  dList *sqlite3Id
1caa0 4c 69 73 74 41 70 70 65 6e 64 28 73 71 6c 69 74  ListAppend(sqlit
1cab0 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a  e3 *db, IdList *
1cac0 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
1cad0 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  oken){.  int i;.
1cae0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1caf0 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
1cb00 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
1cb10 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c  o(db, sizeof(IdL
1cb20 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
1cb30 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1cb40 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
1cb50 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 41 72 72  ->a = sqlite3Arr
1cb60 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
1cb70 20 20 64 62 2c 0a 20 20 20 20 20 20 70 4c 69 73    db,.      pLis
1cb80 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65  t->a,.      size
1cb90 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c  of(pList->a[0]),
1cba0 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e  .      &pList->n
1cbb0 49 64 2c 0a 20 20 20 20 20 20 26 69 0a 20 20 29  Id,.      &i.  )
1cbc0 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20  ;.  if( i<0 ){. 
1cbd0 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
1cbe0 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
1cbf0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
1cc00 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b  .  }.  pList->a[
1cc10 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
1cc20 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1cc30 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 72  db, pToken);.  r
1cc40 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
1cc50 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
1cc60 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  IdList..*/.void 
1cc70 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
1cc80 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
1cc90 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b   IdList *pList){
1cca0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1ccb0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1ccc0 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
1ccd0 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
1cce0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
1ccf0 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  ree(db, pList->a
1cd00 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
1cd10 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1cd20 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20  db, pList->a);. 
1cd30 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1cd40 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  b, pList);.}../*
1cd50 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
1cd60 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66  ndex in pList of
1cd70 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 20   the identifier 
1cd80 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75  named zId.  Retu
1cd90 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20  rn -1.** if not 
1cda0 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  found..*/.int sq
1cdb0 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
1cdc0 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  (IdList *pList, 
1cdd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1cde0 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  e){.  int i;.  i
1cdf0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1ce00 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69  turn -1;.  for(i
1ce10 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
1ce20 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1ce30 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1ce40 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1ce50 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65  , zName)==0 ) re
1ce60 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
1ce70 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
1ce80 2a 20 45 78 70 61 6e 64 20 74 68 65 20 73 70 61  * Expand the spa
1ce90 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
1cea0 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69   the given SrcLi
1ceb0 73 74 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a 20  st object by.** 
1cec0 63 72 65 61 74 69 6e 67 20 6e 45 78 74 72 61 20  creating nExtra 
1ced0 6e 65 77 20 73 6c 6f 74 73 20 62 65 67 69 6e 6e  new slots beginn
1cee0 69 6e 67 20 61 74 20 69 53 74 61 72 74 2e 20 20  ing at iStart.  
1cef0 69 53 74 61 72 74 20 69 73 20 7a 65 72 6f 20 62  iStart is zero b
1cf00 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f  ased..** New slo
1cf10 74 73 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  ts are zeroed..*
1cf20 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
1cf30 2c 20 73 75 70 70 6f 73 65 20 61 20 53 72 63 4c  , suppose a SrcL
1cf40 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f  ist initially co
1cf50 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e 74 72 69  ntains two entri
1cf60 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61  es: A,B..** To a
1cf70 70 70 65 6e 64 20 33 20 6e 65 77 20 65 6e 74 72  ppend 3 new entr
1cf80 69 65 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ies onto the end
1cf90 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  , do this:.**.**
1cfa0 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
1cfb0 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53  stEnlarge(db, pS
1cfc0 72 63 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a 2a  rclist, 3, 2);.*
1cfd0 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 63  *.** After the c
1cfe0 61 6c 6c 20 61 62 6f 76 65 20 69 74 20 77 6f 75  all above it wou
1cff0 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c 20  ld contain:  A, 
1d000 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c  B, nil, nil, nil
1d010 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 53 74 61  ..** If the iSta
1d020 72 74 20 61 72 67 75 6d 65 6e 74 20 68 61 64 20  rt argument had 
1d030 62 65 65 6e 20 31 20 69 6e 73 74 65 61 64 20 6f  been 1 instead o
1d040 66 20 32 2c 20 74 68 65 6e 20 74 68 65 20 72 65  f 2, then the re
1d050 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68 61  sult.** would ha
1d060 76 65 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69 6c  ve been:  A, nil
1d070 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20  , nil, nil, B.  
1d080 54 6f 20 70 72 65 70 65 6e 64 20 74 68 65 20 6e  To prepend the n
1d090 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65  ew slots,.** the
1d0a0 20 69 53 74 61 72 74 20 76 61 6c 75 65 20 77 6f   iStart value wo
1d0b0 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20 72  uld be 0.  The r
1d0c0 65 73 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c 64  esult then would
1d0d0 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c  .** be: nil, nil
1d0e0 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a  , nil, A, B..**.
1d0f0 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
1d100 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 20  llocation fails 
1d110 74 68 65 20 53 72 63 4c 69 73 74 20 69 73 20 75  the SrcList is u
1d120 6e 63 68 61 6e 67 65 64 2e 20 20 54 68 65 0a 2a  nchanged.  The.*
1d130 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  * db->mallocFail
1d140 65 64 20 66 6c 61 67 20 77 69 6c 6c 20 62 65 20  ed flag will be 
1d150 73 65 74 20 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a  set to true..*/.
1d160 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
1d170 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 0a  SrcListEnlarge(.
1d180 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
1d190 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1d1a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e   connection to n
1d1b0 6f 74 69 66 79 20 6f 66 20 4f 4f 4d 20 65 72 72  otify of OOM err
1d1c0 6f 72 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ors */.  SrcList
1d1d0 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54   *pSrc,     /* T
1d1e0 68 65 20 53 72 63 4c 69 73 74 20 74 6f 20 62 65  he SrcList to be
1d1f0 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 69   enlarged */.  i
1d200 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20  nt nExtra,      
1d210 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
1d220 65 77 20 73 6c 6f 74 73 20 74 6f 20 61 64 64 20  ew slots to add 
1d230 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a  to pSrc->a[] */.
1d240 20 20 69 6e 74 20 69 53 74 61 72 74 20 20 20 20    int iStart    
1d250 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
1d260 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66 69   pSrc->a[] of fi
1d270 72 73 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a  rst new slot */.
1d280 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  ){.  int i;..  /
1d290 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
1d2a0 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61 72  g on calling par
1d2b0 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73 73  ameters */.  ass
1d2c0 65 72 74 28 20 69 53 74 61 72 74 3e 3d 30 20 29  ert( iStart>=0 )
1d2d0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78 74  ;.  assert( nExt
1d2e0 72 61 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ra>=1 );.  asser
1d2f0 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  t( pSrc!=0 );.  
1d300 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d  assert( iStart<=
1d310 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20  pSrc->nSrc );.. 
1d320 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64 64   /* Allocate add
1d330 69 74 69 6f 6e 61 6c 20 73 70 61 63 65 20 69 66  itional space if
1d340 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69 66 28   needed */.  if(
1d350 20 28 75 33 32 29 70 53 72 63 2d 3e 6e 53 72 63   (u32)pSrc->nSrc
1d360 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41  +nExtra>pSrc->nA
1d370 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c  lloc ){.    SrcL
1d380 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69  ist *pNew;.    i
1d390 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72 63  nt nAlloc = pSrc
1d3a0 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a 20  ->nSrc+nExtra;. 
1d3b0 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20 20     int nGot;.   
1d3c0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
1d3d0 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72  bRealloc(db, pSr
1d3e0 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  c,.             
1d3f0 20 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 20    sizeof(*pSrc) 
1d400 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a  + (nAlloc-1)*siz
1d410 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20  eof(pSrc->a[0]) 
1d420 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
1d430 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
1d440 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
1d450 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65  iled );.      re
1d460 74 75 72 6e 20 70 53 72 63 3b 0a 20 20 20 20 7d  turn pSrc;.    }
1d470 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77  .    pSrc = pNew
1d480 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20 28 73 71  ;.    nGot = (sq
1d490 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
1d4a0 65 28 64 62 2c 20 70 4e 65 77 29 20 2d 20 73 69  e(db, pNew) - si
1d4b0 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f 73 69 7a  zeof(*pSrc))/siz
1d4c0 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2b  eof(pSrc->a[0])+
1d4d0 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c  1;.    pSrc->nAl
1d4e0 6c 6f 63 20 3d 20 6e 47 6f 74 3b 0a 20 20 7d 0a  loc = nGot;.  }.
1d4f0 0a 20 20 2f 2a 20 4d 6f 76 65 20 65 78 69 73 74  .  /* Move exist
1d500 69 6e 67 20 73 6c 6f 74 73 20 74 68 61 74 20 63  ing slots that c
1d510 6f 6d 65 20 61 66 74 65 72 20 74 68 65 20 6e 65  ome after the ne
1d520 77 6c 79 20 69 6e 73 65 72 74 65 64 20 73 6c 6f  wly inserted slo
1d530 74 73 0a 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74  ts.  ** out of t
1d540 68 65 20 77 61 79 20 2a 2f 0a 20 20 66 6f 72 28  he way */.  for(
1d550 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20  i=pSrc->nSrc-1; 
1d560 69 3e 3d 69 53 74 61 72 74 3b 20 69 2d 2d 29 7b  i>=iStart; i--){
1d570 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 6e  .    pSrc->a[i+n
1d580 45 78 74 72 61 5d 20 3d 20 70 53 72 63 2d 3e 61  Extra] = pSrc->a
1d590 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d  [i];.  }.  pSrc-
1d5a0 3e 6e 53 72 63 20 2b 3d 20 6e 45 78 74 72 61 3b  >nSrc += nExtra;
1d5b0 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20  ..  /* Zero the 
1d5c0 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  newly allocated 
1d5d0 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65  slots */.  memse
1d5e0 74 28 26 70 53 72 63 2d 3e 61 5b 69 53 74 61 72  t(&pSrc->a[iStar
1d5f0 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  t], 0, sizeof(pS
1d600 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61  rc->a[0])*nExtra
1d610 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53 74 61 72  );.  for(i=iStar
1d620 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e 45 78 74  t; i<iStart+nExt
1d630 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53  ra; i++){.    pS
1d640 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  rc->a[i].iCursor
1d650 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
1d660 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1d670 72 20 74 6f 20 74 68 65 20 65 6e 6c 61 72 67 65  r to the enlarge
1d680 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72  d SrcList */.  r
1d690 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a  eturn pSrc;.}...
1d6a0 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
1d6b0 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  ew table name to
1d6c0 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69   the given SrcLi
1d6d0 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
1d6e0 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20  w SrcList if.** 
1d6f0 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20  need be.  A new 
1d700 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64  entry is created
1d710 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
1d720 65 76 65 6e 20 69 66 20 70 54 61 62 6c 65 20 69  even if pTable i
1d730 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20  s NULL..**.** A 
1d740 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75 72  SrcList is retur
1d750 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ned, or NULL if 
1d760 74 68 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20  there is an OOM 
1d770 65 72 72 6f 72 2e 20 20 54 68 65 20 72 65 74 75  error.  The retu
1d780 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20  rned.** SrcList 
1d790 6d 69 67 68 74 20 62 65 20 74 68 65 20 73 61 6d  might be the sam
1d7a0 65 20 61 73 20 74 68 65 20 53 72 63 4c 69 73 74  e as the SrcList
1d7b0 20 74 68 61 74 20 77 61 73 20 69 6e 70 75 74 20   that was input 
1d7c0 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a  or it might be.*
1d7d0 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66  * a new one.  If
1d7e0 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f   an OOM error do
1d7f0 65 73 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  es occurs, then 
1d800 74 68 65 20 70 72 69 6f 72 20 76 61 6c 75 65 20  the prior value 
1d810 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74  of pList.** that
1d820 20 69 73 20 69 6e 70 75 74 20 74 6f 20 74 68 69   is input to thi
1d830 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 75 74  s routine is aut
1d840 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72 65 65 64  omatically freed
1d850 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61  ..**.** If pData
1d860 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  base is not null
1d870 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
1d880 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e  the table has an
1d890 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74   optional.** dat
1d8a0 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69  abase name prefi
1d8b0 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20  x.  Like this:  
1d8c0 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22  "database.table"
1d8d0 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65  .  The pDatabase
1d8e0 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  .** points to th
1d8f0 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
1d900 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e   the pTable poin
1d910 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ts to the databa
1d920 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20  se name..** The 
1d930 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d  SrcList.a[].zNam
1d940 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65  e field is fille
1d950 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
1d960 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68   name which migh
1d970 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70  t.** come from p
1d980 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62  Table (if pDatab
1d990 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20  ase is NULL) or 
1d9a0 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20  from pDatabase. 
1d9b0 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d   .** SrcList.a[]
1d9c0 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69  .zDatabase is fi
1d9d0 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61  lled with the da
1d9e0 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d  tabase name from
1d9f0 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77   pTable,.** or w
1da00 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64  ith NULL if no d
1da10 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69  atabase is speci
1da20 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  fied..**.** In o
1da30 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63  ther words, if c
1da40 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  all like this:.*
1da50 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c  *.**         sql
1da60 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
1da70 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a  d(D,A,B,0);.**.*
1da80 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74 61  * Then B is a ta
1da90 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
1daa0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69   database name i
1dab0 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20  s unspecified.  
1dac0 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b  If called.** lik
1dad0 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
1dae0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
1daf0 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42  ListAppend(D,A,B
1db00 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ,C);.**.** Then 
1db10 43 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e  C is the table n
1db20 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68 65  ame and B is the
1db30 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 20   database name. 
1db40 20 49 66 20 43 20 69 73 20 64 65 66 69 6e 65 64   If C is defined
1db50 0a 2a 2a 20 74 68 65 6e 20 73 6f 20 69 73 20 42  .** then so is B
1db60 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1db70 73 2c 20 77 65 20 6e 65 76 65 72 20 68 61 76 65  s, we never have
1db80 20 61 20 63 61 73 65 20 77 68 65 72 65 3a 0a 2a   a case where:.*
1db90 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c  *.**         sql
1dba0 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
1dbb0 64 28 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a  d(D,A,0,C);.**.*
1dbc0 2a 20 42 6f 74 68 20 70 54 61 62 6c 65 20 61 6e  * Both pTable an
1dbd0 64 20 70 44 61 74 61 62 61 73 65 20 61 72 65 20  d pDatabase are 
1dbe0 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 71 75  assumed to be qu
1dbf0 6f 74 65 64 2e 20 20 54 68 65 79 20 61 72 65 20  oted.  They are 
1dc00 64 65 71 75 6f 74 65 64 0a 2a 2a 20 62 65 66 6f  dequoted.** befo
1dc10 72 65 20 62 65 69 6e 67 20 61 64 64 65 64 20 74  re being added t
1dc20 6f 20 74 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a  o the SrcList..*
1dc30 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
1dc40 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
1dc50 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1dc60 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
1dc70 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f  tion to notify o
1dc80 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  f malloc failure
1dc90 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  s */.  SrcList *
1dca0 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 41 70  pList,     /* Ap
1dcb0 70 65 6e 64 20 74 6f 20 74 68 69 73 20 53 72 63  pend to this Src
1dcc0 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74  List. NULL creat
1dcd0 65 73 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  es a new SrcList
1dce0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
1dcf0 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 61 62  ble,      /* Tab
1dd00 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a  le to append */.
1dd10 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61    Token *pDataba
1dd20 73 65 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  se    /* Databas
1dd30 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  e of the table *
1dd40 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  /.){.  struct Sr
1dd50 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1dd60 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 61  m;.  assert( pDa
1dd70 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61  tabase==0 || pTa
1dd80 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61  ble!=0 );  /* Ca
1dd90 6e 6e 6f 74 20 68 61 76 65 20 43 20 77 69 74 68  nnot have C with
1dda0 6f 75 74 20 42 20 2a 2f 0a 20 20 69 66 28 20 70  out B */.  if( p
1ddb0 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
1ddc0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
1ddd0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
1dde0 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29  izeof(SrcList) )
1ddf0 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
1de00 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1de10 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
1de20 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 69 73   = 1;.  }.  pLis
1de30 74 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  t = sqlite3SrcLi
1de40 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 4c  stEnlarge(db, pL
1de50 69 73 74 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e  ist, 1, pList->n
1de60 53 72 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  Src);.  if( db->
1de70 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1de80 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
1de90 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
1dea0 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  st);.    return 
1deb0 30 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d  0;.  }.  pItem =
1dec0 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
1ded0 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28  ->nSrc-1];.  if(
1dee0 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70 44   pDatabase && pD
1def0 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b  atabase->z==0 ){
1df00 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
1df10 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44   0;.  }.  if( pD
1df20 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20 54  atabase ){.    T
1df30 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44  oken *pTemp = pD
1df40 61 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61  atabase;.    pDa
1df50 74 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b  tabase = pTable;
1df60 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54  .    pTable = pT
1df70 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  emp;.  }.  pItem
1df80 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
1df90 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
1dfa0 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 70 49  b, pTable);.  pI
1dfb0 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
1dfc0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1dfd0 54 6f 6b 65 6e 28 64 62 2c 20 70 44 61 74 61 62  Token(db, pDatab
1dfe0 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ase);.  return p
1dff0 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  List;.}../*.** A
1e000 73 73 69 67 6e 20 56 64 62 65 43 75 72 73 6f 72  ssign VdbeCursor
1e010 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 73 20 74   index numbers t
1e020 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  o all tables in 
1e030 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69  a SrcList.*/.voi
1e040 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
1e050 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61  AssignCursors(Pa
1e060 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
1e070 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
1e080 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1e090 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1e0a0 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 70 4c  tem;.  assert(pL
1e0b0 69 73 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  ist || pParse->d
1e0c0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1e0d0 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
1e0e0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  {.    for(i=0, p
1e0f0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
1e100 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
1e110 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
1e120 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43     if( pItem->iC
1e130 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b  ursor>=0 ) break
1e140 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69  ;.      pItem->i
1e150 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
1e160 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69  >nTab++;.      i
1e170 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
1e180 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
1e190 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
1e1a0 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
1e1b0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d   pItem->pSelect-
1e1c0 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  >pSrc);.      }.
1e1d0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1e1e0 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
1e1f0 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c  ire SrcList incl
1e200 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75  uding all its su
1e210 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76  bstructure..*/.v
1e220 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
1e230 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  stDelete(sqlite3
1e240 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
1e250 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
1e260 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1e270 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1e280 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1e290 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74  eturn;.  for(pIt
1e2a0 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
1e2b0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
1e2c0 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
1e2d0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1e2e0 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61  e(db, pItem->zDa
1e2f0 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c  tabase);.    sql
1e300 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1e310 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
1e320 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1e330 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  db, pItem->zAlia
1e340 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  s);.    sqlite3D
1e350 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
1e360 3e 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20  >zIndexedBy);.  
1e370 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
1e380 61 62 6c 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  able(db, pItem->
1e390 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  pTab);.    sqlit
1e3a0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
1e3b0 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  b, pItem->pSelec
1e3c0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
1e3d0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49  xprDelete(db, pI
1e3e0 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73  tem->pOn);.    s
1e3f0 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
1e400 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55  te(db, pItem->pU
1e410 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sing);.  }.  sql
1e420 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1e430 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
1e440 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1e450 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
1e460 72 73 65 72 20 74 6f 20 61 64 64 20 61 20 6e 65  rser to add a ne
1e470 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a  w term to the.**
1e480 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77 69 6e   end of a growin
1e490 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  g FROM clause.  
1e4a0 54 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  The "p" paramete
1e4b0 72 20 69 73 20 74 68 65 20 70 61 72 74 20 6f 66  r is the part of
1e4c0 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  .** the FROM cla
1e4d0 75 73 65 20 74 68 61 74 20 68 61 73 20 61 6c 72  use that has alr
1e4e0 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73 74 72  eady been constr
1e4f0 75 63 74 65 64 2e 20 20 22 70 22 20 69 73 20 4e  ucted.  "p" is N
1e500 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69  ULL.** if this i
1e510 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
1e520 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1e530 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61 6e 64  use.  pTable and
1e540 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 61 72   pDatabase.** ar
1e550 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
1e560 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61 74 61  e table and data
1e570 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20 74 68  base named in th
1e580 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
1e590 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73 65  rm..** pDatabase
1e5a0 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   is NULL if the 
1e5b0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 71 75  database name qu
1e5c0 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73 73 69  alifier is missi
1e5d0 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61  ng - the.** usua
1e5e0 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68 65 20  l case.  If the 
1e5f0 74 65 72 6d 20 68 61 73 20 61 6e 20 61 6c 69 61  term has an alia
1e600 73 2c 20 74 68 65 6e 20 70 41 6c 69 61 73 20 70  s, then pAlias p
1e610 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
1e620 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66  alias token.  If
1e630 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 20 73   the term is a s
1e640 75 62 71 75 65 72 79 2c 20 74 68 65 6e 20 70 53  ubquery, then pS
1e650 75 62 71 75 65 72 79 20 69 73 20 74 68 65 0a 2a  ubquery is the.*
1e660 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
1e670 6e 74 20 74 68 61 74 20 74 68 65 20 73 75 62 71  nt that the subq
1e680 75 65 72 79 20 65 6e 63 6f 64 65 73 2e 20 20 54  uery encodes.  T
1e690 68 65 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a  he pTable and.**
1e6a0 20 70 44 61 74 61 62 61 73 65 20 70 61 72 61 6d   pDatabase param
1e6b0 65 74 65 72 73 20 61 72 65 20 4e 55 4c 4c 20 66  eters are NULL f
1e6c0 6f 72 20 73 75 62 71 75 65 72 69 65 73 2e 20 20  or subqueries.  
1e6d0 54 68 65 20 70 4f 6e 20 61 6e 64 20 70 55 73 69  The pOn and pUsi
1e6e0 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  ng.** parameters
1e6f0 20 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74   are the content
1e700 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64 20 55   of the ON and U
1e710 53 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SING clauses..**
1e720 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 65 77  .** Return a new
1e730 20 53 72 63 4c 69 73 74 20 77 68 69 63 68 20 65   SrcList which e
1e740 6e 63 6f 64 65 73 20 69 73 20 74 68 65 20 46 52  ncodes is the FR
1e750 4f 4d 20 77 69 74 68 20 74 68 65 20 6e 65 77 0a  OM with the new.
1e760 2a 2a 20 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a  ** term added..*
1e770 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
1e780 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46  e3SrcListAppendF
1e790 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72 73 65  romTerm(.  Parse
1e7a0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1e7b0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1e7c0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
1e7d0 73 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  st *p,          
1e7e0 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 70     /* The left p
1e7f0 61 72 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  art of the FROM 
1e800 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 73  clause already s
1e810 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  een */.  Token *
1e820 70 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  pTable,         
1e830 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1e840 74 61 62 6c 65 20 74 6f 20 61 64 64 20 74 6f 20  table to add to 
1e850 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1e860 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74  */.  Token *pDat
1e870 61 62 61 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  abase,       /* 
1e880 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
1e890 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
1e8a0 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65  pTable */.  Toke
1e8b0 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20 20 20 20  n *pAlias,      
1e8c0 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
1e8d0 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
1e8e0 65 20 41 53 20 73 75 62 65 78 70 72 65 73 73 69  e AS subexpressi
1e8f0 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
1e900 70 53 75 62 71 75 65 72 79 2c 20 20 20 20 20 20  pSubquery,      
1e910 2f 2a 20 41 20 73 75 62 71 75 65 72 79 20 75 73  /* A subquery us
1e920 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61  ed in place of a
1e930 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   table name */. 
1e940 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20   Expr *pOn,     
1e950 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e960 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a  ON clause of a j
1e970 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20  oin */.  IdList 
1e980 2a 70 55 73 69 6e 67 20 20 20 20 20 20 20 20 20  *pUsing         
1e990 20 2f 2a 20 54 68 65 20 55 53 49 4e 47 20 63 6c   /* The USING cl
1e9a0 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a  ause of a join *
1e9b0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  /.){.  struct Sr
1e9c0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1e9d0 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
1e9e0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1e9f0 20 69 66 28 20 21 70 20 26 26 20 28 70 4f 6e 20   if( !p && (pOn 
1ea00 7c 7c 20 70 55 73 69 6e 67 29 20 29 7b 0a 20 20  || pUsing) ){.  
1ea10 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1ea20 67 28 70 50 61 72 73 65 2c 20 22 61 20 4a 4f 49  g(pParse, "a JOI
1ea30 4e 20 63 6c 61 75 73 65 20 69 73 20 72 65 71 75  N clause is requ
1ea40 69 72 65 64 20 62 65 66 6f 72 65 20 25 73 22 2c  ired before %s",
1ea50 20 0a 20 20 20 20 20 20 28 70 4f 6e 20 3f 20 22   .      (pOn ? "
1ea60 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22 29 0a 20  ON" : "USING"). 
1ea70 20 20 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61     );.    goto a
1ea80 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
1ea90 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69  ;.  }.  p = sqli
1eaa0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1eab0 28 64 62 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20  (db, p, pTable, 
1eac0 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  pDatabase);.  if
1ead0 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28  ( p==0 || NEVER(
1eae0 70 2d 3e 6e 53 72 63 3d 3d 30 29 20 29 7b 0a 20  p->nSrc==0) ){. 
1eaf0 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66     goto append_f
1eb00 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  rom_error;.  }. 
1eb10 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70   pItem = &p->a[p
1eb20 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 61 73 73  ->nSrc-1];.  ass
1eb30 65 72 74 28 20 70 41 6c 69 61 73 21 3d 30 20 29  ert( pAlias!=0 )
1eb40 3b 0a 20 20 69 66 28 20 70 41 6c 69 61 73 2d 3e  ;.  if( pAlias->
1eb50 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  n ){.    pItem->
1eb60 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33  zAlias = sqlite3
1eb70 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1eb80 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20  , pAlias);.  }. 
1eb90 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
1eba0 3d 20 70 53 75 62 71 75 65 72 79 3b 0a 20 20 70  = pSubquery;.  p
1ebb0 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b  Item->pOn = pOn;
1ebc0 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67  .  pItem->pUsing
1ebd0 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72 65 74   = pUsing;.  ret
1ebe0 75 72 6e 20 70 3b 0a 0a 20 61 70 70 65 6e 64 5f  urn p;.. append_
1ebf0 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 61 73  from_error:.  as
1ec00 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20  sert( p==0 );.  
1ec10 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1ec20 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20 20 73 71  e(db, pOn);.  sq
1ec30 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
1ec40 65 28 64 62 2c 20 70 55 73 69 6e 67 29 3b 0a 20  e(db, pUsing);. 
1ec50 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1ec60 6c 65 74 65 28 64 62 2c 20 70 53 75 62 71 75 65  lete(db, pSubque
1ec70 72 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  ry);.  return 0;
1ec80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
1ec90 20 49 4e 44 45 58 45 44 20 42 59 20 6f 72 20 4e   INDEXED BY or N
1eca0 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
1ecb0 65 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72 65  e to the most re
1ecc0 63 65 6e 74 6c 79 20 61 64 64 65 64 20 0a 2a 2a  cently added .**
1ecd0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
1ece0 73 6f 75 72 63 65 2d 6c 69 73 74 20 70 61 73 73  source-list pass
1ecf0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
1ed00 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f   argument..*/.vo
1ed10 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
1ed20 74 49 6e 64 65 78 65 64 42 79 28 50 61 72 73 65  tIndexedBy(Parse
1ed30 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
1ed40 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e  t *p, Token *pIn
1ed50 64 65 78 65 64 42 79 29 7b 0a 20 20 61 73 73 65  dexedBy){.  asse
1ed60 72 74 28 20 70 49 6e 64 65 78 65 64 42 79 21 3d  rt( pIndexedBy!=
1ed70 30 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  0 );.  if( p && 
1ed80 41 4c 57 41 59 53 28 70 2d 3e 6e 53 72 63 3e 30  ALWAYS(p->nSrc>0
1ed90 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ) ){.    struct 
1eda0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1edb0 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e  tem = &p->a[p->n
1edc0 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  Src-1];.    asse
1edd0 72 74 28 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e  rt( pItem->notIn
1ede0 64 65 78 65 64 3d 3d 30 20 26 26 20 70 49 74 65  dexed==0 && pIte
1edf0 6d 2d 3e 7a 49 6e 64 65 78 65 64 42 79 3d 3d 30  m->zIndexedBy==0
1ee00 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64   );.    if( pInd
1ee10 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20  exedBy->n==1 && 
1ee20 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29  !pIndexedBy->z )
1ee30 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f  {.      /* A "NO
1ee40 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75 73  T INDEXED" claus
1ee50 65 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e 20  e was supplied. 
1ee60 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20 20  See parse.y .   
1ee70 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20     ** construct 
1ee80 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66 6f  "indexed_opt" fo
1ee90 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20  r details. */.  
1eea0 20 20 20 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e      pItem->notIn
1eeb0 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  dexed = 1;.    }
1eec0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
1eed0 6d 2d 3e 7a 49 6e 64 65 78 65 64 42 79 20 3d 20  m->zIndexedBy = 
1eee0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1eef0 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
1ef00 20 70 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20   pIndexedBy);.  
1ef10 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1ef20 20 57 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 75   When building u
1ef30 70 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  p a FROM clause 
1ef40 69 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20 74  in the parser, t
1ef50 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
1ef60 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  .** is initially
1ef70 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
1ef80 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e 20 20   left operand.  
1ef90 42 75 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e  But the code gen
1efa0 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74  erator.** expect
1efb0 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  s the join opera
1efc0 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74 68 65  tor to be on the
1efd0 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 20   right operand. 
1efe0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
1eff0 20 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e   Shifts all join
1f000 20 6f 70 65 72 61 74 6f 72 73 20 66 72 6f 6d 20   operators from 
1f010 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 66 6f  left to right fo
1f020 72 20 61 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d  r an entire FROM
1f030 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  .** clause..**.*
1f040 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f  * Example: Suppo
1f050 73 65 20 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c  se the join is l
1f060 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1f070 20 20 20 20 20 20 20 20 20 20 41 20 6e 61 74 75            A natu
1f080 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42  ral cross join B
1f090 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61  .**.** The opera
1f0a0 74 6f 72 20 69 73 20 22 6e 61 74 75 72 61 6c 20  tor is "natural 
1f0b0 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68  cross join".  Th
1f0c0 65 20 41 20 61 6e 64 20 42 20 6f 70 65 72 61 6e  e A and B operan
1f0d0 64 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a  ds are stored.**
1f0e0 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20   in p->a[0] and 
1f0f0 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63 74  p->a[1], respect
1f100 69 76 65 6c 79 2e 20 20 54 68 65 20 70 61 72 73  ively.  The pars
1f110 65 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f  er initially sto
1f120 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61  res the.** opera
1f130 74 6f 72 20 77 69 74 68 20 41 2e 20 20 54 68 69  tor with A.  Thi
1f140 73 20 72 6f 75 74 69 6e 65 20 73 68 69 66 74 73  s routine shifts
1f150 20 74 68 61 74 20 6f 70 65 72 61 74 6f 72 20 6f   that operator o
1f160 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69  ver to B..*/.voi
1f170 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
1f180 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 53 72  ShiftJoinType(Sr
1f190 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69 66 28  cList *p){.  if(
1f1a0 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   p ){.    int i;
1f1b0 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53  .    for(i=p->nS
1f1c0 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  rc-1; i>0; i--){
1f1d0 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 6a  .      p->a[i].j
1f1e0 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69  ointype = p->a[i
1f1f0 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  -1].jointype;.  
1f200 20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e    }.    p->a[0].
1f210 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
1f220 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  }.}../*.** Begin
1f230 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
1f240 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65  /.void sqlite3Be
1f250 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  ginTransaction(P
1f260 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1f270 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74  t type){.  sqlit
1f280 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  e3 *db;.  Vdbe *
1f290 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  v;.  int i;..  a
1f2a0 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
1f2b0 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73   );.  db = pPars
1f2c0 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
1f2d0 20 64 62 21 3d 30 20 29 3b 0a 2f 2a 20 20 69 66   db!=0 );./*  if
1f2e0 28 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  ( db->aDb[0].pBt
1f2f0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 2a 2f  ==0 ) return; */
1f300 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
1f310 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1f320 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
1f330 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20  ON, "BEGIN", 0, 
1f340 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1f350 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69  ;.  }.  v = sqli
1f360 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1f370 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72  e);.  if( !v ) r
1f380 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70  eturn;.  if( typ
1f390 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29  e!=TK_DEFERRED )
1f3a0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
1f3b0 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
1f3c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f3d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72  eAddOp2(v, OP_Tr
1f3e0 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74  ansaction, i, (t
1f3f0 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56  ype==TK_EXCLUSIV
1f400 45 29 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  E)+1);.      sql
1f410 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
1f420 65 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  e(v, i);.    }. 
1f430 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
1f440 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74  AddOp2(v, OP_Aut
1f450 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a  oCommit, 0, 0);.
1f460 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
1f470 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
1f480 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
1f490 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  mitTransaction(P
1f4a0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
1f4b0 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73   Vdbe *v;..  ass
1f4c0 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29  ert( pParse!=0 )
1f4d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
1f4e0 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69  se->db!=0 );.  i
1f4f0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1f500 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1f510 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
1f520 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20  "COMMIT", 0, 0) 
1f530 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
1f540 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33   }.  v = sqlite3
1f550 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1f560 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
1f570 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f580 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  2(v, OP_AutoComm
1f590 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d  it, 1, 0);.  }.}
1f5a0 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
1f5b0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
1f5c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
1f5d0 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f  llbackTransactio
1f5e0 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
1f5f0 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  {.  Vdbe *v;..  
1f600 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d  assert( pParse!=
1f610 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1f620 50 61 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a  Parse->db!=0 );.
1f630 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
1f640 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1f650 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
1f660 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30  N, "ROLLBACK", 0
1f670 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , 0) ){.    retu
1f680 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71  rn;.  }.  v = sq
1f690 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1f6a0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
1f6b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1f6c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74  AddOp2(v, OP_Aut
1f6d0 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a  oCommit, 1, 1);.
1f6e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
1f6f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1f700 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
1f710 65 72 20 77 68 65 6e 20 69 74 20 70 61 72 73 65  er when it parse
1f720 73 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 63  s a command to c
1f730 72 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61 73  reate,.** releas
1f740 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  e or rollback an
1f750 20 53 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e 20   SQL savepoint. 
1f760 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1f770 53 61 76 65 70 6f 69 6e 74 28 50 61 72 73 65 20  Savepoint(Parse 
1f780 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c  *pParse, int op,
1f790 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
1f7a0 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
1f7b0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1f7c0 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
1f7d0 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a   pName);.  if( z
1f7e0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65  Name ){.    Vdbe
1f7f0 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
1f800 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 23 69  Vdbe(pParse);.#i
1f810 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f820 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
1f830 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1f840 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a   char * const az
1f850 5b 5d 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20  [] = { "BEGIN", 
1f860 22 52 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c  "RELEASE", "ROLL
1f870 42 41 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73  BACK" };.    ass
1f880 65 72 74 28 20 21 53 41 56 45 50 4f 49 4e 54 5f  ert( !SAVEPOINT_
1f890 42 45 47 49 4e 20 26 26 20 53 41 56 45 50 4f 49  BEGIN && SAVEPOI
1f8a0 4e 54 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26 26  NT_RELEASE==1 &&
1f8b0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
1f8c0 41 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66  ACK==2 );.#endif
1f8d0 0a 20 20 20 20 69 66 28 20 21 76 20 7c 7c 20 73  .    if( !v || s
1f8e0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1f8f0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
1f900 41 56 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d  AVEPOINT, az[op]
1f910 2c 20 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20  , zName, 0) ){. 
1f920 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
1f930 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  ee(pParse->db, z
1f940 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
1f950 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  urn;.    }.    s
1f960 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1f970 28 76 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74  (v, OP_Savepoint
1f980 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d  , op, 0, 0, zNam
1f990 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  e, P4_DYNAMIC);.
1f9a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
1f9b0 65 20 73 75 72 65 20 74 68 65 20 54 45 4d 50 20  e sure the TEMP 
1f9c0 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
1f9d0 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66   and available f
1f9e0 6f 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a  or use.  Return.
1f9f0 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
1fa00 20 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20   errors.  Leave 
1fa10 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
1fa20 65 73 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  es in the pParse
1fa30 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69   structure..*/.i
1fa40 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65  nt sqlite3OpenTe
1fa50 6d 70 44 61 74 61 62 61 73 65 28 50 61 72 73 65  mpDatabase(Parse
1fa60 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
1fa70 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1fa80 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d  e->db;.  if( db-
1fa90 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26  >aDb[1].pBt==0 &
1faa0 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  & !pParse->expla
1fab0 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  in ){.    int rc
1fac0 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  ;.    Btree *pBt
1fad0 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
1fae0 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a  st int flags = .
1faf0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1fb00 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
1fb10 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
1fb20 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
1fb30 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
1fb40 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
1fb50 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c   |.          SQL
1fb60 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
1fb70 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20  NCLOSE |.       
1fb80 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
1fb90 45 4d 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20  EMP_DB;..    rc 
1fba0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  = sqlite3BtreeOp
1fbb0 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20  en(db->pVfs, 0, 
1fbc0 64 62 2c 20 26 70 42 74 2c 20 30 2c 20 66 6c 61  db, &pBt, 0, fla
1fbd0 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  gs);.    if( rc!
1fbe0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1fbf0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1fc00 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61  Msg(pParse, "una
1fc10 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  ble to open a te
1fc20 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
1fc30 20 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65   ".        "file
1fc40 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d   for storing tem
1fc50 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b  porary tables");
1fc60 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
1fc70 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65  c = rc;.      re
1fc80 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1fc90 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74    db->aDb[1].pBt
1fca0 20 3d 20 70 42 74 3b 0a 20 20 20 20 61 73 73 65   = pBt;.    asse
1fcb0 72 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  rt( db->aDb[1].p
1fcc0 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66  Schema );.    if
1fcd0 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d  ( SQLITE_NOMEM==
1fce0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
1fcf0 61 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d  ageSize(pBt, db-
1fd00 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 20 2d  >nextPagesize, -
1fd10 31 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 64  1, 0) ){.      d
1fd20 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1fd30 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 1;.      retur
1fd40 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
1fd50 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1fd60 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66  .** Record the f
1fd70 61 63 74 20 74 68 61 74 20 74 68 65 20 73 63 68  act that the sch
1fd80 65 6d 61 20 63 6f 6f 6b 69 65 20 77 69 6c 6c 20  ema cookie will 
1fd90 6e 65 65 64 20 74 6f 20 62 65 20 76 65 72 69 66  need to be verif
1fda0 69 65 64 0a 2a 2a 20 66 6f 72 20 64 61 74 61 62  ied.** for datab
1fdb0 61 73 65 20 69 44 62 2e 20 20 54 68 65 20 63 6f  ase iDb.  The co
1fdc0 64 65 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 76  de to actually v
1fdd0 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61  erify the schema
1fde0 20 63 6f 6f 6b 69 65 0a 2a 2a 20 77 69 6c 6c 20   cookie.** will 
1fdf0 6f 63 63 75 72 20 61 74 20 74 68 65 20 65 6e 64  occur at the end
1fe00 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65   of the top-leve
1fe10 6c 20 56 44 42 45 20 61 6e 64 20 77 69 6c 6c 20  l VDBE and will 
1fe20 62 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  be generated.** 
1fe30 6c 61 74 65 72 2c 20 62 79 20 73 71 6c 69 74 65  later, by sqlite
1fe40 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
1fe50 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1fe60 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
1fe70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1fe80 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73  int iDb){.  Pars
1fe90 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
1fea0 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
1feb0 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73  vel(pParse);.  s
1fec0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 54 6f  qlite3 *db = pTo
1fed0 70 6c 65 76 65 6c 2d 3e 64 62 3b 0a 0a 20 20 61  plevel->db;..  a
1fee0 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
1fef0 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
1ff00 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
1ff10 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c  b[iDb].pBt!=0 ||
1ff20 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 61 73 73   iDb==1 );.  ass
1ff30 65 72 74 28 20 69 44 62 3c 53 51 4c 49 54 45 5f  ert( iDb<SQLITE_
1ff40 4d 41 58 5f 41 54 54 41 43 48 45 44 2b 32 20 29  MAX_ATTACHED+2 )
1ff50 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1ff60 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
1ff70 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
1ff80 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 54 65  ;.  if( DbMaskTe
1ff90 73 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f  st(pToplevel->co
1ffa0 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d  okieMask, iDb)==
1ffb0 30 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53  0 ){.    DbMaskS
1ffc0 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f  et(pToplevel->co
1ffd0 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a  okieMask, iDb);.
1ffe0 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63      pToplevel->c
1fff0 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 20  ookieValue[iDb] 
20000 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
20010 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63  Schema->schema_c
20020 6f 6f 6b 69 65 3b 0a 20 20 20 20 69 66 28 20 21  ookie;.    if( !
20030 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
20040 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  Db==1 ){.      s
20050 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61  qlite3OpenTempDa
20060 74 61 62 61 73 65 28 70 54 6f 70 6c 65 76 65 6c  tabase(pToplevel
20070 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
20080 2f 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  /*.** If argumen
20090 74 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 74  t zDb is NULL, t
200a0 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  hen call sqlite3
200b0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
200c0 28 29 20 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20  () for each .** 
200d0 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
200e0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 6e  e. Otherwise, in
200f0 76 6f 6b 65 20 69 74 20 66 6f 72 20 74 68 65 20  voke it for the 
20100 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20 7a  database named z
20110 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  Db only..*/.void
20120 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
20130 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 50 61  fyNamedSchema(Pa
20140 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
20150 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20  st char *zDb){. 
20160 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
20170 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
20180 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
20190 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
201a0 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
201b0 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
201c0 66 28 20 70 44 62 2d 3e 70 42 74 20 26 26 20 28  f( pDb->pBt && (
201d0 21 7a 44 62 20 7c 7c 20 30 3d 3d 73 71 6c 69 74  !zDb || 0==sqlit
201e0 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 70  e3StrICmp(zDb, p
201f0 44 62 2d 3e 7a 4e 61 6d 65 29 29 20 29 7b 0a 20  Db->zName)) ){. 
20200 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
20210 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
20220 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  rse, i);.    }. 
20230 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
20240 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rate VDBE code t
20250 68 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72  hat prepares for
20260 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74   doing an operat
20270 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  ion that.** migh
20280 74 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74  t change the dat
20290 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abase..**.** Thi
202a0 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73  s routine starts
202b0 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
202c0 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  on if we are not
202d0 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a   already within.
202e0 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
202f0 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72  .  If we are alr
20300 65 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72  eady within a tr
20310 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
20320 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20  a checkpoint.** 
20330 69 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65  is set if the se
20340 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d  tStatement param
20350 65 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41  eter is true.  A
20360 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75   checkpoint shou
20370 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72  ld.** be set for
20380 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74   operations that
20390 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65   might fail (due
203a0 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   to a constraint
203b0 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  ) part of.** the
203c0 20 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64   way through and
203d0 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64   which will need
203e0 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72   to undo some wr
203f0 69 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76  ites without hav
20400 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61  ing to.** rollba
20410 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61  ck the whole tra
20420 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f  nsaction.  For o
20430 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20  perations where 
20440 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  all constraints.
20450 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65  ** can be checke
20460 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  d before any cha
20470 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
20480 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
20490 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65  t is never.** ne
204a0 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20  cessary to undo 
204b0 61 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20  a write and the 
204c0 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
204d0 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f  d not be set..*/
204e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67  .void sqlite3Beg
204f0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
20500 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
20510 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74  int setStatement
20520 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61  , int iDb){.  Pa
20530 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
20540 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
20550 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
20560 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
20570 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
20580 20 69 44 62 29 3b 0a 20 20 44 62 4d 61 73 6b 53   iDb);.  DbMaskS
20590 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72  et(pToplevel->wr
205a0 69 74 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20  iteMask, iDb);. 
205b0 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75   pToplevel->isMu
205c0 6c 74 69 57 72 69 74 65 20 7c 3d 20 73 65 74 53  ltiWrite |= setS
205d0 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a  tatement;.}../*.
205e0 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74  ** Indicate that
205f0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63   the statement c
20600 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
20610 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6d 69 67 68  onstruction migh
20620 74 20 77 72 69 74 65 0a 2a 2a 20 6d 6f 72 65 20  t write.** more 
20630 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72 79 20 28  than one entry (
20640 65 78 61 6d 70 6c 65 3a 20 64 65 6c 65 74 69 6e  example: deletin
20650 67 20 6f 6e 65 20 72 6f 77 20 74 68 65 6e 20 69  g one row then i
20660 6e 73 65 72 74 69 6e 67 20 61 6e 6f 74 68 65 72  nserting another
20670 2c 0a 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 6d  ,.** inserting m
20680 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 69 6e 20  ultiple rows in 
20690 61 20 74 61 62 6c 65 2c 20 6f 72 20 69 6e 73 65  a table, or inse
206a0 72 74 69 6e 67 20 61 20 72 6f 77 20 61 6e 64 20  rting a row and 
206b0 69 6e 64 65 78 20 65 6e 74 72 69 65 73 2e 29 0a  index entries.).
206c0 2a 2a 20 49 66 20 61 6e 20 61 62 6f 72 74 20 6f  ** If an abort o
206d0 63 63 75 72 73 20 61 66 74 65 72 20 73 6f 6d 65  ccurs after some
206e0 20 6f 66 20 74 68 65 73 65 20 77 72 69 74 65 73   of these writes
206f0 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65 64 2c   have completed,
20700 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a   then it will.**
20710 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
20720 20 75 6e 64 6f 20 74 68 65 20 63 6f 6d 70 6c 65   undo the comple
20730 74 65 64 20 77 72 69 74 65 73 2e 0a 2a 2f 0a 76  ted writes..*/.v
20740 6f 69 64 20 73 71 6c 69 74 65 33 4d 75 6c 74 69  oid sqlite3Multi
20750 57 72 69 74 65 28 50 61 72 73 65 20 2a 70 50 61  Write(Parse *pPa
20760 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  rse){.  Parse *p
20770 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
20780 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
20790 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c  pParse);.  pTopl
207a0 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69  evel->isMultiWri
207b0 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  te = 1;.}../* .*
207c0 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
207d0 61 74 6f 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ator calls this 
207e0 72 6f 75 74 69 6e 65 20 69 66 20 69 73 20 64 69  routine if is di
207f0 73 63 6f 76 65 72 73 20 74 68 61 74 20 69 74 20  scovers that it 
20800 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74  is.** possible t
20810 6f 20 61 62 6f 72 74 20 61 20 73 74 61 74 65 6d  o abort a statem
20820 65 6e 74 20 70 72 69 6f 72 20 74 6f 20 63 6f 6d  ent prior to com
20830 70 6c 65 74 69 6f 6e 2e 20 20 49 6e 20 6f 72 64  pletion.  In ord
20840 65 72 20 74 6f 20 0a 2a 2a 20 70 65 72 66 6f 72  er to .** perfor
20850 6d 20 74 68 69 73 20 61 62 6f 72 74 20 77 69 74  m this abort wit
20860 68 6f 75 74 20 63 6f 72 72 75 70 74 69 6e 67 20  hout corrupting 
20870 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 77 65  the database, we
20880 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a   need to make.**
20890 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73   sure that the s
208a0 74 61 74 65 6d 65 6e 74 20 69 73 20 70 72 6f 74  tatement is prot
208b0 65 63 74 65 64 20 62 79 20 61 20 73 74 61 74 65  ected by a state
208c0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
208d0 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69 63 61  ..**.** Technica
208e0 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65  lly, we only nee
208f0 64 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 79  d to set the may
20900 41 62 6f 72 74 20 66 6c 61 67 20 69 66 20 74 68  Abort flag if th
20910 65 0a 2a 2a 20 69 73 4d 75 6c 74 69 57 72 69 74  e.** isMultiWrit
20920 65 20 66 6c 61 67 20 77 61 73 20 70 72 65 76 69  e flag was previ
20930 6f 75 73 6c 79 20 73 65 74 2e 20 20 54 68 65 72  ously set.  Ther
20940 65 20 69 73 20 61 20 74 69 6d 65 20 64 65 70 65  e is a time depe
20950 6e 64 65 6e 63 79 0a 2a 2a 20 73 75 63 68 20 74  ndency.** such t
20960 68 61 74 20 74 68 65 20 61 62 6f 72 74 20 6d 75  hat the abort mu
20970 73 74 20 6f 63 63 75 72 20 61 66 74 65 72 20 74  st occur after t
20980 68 65 20 6d 75 6c 74 69 77 72 69 74 65 2e 20 20  he multiwrite.  
20990 54 68 69 73 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f  This makes.** so
209a0 6d 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  me statements in
209b0 76 6f 6c 76 69 6e 67 20 74 68 65 20 52 45 50 4c  volving the REPL
209c0 41 43 45 20 63 6f 6e 66 6c 69 63 74 20 72 65 73  ACE conflict res
209d0 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
209e0 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69 74 74 6c 65  m.** go a little
209f0 20 66 61 73 74 65 72 2e 20 20 42 75 74 20 74 61   faster.  But ta
20a00 6b 69 6e 67 20 61 64 76 61 6e 74 61 67 65 20 6f  king advantage o
20a10 66 20 74 68 69 73 20 74 69 6d 65 20 64 65 70 65  f this time depe
20a20 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73 20  ndency.** makes 
20a30 69 74 20 6d 6f 72 65 20 64 69 66 66 69 63 75 6c  it more difficul
20a40 74 20 74 6f 20 70 72 6f 76 65 20 74 68 61 74 20  t to prove that 
20a50 74 68 65 20 63 6f 64 65 20 69 73 20 63 6f 72 72  the code is corr
20a60 65 63 74 20 28 69 6e 20 0a 2a 2a 20 70 61 72 74  ect (in .** part
20a70 69 63 75 6c 61 72 2c 20 69 74 20 70 72 65 76 65  icular, it preve
20a80 6e 74 73 20 75 73 20 66 72 6f 6d 20 77 72 69 74  nts us from writ
20a90 69 6e 67 20 61 6e 20 65 66 66 65 63 74 69 76 65  ing an effective
20aa0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
20ab0 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 41 73 73  on of sqlite3Ass
20ac0 65 72 74 4d 61 79 41 62 6f 72 74 28 29 29 20 61  ertMayAbort()) a
20ad0 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20 63 68  nd so we have ch
20ae0 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65 20  osen.** to take 
20af0 74 68 65 20 73 61 66 65 20 72 6f 75 74 65 20 61  the safe route a
20b00 6e 64 20 73 6b 69 70 20 74 68 65 20 6f 70 74 69  nd skip the opti
20b10 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  mization..*/.voi
20b20 64 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72  d sqlite3MayAbor
20b30 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  t(Parse *pParse)
20b40 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c  {.  Parse *pTopl
20b50 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
20b60 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
20b70 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c  se);.  pToplevel
20b80 2d 3e 6d 61 79 41 62 6f 72 74 20 3d 20 31 3b 0a  ->mayAbort = 1;.
20b90 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  }../*.** Code an
20ba0 20 4f 50 5f 48 61 6c 74 20 74 68 61 74 20 63 61   OP_Halt that ca
20bb0 75 73 65 73 20 74 68 65 20 76 64 62 65 20 74 6f  uses the vdbe to
20bc0 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54   return an SQLIT
20bd0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20  E_CONSTRAINT.** 
20be0 65 72 72 6f 72 2e 20 54 68 65 20 6f 6e 45 72 72  error. The onErr
20bf0 6f 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 74  or parameter det
20c00 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 28 69  ermines which (i
20c10 66 20 61 6e 79 29 20 6f 66 20 74 68 65 20 73 74  f any) of the st
20c20 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f  atement.** and/o
20c30 72 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  r current transa
20c40 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
20c50 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  back..*/.void sq
20c60 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61  lite3HaltConstra
20c70 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  int(.  Parse *pP
20c80 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
20c90 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
20ca0 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 20 20   int errCode,   
20cb0 20 20 20 2f 2a 20 65 78 74 65 6e 64 65 64 20 65     /* extended e
20cc0 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69  rror code */.  i
20cd0 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
20ce0 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74   /* Constraint t
20cf0 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  ype */.  char *p
20d00 34 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72  4,         /* Er
20d10 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20  ror message */. 
20d20 20 69 38 20 70 34 74 79 70 65 2c 20 20 20 20 20   i8 p4type,     
20d30 20 20 20 2f 2a 20 50 34 5f 53 54 41 54 49 43 20     /* P4_STATIC 
20d40 6f 72 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 20  or P4_TRANSIENT 
20d50 2a 2f 0a 20 20 75 38 20 70 35 45 72 72 6d 73 67  */.  u8 p5Errmsg
20d60 20 20 20 20 20 20 20 2f 2a 20 50 35 5f 45 72 72         /* P5_Err
20d70 4d 73 67 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  Msg type */.){. 
20d80 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
20d90 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
20da0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 65 72  );.  assert( (er
20db0 72 43 6f 64 65 26 30 78 66 66 29 3d 3d 53 51 4c  rCode&0xff)==SQL
20dc0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29  ITE_CONSTRAINT )
20dd0 3b 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d  ;.  if( onError=
20de0 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
20df0 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
20e00 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20  (pParse);.  }.  
20e10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20e20 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 65 72  4(v, OP_Halt, er
20e30 72 43 6f 64 65 2c 20 6f 6e 45 72 72 6f 72 2c 20  rCode, onError, 
20e40 30 2c 20 70 34 2c 20 70 34 74 79 70 65 29 3b 0a  0, p4, p4type);.
20e50 20 20 69 66 28 20 70 35 45 72 72 6d 73 67 20 29    if( p5Errmsg )
20e60 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
20e70 67 65 50 35 28 76 2c 20 70 35 45 72 72 6d 73 67  geP5(v, p5Errmsg
20e80 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  );.}../*.** Code
20e90 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20   an OP_Halt due 
20ea0 74 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49  to UNIQUE or PRI
20eb0 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
20ec0 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a  int violation..*
20ed0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  /.void sqlite3Un
20ee0 69 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 0a  iqueConstraint(.
20ef0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
20f00 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
20f10 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
20f20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a  onError,      /*
20f30 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65   Constraint type
20f40 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
20f50 78 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  x       /* The i
20f60 6e 64 65 78 20 74 68 61 74 20 74 72 69 67 67 65  ndex that trigge
20f70 72 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  rs the constrain
20f80 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  t */.){.  char *
20f90 7a 45 72 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20  zErr;.  int j;. 
20fa0 20 53 74 72 41 63 63 75 6d 20 65 72 72 4d 73 67   StrAccum errMsg
20fb0 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  ;.  Table *pTab 
20fc0 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a  = pIdx->pTable;.
20fd0 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
20fe0 75 6d 49 6e 69 74 28 26 65 72 72 4d 73 67 2c 20  umInit(&errMsg, 
20ff0 70 50 61 72 73 65 2d 3e 64 62 2c 20 30 2c 20 30  pParse->db, 0, 0
21000 2c 20 32 30 30 29 3b 0a 20 20 66 6f 72 28 6a 3d  , 200);.  for(j=
21010 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  0; j<pIdx->nKeyC
21020 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 63 68  ol; j++){.    ch
21030 61 72 20 2a 7a 43 6f 6c 20 3d 20 70 54 61 62 2d  ar *zCol = pTab-
21040 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f  >aCol[pIdx->aiCo
21050 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a  lumn[j]].zName;.
21060 20 20 20 20 69 66 28 20 6a 20 29 20 73 71 6c 69      if( j ) sqli
21070 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
21080 64 28 26 65 72 72 4d 73 67 2c 20 22 2c 20 22 2c  d(&errMsg, ", ",
21090 20 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   2);.    sqlite3
210a0 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c  StrAccumAppendAl
210b0 6c 28 26 65 72 72 4d 73 67 2c 20 70 54 61 62 2d  l(&errMsg, pTab-
210c0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
210d0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
210e0 6e 64 28 26 65 72 72 4d 73 67 2c 20 22 2e 22 2c  nd(&errMsg, ".",
210f0 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
21100 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c  StrAccumAppendAl
21110 6c 28 26 65 72 72 4d 73 67 2c 20 7a 43 6f 6c 29  l(&errMsg, zCol)
21120 3b 0a 20 20 7d 0a 20 20 7a 45 72 72 20 3d 20 73  ;.  }.  zErr = s
21130 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69  qlite3StrAccumFi
21140 6e 69 73 68 28 26 65 72 72 4d 73 67 29 3b 0a 20  nish(&errMsg);. 
21150 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73   sqlite3HaltCons
21160 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 0a  traint(pParse, .
21170 20 20 20 20 49 73 50 72 69 6d 61 72 79 4b 65 79      IsPrimaryKey
21180 49 6e 64 65 78 28 70 49 64 78 29 20 3f 20 53 51  Index(pIdx) ? SQ
21190 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
211a0 50 52 49 4d 41 52 59 4b 45 59 20 0a 20 20 20 20  PRIMARYKEY .    
211b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211c0 20 20 20 20 20 20 20 20 3a 20 53 51 4c 49 54 45          : SQLITE
211d0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51  _CONSTRAINT_UNIQ
211e0 55 45 2c 0a 20 20 20 20 6f 6e 45 72 72 6f 72 2c  UE,.    onError,
211f0 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49   zErr, P4_DYNAMI
21200 43 2c 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74  C, P5_Constraint
21210 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  Unique);.}.../*.
21220 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61  ** Code an OP_Ha
21230 6c 74 20 64 75 65 20 74 6f 20 6e 6f 6e 2d 75 6e  lt due to non-un
21240 69 71 75 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76  ique rowid..*/.v
21250 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 77 69 64  oid sqlite3Rowid
21260 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61  Constraint(.  Pa
21270 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
21280 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
21290 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  xt */.  int onEr
212a0 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e  ror,      /* Con
212b0 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
212c0 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20   algorithm */.  
212d0 54 61 62 6c 65 20 2a 70 54 61 62 20 20 20 20 20  Table *pTab     
212e0 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 77    /* The table w
212f0 69 74 68 20 74 68 65 20 6e 6f 6e 2d 75 6e 69 71  ith the non-uniq
21300 75 65 20 72 6f 77 69 64 20 2a 2f 20 0a 29 7b 0a  ue rowid */ .){.
21310 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20    char *zMsg;.  
21320 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 54  int rc;.  if( pT
21330 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a  ab->iPKey>=0 ){.
21340 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
21350 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65  e3MPrintf(pParse
21360 2d 3e 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70  ->db, "%s.%s", p
21370 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
21380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21390 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
213a0 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e  [pTab->iPKey].zN
213b0 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  ame);.    rc = S
213c0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
213d0 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20 7d  _PRIMARYKEY;.  }
213e0 65 6c 73 65 7b 0a 20 20 20 20 7a 4d 73 67 20 3d  else{.    zMsg =
213f0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
21400 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e  pParse->db, "%s.
21410 72 6f 77 69 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  rowid", pTab->zN
21420 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  ame);.    rc = S
21430 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
21440 5f 52 4f 57 49 44 3b 0a 20 20 7d 0a 20 20 73 71  _ROWID;.  }.  sq
21450 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61  lite3HaltConstra
21460 69 6e 74 28 70 50 61 72 73 65 2c 20 72 63 2c 20  int(pParse, rc, 
21470 6f 6e 45 72 72 6f 72 2c 20 7a 4d 73 67 2c 20 50  onError, zMsg, P
21480 34 5f 44 59 4e 41 4d 49 43 2c 0a 20 20 20 20 20  4_DYNAMIC,.     
21490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214a0 20 20 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74     P5_Constraint
214b0 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Unique);.}../*.*
214c0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
214d0 66 20 70 49 6e 64 65 78 20 75 73 65 73 20 74 68  f pIndex uses th
214e0 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
214f0 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74  ence pColl.  Ret
21500 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69  urn.** true if i
21510 74 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65  t does and false
21520 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   if it does not.
21530 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
21540 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
21550 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61  static int colla
21560 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20  tionMatch(const 
21570 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64  char *zColl, Ind
21580 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69  ex *pIndex){.  i
21590 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
215a0 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 66 6f  zColl!=0 );.  fo
215b0 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d  r(i=0; i<pIndex-
215c0 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
215d0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
215e0 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  z = pIndex->azCo
215f0 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72  ll[i];.    asser
21600 74 28 20 7a 21 3d 30 20 7c 7c 20 70 49 6e 64 65  t( z!=0 || pInde
21610 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 30  x->aiColumn[i]<0
21620 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64   );.    if( pInd
21630 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e  ex->aiColumn[i]>
21640 3d 30 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  =0 && 0==sqlite3
21650 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c  StrICmp(z, zColl
21660 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
21670 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
21680 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
21690 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d  dif../*.** Recom
216a0 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
216b0 20 6f 66 20 70 54 61 62 20 74 68 61 74 20 75 73   of pTab that us
216c0 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  e the collating 
216d0 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a  sequence pColl..
216e0 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74  ** If pColl==0 t
216f0 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c  hen recompute al
21700 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61  l indices of pTa
21710 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  b..*/.#ifndef SQ
21720 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
21730 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  X.static void re
21740 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72 73 65  indexTable(Parse
21750 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
21760 2a 70 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73  *pTab, char cons
21770 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64  t *zColl){.  Ind
21780 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
21790 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
217a0 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
217b0 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20  with pTab */..  
217c0 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d  for(pIndex=pTab-
217d0 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b  >pIndex; pIndex;
217e0 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e   pIndex=pIndex->
217f0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
21800 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c  zColl==0 || coll
21810 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c  ationMatch(zColl
21820 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20  , pIndex) ){.   
21830 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
21840 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
21850 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
21860 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
21870 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
21880 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
21890 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
218a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66        sqlite3Ref
218b0 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
218c0 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20   pIndex, -1);.  
218d0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
218e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74  ../*.** Recomput
218f0 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
21900 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61   all tables in a
21910 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77 68 65  ll databases whe
21920 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65  re the.** indice
21930 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  s use the collat
21940 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
21950 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30  ll.  If pColl==0
21960 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a   then recompute.
21970 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65  ** all indices e
21980 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69  verywhere..*/.#i
21990 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
219a0 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
219b0 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74   void reindexDat
219c0 61 62 61 73 65 73 28 50 61 72 73 65 20 2a 70 50  abases(Parse *pP
219d0 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74  arse, char const
219e0 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a   *zColl){.  Db *
219f0 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
21a00 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
21a10 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  gle database */.
21a20 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
21a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21a40 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   The database in
21a50 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
21a60 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
21a70 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54  arse->db;   /* T
21a80 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
21a90 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68  ection */.  Hash
21aa0 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20  Elem *k;        
21ab0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
21ac0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
21ad0 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54  es in pDb */.  T
21ae0 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
21af0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
21b00 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
21b10 61 62 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65  abase */..  asse
21b20 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
21b30 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28  HoldsAllMutexes(
21b40 64 62 29 20 29 3b 20 20 2f 2a 20 4e 65 65 64 65  db) );  /* Neede
21b50 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63  d for schema acc
21b60 65 73 73 20 2a 2f 0a 20 20 66 6f 72 28 69 44 62  ess */.  for(iDb
21b70 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b  =0, pDb=db->aDb;
21b80 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44   iDb<db->nDb; iD
21b90 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20  b++, pDb++){.   
21ba0 20 61 73 73 65 72 74 28 20 70 44 62 21 3d 30 20   assert( pDb!=0 
21bb0 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c  );.    for(k=sql
21bc0 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44  iteHashFirst(&pD
21bd0 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  b->pSchema->tblH
21be0 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69  ash);  k; k=sqli
21bf0 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a  teHashNext(k)){.
21c00 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61        pTab = (Ta
21c10 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ble*)sqliteHashD
21c20 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65  ata(k);.      re
21c30 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73  indexTable(pPars
21c40 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b  e, pTab, zColl);
21c50 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
21c60 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
21c70 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
21c80 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64   REINDEX command
21c90 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52  ..**.**        R
21ca0 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20  EINDEX          
21cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cc0 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20    -- 1.**       
21cd0 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61   REINDEX  <colla
21ce0 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20  tion>           
21cf0 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20      -- 2.**     
21d00 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61     REINDEX  ?<da
21d10 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e  tabase>.?<tablen
21d20 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20  ame>  -- 3.**   
21d30 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c       REINDEX  ?<
21d40 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65  database>.?<inde
21d50 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a  xname>  -- 4.**.
21d60 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73  ** Form 1 causes
21d70 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20   all indices in 
21d80 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
21d90 61 62 61 73 65 73 20 74 6f 20 62 65 20 72 65 62  abases to be reb
21da0 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20  uilt..** Form 2 
21db0 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64  rebuilds all ind
21dc0 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61  ices in all data
21dd0 62 61 73 65 73 20 74 68 61 74 20 75 73 65 20 74  bases that use t
21de0 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c  he named.** coll
21df0 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20  ating function. 
21e00 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72   Forms 3 and 4 r
21e10 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64  ebuild the named
21e20 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a   index or all.**
21e30 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
21e40 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ted with the nam
21e50 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66  ed table..*/.#if
21e60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
21e70 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71  _REINDEX.void sq
21e80 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50 61 72  lite3Reindex(Par
21e90 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
21ea0 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e  n *pName1, Token
21eb0 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c   *pName2){.  Col
21ec0 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
21ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
21ee0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
21ef0 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20  o be reindexed, 
21f00 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61  or NULL */.  cha
21f10 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20  r *z;           
21f20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
21f30 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69   of a table or i
21f40 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndex */.  const 
21f50 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20  char *zDb;      
21f60 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
21f70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
21f80 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
21f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21fa0 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65  * A table in the
21fb0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49   database */.  I
21fc0 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
21fd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
21fe0 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
21ff0 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20  d with pTab */. 
22000 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
22010 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22020 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64  The database ind
22030 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  ex number */.  s
22040 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
22050 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68  rse->db;   /* Th
22060 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
22070 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ction */.  Token
22080 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20   *pObjName;     
22090 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
220a0 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  f the table or i
220b0 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64  ndex to be reind
220c0 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65  exed */..  /* Re
220d0 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
220e0 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72  schema. If an er
220f0 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76  ror occurs, leav
22100 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
22110 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65  ge.  ** and code
22120 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
22130 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  eturn NULL. */. 
22140 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
22150 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
22160 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
22170 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
22180 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b  if( pName1==0 ){
22190 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61  .    reindexData
221a0 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 30 29  bases(pParse, 0)
221b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
221c0 7d 65 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28  }else if( NEVER(
221d0 70 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 70 4e  pName2==0) || pN
221e0 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  ame2->z==0 ){.  
221f0 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20    char *zColl;. 
22200 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
22210 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c  1->z );.    zCol
22220 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
22230 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
22240 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  >db, pName1);.  
22250 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72    if( !zColl ) r
22260 65 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c  eturn;.    pColl
22270 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
22280 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62  llSeq(db, ENC(db
22290 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20  ), zColl, 0);.  
222a0 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
222b0 20 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61       reindexData
222c0 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43  bases(pParse, zC
222d0 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oll);.      sqli
222e0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
222f0 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oll);.      retu
22300 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  rn;.    }.    sq
22310 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
22320 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44  zColl);.  }.  iD
22330 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
22340 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
22350 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
22360 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  pObjName);.  if(
22370 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b   iDb<0 ) return;
22380 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61  .  z = sqlite3Na
22390 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
223a0 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  pObjName);.  if(
223b0 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
223c0 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b    zDb = db->aDb[
223d0 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54  iDb].zName;.  pT
223e0 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
223f0 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62  Table(db, z, zDb
22400 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b  );.  if( pTab ){
22410 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c  .    reindexTabl
22420 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
22430 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  0);.    sqlite3D
22440 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20  bFree(db, z);.  
22450 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
22460 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
22470 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c  FindIndex(db, z,
22480 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   zDb);.  sqlite3
22490 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
224a0 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20   if( pIndex ){. 
224b0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
224c0 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
224d0 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
224e0 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
224f0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
22500 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72  ndex, -1);.    r
22510 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
22520 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
22530 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  rse, "unable to 
22540 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a  identify the obj
22550 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65  ect to be reinde
22560 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  xed");.}.#endif.
22570 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
22580 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
22590 65 20 74 68 61 74 20 69 73 20 61 70 70 72 6f 70  e that is approp
225a0 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69  riate for the gi
225b0 76 65 6e 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  ven Index..**.**
225c0 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   The KeyInfo str
225d0 75 63 74 75 72 65 20 66 6f 72 20 61 6e 20 69 6e  ucture for an in
225e0 64 65 78 20 69 73 20 63 61 63 68 65 64 20 69 6e  dex is cached in
225f0 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63   the Index objec
22600 74 2e 0a 2a 2a 20 53 6f 20 74 68 65 72 65 20 6d  t..** So there m
22610 69 67 68 74 20 62 65 20 6d 75 6c 74 69 70 6c 65  ight be multiple
22620 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
22630 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e  he returned poin
22640 74 65 72 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c  ter.  The.** cal
22650 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 74  ler should not t
22660 72 79 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  ry to modify the
22670 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 2e   KeyInfo object.
22680 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
22690 72 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20  r should invoke 
226a0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
226b0 72 65 66 28 29 20 6f 6e 20 74 68 65 20 72 65 74  ref() on the ret
226c0 75 72 6e 65 64 20 6f 62 6a 65 63 74 0a 2a 2a 20  urned object.** 
226d0 77 68 65 6e 20 69 74 20 68 61 73 20 66 69 6e 69  when it has fini
226e0 73 68 65 64 20 75 73 69 6e 67 20 69 74 2e 0a 2a  shed using it..*
226f0 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74  /.KeyInfo *sqlit
22700 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78  e3KeyInfoOfIndex
22710 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
22720 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
22730 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f  int i;.  int nCo
22740 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  l = pIdx->nColum
22750 6e 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20  n;.  int nKey = 
22760 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20  pIdx->nKeyCol;. 
22770 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a   KeyInfo *pKey;.
22780 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
22790 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  rr ) return 0;. 
227a0 20 69 66 28 20 70 49 64 78 2d 3e 75 6e 69 71 4e   if( pIdx->uniqN
227b0 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 70 4b  otNull ){.    pK
227c0 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  ey = sqlite3KeyI
227d0 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  nfoAlloc(pParse-
227e0 3e 64 62 2c 20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d  >db, nKey, nCol-
227f0 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nKey);.  }else{.
22800 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74      pKey = sqlit
22810 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70  e3KeyInfoAlloc(p
22820 50 61 72 73 65 2d 3e 64 62 2c 20 6e 43 6f 6c 2c  Parse->db, nCol,
22830 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   0);.  }.  if( p
22840 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Key ){.    asser
22850 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
22860 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65  oIsWriteable(pKe
22870 79 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  y) );.    for(i=
22880 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
22890 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  .      char *zCo
228a0 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ll = pIdx->azCol
228b0 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  l[i];.      asse
228c0 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a  rt( zColl!=0 );.
228d0 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c        pKey->aCol
228e0 6c 5b 69 5d 20 3d 20 73 74 72 63 6d 70 28 7a 43  l[i] = strcmp(zC
228f0 6f 6c 6c 2c 22 42 49 4e 41 52 59 22 29 3d 3d 30  oll,"BINARY")==0
22900 20 3f 20 30 20 3a 0a 20 20 20 20 20 20 20 20 20   ? 0 :.         
22910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
22920 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
22930 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
22940 6c 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e  l);.      pKey->
22950 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
22960 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
22970 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  [i];.    }.    i
22980 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
22990 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
229a0 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65  KeyInfoUnref(pKe
229b0 79 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 20 3d  y);.      pKey =
229c0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
229d0 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a 0a  return pKey;.}..
229e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
229f0 4d 49 54 5f 43 54 45 0a 2f 2a 20 0a 2a 2a 20 54  MIT_CTE./* .** T
22a00 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69  his routine is i
22a10 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 70 65 72 20  nvoked once per 
22a20 43 54 45 20 62 79 20 74 68 65 20 70 61 72 73 65  CTE by the parse
22a30 72 20 77 68 69 6c 65 20 70 61 72 73 69 6e 67 20  r while parsing 
22a40 61 20 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73  a .** WITH claus
22a50 65 2e 20 0a 2a 2f 0a 57 69 74 68 20 2a 73 71 6c  e. .*/.With *sql
22a60 69 74 65 33 57 69 74 68 41 64 64 28 0a 20 20 50  ite3WithAdd(.  P
22a70 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
22a80 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
22a90 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
22aa0 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20  ith *pWith,     
22ab0 20 20 20 20 20 20 20 2f 2a 20 45 78 69 73 74 69         /* Existi
22ac0 6e 67 20 57 49 54 48 20 63 6c 61 75 73 65 2c 20  ng WITH clause, 
22ad0 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b  or NULL */.  Tok
22ae0 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20  en *pName,      
22af0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
22b00 74 68 65 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65  the common-table
22b10 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
22b20 70 41 72 67 6c 69 73 74 2c 20 20 20 20 20 2f 2a  pArglist,     /*
22b30 20 4f 70 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e   Optional column
22b40 20 6e 61 6d 65 20 6c 69 73 74 20 66 6f 72 20 74   name list for t
22b50 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65  he table */.  Se
22b60 6c 65 63 74 20 2a 70 51 75 65 72 79 20 20 20 20  lect *pQuery    
22b70 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 75        /* Query u
22b80 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  sed to initializ
22b90 65 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29  e the table */.)
22ba0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
22bb0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
22bc0 57 69 74 68 20 2a 70 4e 65 77 3b 0a 20 20 63 68  With *pNew;.  ch
22bd0 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a  ar *zName;..  /*
22be0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
22bf0 43 54 45 20 6e 61 6d 65 20 69 73 20 75 6e 69 71  CTE name is uniq
22c00 75 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 57  ue within this W
22c10 49 54 48 20 63 6c 61 75 73 65 2e 20 49 66 0a 20  ITH clause. If. 
22c20 20 2a 2a 20 6e 6f 74 2c 20 73 74 6f 72 65 20 61   ** not, store a
22c30 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 50  n error in the P
22c40 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  arse structure. 
22c50 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  */.  zName = sql
22c60 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
22c70 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e  n(pParse->db, pN
22c80 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
22c90 65 20 26 26 20 70 57 69 74 68 20 29 7b 0a 20 20  e && pWith ){.  
22ca0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
22cb0 28 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e  (i=0; i<pWith->n
22cc0 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cte; i++){.     
22cd0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
22ce0 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 57 69 74 68  Cmp(zName, pWith
22cf0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
22d00 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
22d10 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
22d20 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20 57  se, "duplicate W
22d30 49 54 48 20 74 61 62 6c 65 20 6e 61 6d 65 3a 20  ITH table name: 
22d40 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
22d50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
22d60 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20    if( pWith ){. 
22d70 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73     int nByte = s
22d80 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 20 2b 20  izeof(*pWith) + 
22d90 28 73 69 7a 65 6f 66 28 70 57 69 74 68 2d 3e 61  (sizeof(pWith->a
22da0 5b 31 5d 29 20 2a 20 70 57 69 74 68 2d 3e 6e 43  [1]) * pWith->nC
22db0 74 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  te);.    pNew = 
22dc0 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
22dd0 28 64 62 2c 20 70 57 69 74 68 2c 20 6e 42 79 74  (db, pWith, nByt
22de0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
22df0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
22e00 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
22e10 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 29 3b  sizeof(*pWith));
22e20 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a  .  }.  assert( z
22e30 4e 61 6d 65 21 3d 30 20 7c 7c 20 70 4e 65 77 3d  Name!=0 || pNew=
22e40 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
22e50 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
22e60 3d 3d 30 20 7c 7c 20 70 4e 65 77 3d 3d 30 20 29  ==0 || pNew==0 )
22e70 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  ;..  if( pNew==0
22e80 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
22e90 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
22ea0 2c 20 70 41 72 67 6c 69 73 74 29 3b 0a 20 20 20  , pArglist);.   
22eb0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
22ec0 6c 65 74 65 28 64 62 2c 20 70 51 75 65 72 79 29  lete(db, pQuery)
22ed0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
22ee0 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
22ef0 20 20 20 20 70 4e 65 77 20 3d 20 70 57 69 74 68      pNew = pWith
22f00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
22f10 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74  New->a[pNew->nCt
22f20 65 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70 51 75  e].pSelect = pQu
22f30 65 72 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ery;.    pNew->a
22f40 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 43 6f  [pNew->nCte].pCo
22f50 6c 73 20 3d 20 70 41 72 67 6c 69 73 74 3b 0a 20  ls = pArglist;. 
22f60 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
22f70 3e 6e 43 74 65 5d 2e 7a 4e 61 6d 65 20 3d 20 7a  >nCte].zName = z
22f80 4e 61 6d 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Name;.    pNew->
22f90 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 45  a[pNew->nCte].zE
22fa0 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  rr = 0;.    pNew
22fb0 2d 3e 6e 43 74 65 2b 2b 3b 0a 20 20 7d 0a 0a 20  ->nCte++;.  }.. 
22fc0 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
22fd0 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
22fe0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
22ff0 57 69 74 68 20 6f 62 6a 65 63 74 20 70 61 73 73  With object pass
23000 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
23010 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f   argument..*/.vo
23020 69 64 20 73 71 6c 69 74 65 33 57 69 74 68 44 65  id sqlite3WithDe
23030 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
23040 2c 20 57 69 74 68 20 2a 70 57 69 74 68 29 7b 0a  , With *pWith){.
23050 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20    if( pWith ){. 
23060 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
23070 72 28 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e  r(i=0; i<pWith->
23080 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCte; i++){.    
23090 20 20 73 74 72 75 63 74 20 43 74 65 20 2a 70 43    struct Cte *pC
230a0 74 65 20 3d 20 26 70 57 69 74 68 2d 3e 61 5b 69  te = &pWith->a[i
230b0 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ];.      sqlite3
230c0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
230d0 62 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 29 3b  b, pCte->pCols);
230e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
230f0 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
23100 43 74 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  Cte->pSelect);. 
23110 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
23120 65 65 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61  ee(db, pCte->zNa
23130 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  me);.    }.    s
23140 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
23150 20 70 57 69 74 68 29 3b 0a 20 20 7d 0a 7d 0a 23   pWith);.  }.}.#
23160 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
23170 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  d(SQLITE_OMIT_CT
23180 45 29 20 2a 2f 0a                                E) */.